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..fd88b924066 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,8 +1,11 @@ # CONTRIBUTING ## Reporting Issues +If you ever encounter a bug in-game, the best way to let a coder know about it is with our GitHub Issue Tracker. Please make sure you use the supplied issue template, and include the round ID for the server. -See [this page](http://tgstation13.org/wiki/Reporting_Issues) for a guide and format to issue reports. +(If you don't have an account, making a new one takes only one minute.) + +If you have difficulty, ask for help in the #coding-general channel on our discord. ## Introduction @@ -20,24 +23,14 @@ We have a [list of guides on the wiki](http://www.tgstation13.org/wiki/index.php There is an open list of approachable issues for [your inspiration here](https://github.com/tgstation/-tg-station/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Issue%22). -You can of course, as always, ask for help at [#coderbus](irc://irc.rizon.net/coderbus) on irc.rizon.net. We're just here to have fun and help out, so please don't expect professional support. +You can of course, as always, ask for help on the discord channels, or the forums, We're just here to have fun and help out, so please don't expect professional support. ## Meet the Team -**Design Lead** - -The Design Lead has the final say on what gameplay changes get into and out of the game. He or she has full veto power on any feature or balance additions, changes, or removals, and establishes a general, personally-preferred direction for the game. - **Headcoder** The Headcoder is responsible for controlling, adding, and removing maintainers from the project. In addition to filling the role of a normal maintainer, they have sole authority on who becomes a maintainer, as well as who remains a maintainer and who does not. -**Art Director** - -The Art Director controls sprites and aesthetic that get into the game. While sprites for brand-new additions are generally accepted regardless of quality, modified current art assets fall to the Art Director, who can decide whether or not a sprite tweak is both merited and a suitable replacement. - -They also control the general "perspective" of the game - how sprites should generally look, especially the angle from which they're viewed. An example of this is the [3/4 perspective](http://static.tvtropes.org/pmwiki/pub/images/kakarikovillage.gif), which is a bird's eye view from above the object being viewed. - **Maintainers** Maintainers are quality control. If a proposed pull request doesn't meet the following specifications, they can request you to change it, or simply just close the pull request. Maintainers are required to give a reason for closing the pull request. @@ -258,11 +251,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 +336,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 +373,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. @@ -388,7 +381,7 @@ There is also an undocumented keyword called `static` that has the same behaviou There is no strict process when it comes to merging pull requests. Pull requests will sometimes take a while before they are looked at by a maintainer; the bigger the change, the more time it will take before they are accepted into the code. Every team member is a volunteer who is giving up their own time to help maintain and contribute, so please be courteous and respectful. Here are some helpful ways to make it easier for you and for the maintainers when making a pull request. -* Make sure your pull request complies to the requirements outlined in [this guide](http://tgstation13.org/wiki/Getting_Your_Pull_Accepted) +* Make sure your pull request complies to the requirements outlined here * You are going to be expected to document all your changes in the pull request. Failing to do so will mean delaying it as we will have to question why you made the change. On the other hand, you can speed up the process by making the pull request readable and easy to understand, with diagrams or before/after data. diff --git a/.github/DOWNLOADING.md b/.github/DOWNLOADING.md new file mode 100644 index 00000000000..283ea8b40a2 --- /dev/null +++ b/.github/DOWNLOADING.md @@ -0,0 +1,21 @@ +## 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 + +Option 1: +Follow this: https://www.tgstation13.org/wiki/Setting_up_git + +Option 2: Download the source code as a zip by clicking the ZIP button in the +code tab of https://github.com/tgstation/tgstation +(note: this will use a lot of bandwidth if you wish to update and is a lot of +hassle if you want to make any changes at all, so it's not recommended.) + +Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2) + +*Warning: option 4 is out of date, and not maintained, use at your own risk* + +Option 4: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2) + +``` +docker run -d -p :1337 -v /path/to/your/config:/tgstation/config -v /path/to/your/data:/tgstation/data tgstation/tgstation +``` + diff --git a/.github/MAPS_AND_AWAY_MISSIONS.md b/.github/MAPS_AND_AWAY_MISSIONS.md new file mode 100644 index 00000000000..57539641a91 --- /dev/null +++ b/.github/MAPS_AND_AWAY_MISSIONS.md @@ -0,0 +1,28 @@ +## MAPS + +/tg/station currently comes equipped with five maps. + +* [BoxStation (default)](https://tgstation13.org/wiki/Boxstation) +* [MetaStation](https://tgstation13.org/wiki/MetaStation) +* [DeltaStation](https://tgstation13.org/wiki/DeltaStation) +* [PubbyStation](https://tgstation13.org/wiki/PubbyStation) +* [DonutStation](https://tgstation13.org/wiki/Donutstation) + + +All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. + +The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. + +If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. + +Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](https://tgstation13.org/wiki/Map_Merger) + +## AWAY MISSIONS + +/tg/station supports loading away missions however they are disabled by default. + +Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. + +To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. + + diff --git a/.github/RUNNING_A_SERVER.md b/.github/RUNNING_A_SERVER.md new file mode 100644 index 00000000000..88e730fcfd3 --- /dev/null +++ b/.github/RUNNING_A_SERVER.md @@ -0,0 +1,86 @@ +# INSTALLATION +First-time installation should be fairly straightforward. First, you'll need +BYOND installed. You can get it from https://www.byond.com/download. Once you've done +that, extract the game files to wherever you want to keep them. This is a +sourcecode-only release, so the next step is to compile the server files. +Open tgstation.dme by double-clicking it, open the Build menu, and click +compile. This'll take a little while, and if everything's done right you'll get +a message like this: + +``` +saving tgstation.dmb (DEBUG mode) +tgstation.dmb - 0 errors, 0 warnings +``` + +If you see any errors or warnings, something has gone wrong - possibly a corrupt +download or the files extracted wrong. If problems persist, ask for assistance +in irc://irc.rizon.net/coderbus + +Once that's done, open up the config folder. You'll want to edit config.txt to +set the probabilities for different gamemodes in Secret and to set your server +location so that all your players don't get disconnected at the end of each +round. It's recommended you don't turn on the gamemodes with probability 0, +except Extended, as they have various issues and aren't currently being tested, +so they may have unknown and bizarre bugs. Extended is essentially no mode, and +isn't in the Secret rotation by default as it's just not very fun. + +You'll also want to edit config/admins.txt to remove the default admins and add +your own. "Game Master" is the highest level of access, and probably the one +you'll want to use for now. You can set up your own ranks and find out more in +config/admin_ranks.txt + +The format is + +``` +byondkey = Rank +``` + +where the admin rank must be properly capitalised. + +This codebase also depends on a native library called rust-g. A precompiled +Windows DLL is included in this repository, but Linux users will need to build +and install it themselves. Directions can be found at the [rust-g +repo](https://github.com/tgstation/rust-g). + +Finally, to start the server, run Dream Daemon and enter the path to your +compiled tgstation.dmb file. Make sure to set the port to the one you +specified in the config.txt, and set the Security box to 'Safe'. Then press GO +and the server should start up and be ready to join. It is also recommended that +you set up the SQL backend (see below). + +## UPDATING + +To update an existing installation, first back up your /config and /data folders +as these store your server configuration, player preferences and banlist. + +Then, extract the new files (preferably into a clean directory, but updating in +place should work fine), copy your /config and /data folders back into the new +install, overwriting when prompted except if we've specified otherwise, and +recompile the game. Once you start the server up again, you should be running +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 +https://github.com/tgstation/tgstation-server + +## SQL SETUP + +The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database + +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 delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. + +1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` +1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. + * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. + * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. + +## IRC BOT SETUP + +Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified +IRC channel/server, see the /tools/minibot folder for more diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml index b680139f74a..7be294b00ed 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" @@ -32,5 +32,7 @@ jobs: git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true - name: Push Artifacts uses: ad-m/github-push-action@master + env: + GITHUB_ACTOR: comfyorange with: github_token: ${{ secrets.GITHUB_MASTER_KEY }} diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 4894870752b..fb732d5d3cf 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -32,5 +32,7 @@ jobs: git commit -m "Automatic changelog compile [ci skip]" -a || true - name: "Push" uses: ad-m/github-push-action@master + env: + GITHUB_ACTOR: comfyorange with: github_token: ${{ secrets.GITHUB_MASTER_KEY }} 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..ef5fbb7b5db 100644 --- a/README.md +++ b/README.md @@ -1,153 +1,33 @@ ## /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 * **Code:** https://github.com/tgstation/tgstation * **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) - +* **/tg/station Discord:** https://tgstation13.org/phpBB/viewforum.php?f=60 +* **Coderbus Discord:** https://discord.gg/Vh8TJp9 +* **IRC:** irc://irc.rizon.net/coderbus (dead) + +This is the codebase for the /tg/station flavoured fork of SpaceStation 13. + +Space Station 13 is a paranoia-laden round-based roleplaying game set against the backdrop of a nonsensical, metal death trap masquerading as a space station, with charming spritework designed to represent the sci-fi setting and its dangerous undertones. Have fun, and survive! + ## DOWNLOADING +[Downloading](.github/CONTRIBUTING.md) -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 +[Running on the server](.github/RUNNING_A_SERVER.md) -Option 1: -Follow this: https://www.tgstation13.org/wiki/Setting_up_git +[Maps and Away Missions](.github/MAPS_AND_AWAY_MISSIONS.md) -Option 2: Download the source code as a zip by clicking the ZIP button in the -code tab of https://github.com/tgstation/tgstation -(note: this will use a lot of bandwidth if you wish to update and is a lot of -hassle if you want to make any changes at all, so it's not recommended.) +## Requirements for contributors +[Guidelines for Contributors](.github/CONTRIBUTING.md) -Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2) - -Option 4: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2) - -``` -docker run -d -p :1337 -v /path/to/your/config:/tgstation/config -v /path/to/your/data:/tgstation/data tgstation/tgstation -``` - -## INSTALLATION - -First-time installation should be fairly straightforward. First, you'll need -BYOND installed. You can get it from https://www.byond.com/download. Once you've done -that, extract the game files to wherever you want to keep them. This is a -sourcecode-only release, so the next step is to compile the server files. -Open tgstation.dme by double-clicking it, open the Build menu, and click -compile. This'll take a little while, and if everything's done right you'll get -a message like this: - -``` -saving tgstation.dmb (DEBUG mode) -tgstation.dmb - 0 errors, 0 warnings -``` - -If you see any errors or warnings, something has gone wrong - possibly a corrupt -download or the files extracted wrong. If problems persist, ask for assistance -in irc://irc.rizon.net/coderbus - -Once that's done, open up the config folder. You'll want to edit config.txt to -set the probabilities for different gamemodes in Secret and to set your server -location so that all your players don't get disconnected at the end of each -round. It's recommended you don't turn on the gamemodes with probability 0, -except Extended, as they have various issues and aren't currently being tested, -so they may have unknown and bizarre bugs. Extended is essentially no mode, and -isn't in the Secret rotation by default as it's just not very fun. - -You'll also want to edit config/admins.txt to remove the default admins and add -your own. "Game Master" is the highest level of access, and probably the one -you'll want to use for now. You can set up your own ranks and find out more in -config/admin_ranks.txt - -The format is - -``` -byondkey = Rank -``` - -where the admin rank must be properly capitalised. - -This codebase also depends on a native library called rust-g. A precompiled -Windows DLL is included in this repository, but Linux users will need to build -and install it themselves. Directions can be found at the [rust-g -repo](https://github.com/tgstation/rust-g). - -Finally, to start the server, run Dream Daemon and enter the path to your -compiled tgstation.dmb file. Make sure to set the port to the one you -specified in the config.txt, and set the Security box to 'Safe'. Then press GO -and the server should start up and be ready to join. It is also recommended that -you set up the SQL backend (see below). - -## UPDATING - -To update an existing installation, first back up your /config and /data folders -as these store your server configuration, player preferences and banlist. - -Then, extract the new files (preferably into a clean directory, but updating in -place should work fine), copy your /config and /data folders back into the new -install, overwriting when prompted except if we've specified otherwise, and -recompile the game. Once you start the server up again, you should be running -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 -https://github.com/tgstation/tgstation-server - -## MAPS - -/tg/station currently comes equipped with five maps. - -* [BoxStation (default)](https://tgstation13.org/wiki/Boxstation) -* [MetaStation](https://tgstation13.org/wiki/MetaStation) -* [DeltaStation](https://tgstation13.org/wiki/DeltaStation) -* [PubbyStation](https://tgstation13.org/wiki/PubbyStation) -* [DonutStation](https://tgstation13.org/wiki/Donutstation) - - -All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. - -The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. - -If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. - -Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](https://tgstation13.org/wiki/Map_Merger) - -## AWAY MISSIONS - -/tg/station supports loading away missions however they are disabled by default. - -Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. - -To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. - -## SQL SETUP - -The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database - -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 delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. - -1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` -1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. - * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. - * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. - -## IRC BOT SETUP - -Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified -IRC channel/server, see the /tools/minibot folder for more - -## CONTRIBUTING - -Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) +[Documenting your code](.github/AUTODOC_GUIDE.md) ## LICENSE @@ -163,8 +43,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 6342dc168e5..cb6c58f858c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -474,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, @@ -747,7 +747,7 @@ /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{ @@ -764,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{ 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/RandomRuins/SpaceRuins/kinggoatarena.dmm b/_maps/RandomRuins/SpaceRuins/kinggoatarena.dmm index 2473abd136f..b16e7f6769b 100644 --- a/_maps/RandomRuins/SpaceRuins/kinggoatarena.dmm +++ b/_maps/RandomRuins/SpaceRuins/kinggoatarena.dmm @@ -24,6 +24,8 @@ /area/ruin/powered/kinggoat_arena) "f" = ( /mob/living/simple_animal/hostile/retaliate/goose{ + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0); + damage_coeff = list("brute" = 0, "fire" = 0, "toxin" = 0, "clone" = 0, "stamina" = 0, "oxygen" = 0); desc = "If you are alive and reading this you should not be in this room and should prob tell a admin how you got here."; name = "The Paradox Goose" }, 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/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 5ce6328c03e..1e76d5a7960 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -189,7 +189,7 @@ /obj/structure/cable, /obj/machinery/power/smes/magical{ desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. It seems to be powered just fine without our intervention."; - name = "nanotrasen power storage unit" + name = "\improper Nanotrasen power storage unit" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -2241,7 +2241,7 @@ /obj/item/gun/ballistic/automatic/toy{ anchored = 1; desc = "Don't try it."; - name = "Nanotrasen Saber SMG" + name = "\improper Nanotrasen Saber SMG" }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -3043,7 +3043,7 @@ /area/awaymission/cabin/caves) "hR" = ( /obj/structure/reagent_dispensers/beerkeg{ - desc = "Hey, Centcom, we located our complimentary case of space beer! The pamphlet didn't lie!"; + desc = "Hey, CentCom, we located our complimentary case of space beer! The pamphlet didn't lie!"; name = "complimentary keg of space beer" }, /turf/open/floor/plating/snowed, diff --git a/_maps/kilostation.json b/_maps/kilostation.json index 70e4b8a9b0c..72a537c74fa 100644 --- a/_maps/kilostation.json +++ b/_maps/kilostation.json @@ -2,6 +2,7 @@ "map_name": "Kilo Station", "map_path": "map_files/KiloStation", "map_file": "KiloStation.dmm", + "space_ruin_levels": 4, "shuttles": { "emergency": "emergency_kilo", "ferry": "ferry_kilo", diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index f9c3087ea71..8bfe09744c3 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -16862,6 +16862,7 @@ "aTE" = ( /obj/structure/table, /obj/item/hand_labeler, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/art) "aTF" = ( @@ -17064,14 +17065,18 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aUh" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/eastleft{ - name = "Hydroponics Desk"; - req_access_txt = "35" +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenhydro"; + name = "Service Shutter" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Service Door"; + req_one_access_txt = "35;28" }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, /area/crew_quarters/kitchen) "aUi" = ( /obj/effect/turf_decal/tile/neutral{ @@ -17610,9 +17615,12 @@ /area/crew_quarters/kitchen) "aVH" = ( /obj/machinery/processor, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/button/door{ + id = "kitchenhydro"; + name = "Service Shutter Control"; + pixel_x = 24; + pixel_y = 7; + req_access_txt = "28" }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) @@ -18910,6 +18918,10 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "aYO" = ( @@ -22853,6 +22865,9 @@ /obj/structure/table, /obj/item/clothing/head/soft, /obj/item/clothing/head/soft, +/obj/item/storage/box/shipping{ + pixel_x = 6 + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "bjo" = ( @@ -32296,6 +32311,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) @@ -41318,18 +41337,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" = ( @@ -42522,7 +42533,6 @@ /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, @@ -42533,6 +42543,7 @@ pixel_x = -4; pixel_y = -1 }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cnB" = ( @@ -46381,10 +46392,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" = ( @@ -47902,7 +47913,6 @@ /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, -/obj/structure/cable, /obj/machinery/light{ dir = 1 }, @@ -52190,6 +52200,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 @@ -85610,7 +85624,7 @@ bZB caC cjJ cSM -cjd +cSN cSW ckI rdP @@ -85864,8 +85878,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 d9d84ddf783..8208bbfab7d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -101,6 +101,30 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison/toilet) +"aam" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aan" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "aao" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -282,20 +306,71 @@ /turf/open/floor/plasteel, /area/science/robotics/mechbay) "aaH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/disposalpipe/junction/flip{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"aaI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light, /obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aaJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/mapping_helpers/dead_body_placer, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, /turf/open/floor/plasteel, -/area/medical/morgue) +/area/hallway/primary/port) +"aaK" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"aaL" = ( +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/library) +"aaM" = ( +/obj/machinery/camera{ + c_tag = "Art Gallery"; + name = "library camera" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/library) +"aaN" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/table/wood/fancy, +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/library) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -303,9 +378,105 @@ "aaP" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"aaQ" = ( +/obj/machinery/door/window{ + dir = 2; + name = "Secure Art Exhibition" + }, +/obj/structure/table/wood/fancy, +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/library) +"aaR" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/wood/fancy, +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/library) "aaS" = ( /turf/closed/wall/mineral/plastitanium, /area/construction/mining/aux_base) +"aaT" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"aaU" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/dark, +/area/library) +"aaV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/library) +"aaW" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/library) +"aaX" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"aaY" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) +"aaZ" = ( +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) +"aba" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/library) +"abb" = ( +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"abc" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/library) +"abd" = ( +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/library) "abe" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/end{ @@ -316,6 +487,23 @@ "abf" = ( /turf/closed/wall, /area/hallway/secondary/entry) +"abg" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/grimy, +/area/library) +"abh" = ( +/obj/structure/table/wood, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/library) "abi" = ( /turf/closed/wall, /area/construction/mining/aux_base) @@ -323,6 +511,60 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"abk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/sign/plaques/kiddie/library{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/library) +"abl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Library"; + name = "library camera" + }, +/turf/open/floor/plasteel/grimy, +/area/library) +"abm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/library) +"abn" = ( +/obj/machinery/bookbinder, +/turf/open/floor/plasteel/dark, +/area/library) +"abo" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/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/item/toy/crayon/spraycan{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/toy/crayon/spraycan, +/turf/open/floor/plasteel/dark, +/area/library) "abp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -349,6 +591,21 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"abr" = ( +/obj/item/twohanded/required/kirbyplants/random, +/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/item/toy/plush/snakeplushie, +/turf/open/floor/plasteel/dark, +/area/library) "abs" = ( /obj/docking_port/stationary{ dwidth = 1; @@ -360,6 +617,29 @@ /obj/structure/fans/tiny/invisible, /turf/open/space/basic, /area/space) +"abt" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/painting/library_private{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/library) "abv" = ( /obj/item/stack/cable_coil, /obj/structure/lattice/catwalk, @@ -2139,7 +2419,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 +4583,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 +5571,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 +9397,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 +10134,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" = ( @@ -19841,11 +20121,14 @@ "aQC" = ( /obj/structure/table, /obj/item/folder/yellow, -/obj/item/destTagger, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/item/storage/box/shipping{ + pixel_x = 4; + pixel_z = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aQD" = ( @@ -20293,19 +20576,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 +20639,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" }, @@ -26329,6 +26599,23 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"bbj" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "5; 33" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) "bbk" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/security/prison"; @@ -27448,7 +27735,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" = ( @@ -44513,6 +44800,7 @@ pixel_x = -32 }, /obj/effect/turf_decal/bot, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/primary) "bGH" = ( @@ -55499,37 +55787,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bYR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bYS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bYT" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -57360,44 +57617,6 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"cct" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 - }, -/obj/item/radio/intercom{ - pixel_y = 26 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"ccu" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/folder, -/obj/item/pen, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"ccv" = ( -/obj/machinery/computer/libraryconsole, -/obj/structure/table/wood, -/turf/open/floor/plasteel/dark, -/area/library) "ccw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -58429,89 +58648,12 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"cef" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/librarian, -/turf/open/floor/plasteel/dark, -/area/library) "ceg" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel/grimy, /area/library) -"ceh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"cei" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/camera{ - c_tag = "Library - Fore"; - dir = 8; - name = "library camera" - }, -/turf/open/floor/plasteel/dark, -/area/library) -"cej" = ( -/obj/machinery/photocopier, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"cek" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/library) -"cel" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cem" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -59409,16 +59551,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) -"cfV" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants/random, -/obj/structure/sign/plaques/kiddie/library{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/library) "cfW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -59431,34 +59563,6 @@ }, /turf/open/floor/plasteel/grimy, /area/library) -"cfY" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) -"cfZ" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/library) -"cga" = ( -/obj/machinery/door/morgue{ - name = "Private Study" - }, -/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 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cgb" = ( /obj/structure/sign/plaques/kiddie/library{ pixel_x = -32 @@ -60425,16 +60529,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) -"chM" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/wood, -/area/library) "chN" = ( /obj/structure/chair/office, /turf/open/floor/wood, @@ -60448,61 +60542,6 @@ /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, /area/library) -"chQ" = ( -/obj/machinery/bookbinder, -/turf/open/floor/wood, -/area/library) -"chR" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/library) -"chS" = ( -/obj/structure/chair/comfy/brown, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/library) -"chT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/library) -"chU" = ( -/obj/machinery/photocopier, -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/library) -"chV" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/bookcase/manuals/research_and_development, -/obj/machinery/camera{ - c_tag = "Library"; - name = "library camera" - }, -/turf/open/floor/wood, -/area/library) -"chW" = ( -/obj/structure/chair/comfy/brown, -/obj/item/radio/intercom{ - pixel_y = 26 - }, -/turf/open/floor/wood, -/area/library) -"chX" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/library) "chZ" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -61254,10 +61293,6 @@ }, /turf/open/floor/plasteel/grimy, /area/library) -"cju" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/grimy, -/area/library) "cjv" = ( /obj/machinery/door/airlock/public/glass{ name = "Library Access" @@ -62779,10 +62814,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/library) -"cmv" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/library) "cmw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/extinguisher_cabinet{ @@ -63185,7 +63216,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" = ( @@ -67882,22 +67913,6 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"cwt" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cwu" = ( /obj/structure/table/wood, /obj/item/storage/fancy/candle_box{ @@ -67932,20 +67947,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/library) -"cwy" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cwz" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" @@ -68841,25 +68842,6 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"cyg" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cyh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ @@ -76985,7 +76967,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" = ( @@ -82301,10 +82283,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 }, @@ -82318,6 +82296,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 }, @@ -84813,7 +84800,7 @@ name = "Chemistry Side Shutters" }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/medical/pharmacy) "dbb" = ( /obj/structure/table/glass, /obj/item/folder/white, @@ -84831,7 +84818,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dbc" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/chemistry{ @@ -84851,14 +84838,14 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dbd" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dbe" = ( /obj/structure/chair/office/light{ dir = 1 @@ -84866,7 +84853,7 @@ /obj/effect/landmark/start/chemist, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dbf" = ( /obj/machinery/chem_dispenser, /obj/structure/disposalpipe/segment, @@ -84874,12 +84861,12 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dbg" = ( /obj/machinery/power/apc{ - areastring = "/area/medical/chemistry"; + areastring = "/area/medical/pharmacy"; dir = 1; - name = "Chemistry Lab APC"; + name = "Pharmacy APC"; pixel_y = 23 }, /obj/effect/turf_decal/tile/yellow{ @@ -84887,18 +84874,18 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dbh" = ( /obj/structure/closet/wardrobe/chemistry_white, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dbi" = ( /obj/machinery/status_display/ai, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/pharmacy) "dbj" = ( /obj/machinery/computer/med_data{ dir = 4 @@ -85840,7 +85827,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dcO" = ( /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -85850,11 +85837,11 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcQ" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcR" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -85864,7 +85851,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcS" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -85878,7 +85865,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcT" = ( /obj/structure/closet/secure_closet/medical1, /obj/structure/window/reinforced, @@ -85886,7 +85873,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcU" = ( /obj/machinery/computer/crew{ dir = 4 @@ -86600,13 +86587,13 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dem" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "den" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -86619,7 +86606,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "deo" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -86631,7 +86618,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dep" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/yellow{ @@ -86642,7 +86629,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "deq" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder{ @@ -86654,11 +86641,11 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "der" = ( /obj/machinery/status_display/evac, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/pharmacy) "des" = ( /obj/structure/table/glass, /obj/item/clipboard, @@ -87209,7 +87196,7 @@ "dfv" = ( /obj/structure/sign/departments/chemistry, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/pharmacy) "dfw" = ( /obj/machinery/light{ dir = 8 @@ -87232,7 +87219,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dfx" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/yellow{ @@ -87242,7 +87229,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dfy" = ( /obj/machinery/holopad{ pixel_x = -16 @@ -87254,7 +87241,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dfz" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma, @@ -87273,14 +87260,14 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Medbay - Chemistry"; + c_tag = "Medbay - Pharmacy"; dir = 8; name = "medbay camera"; network = list("ss13","medbay") }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dfA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -87290,10 +87277,6 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/item/folder/white, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -3; - pixel_y = 2 - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/medical/medbay/central) @@ -88059,7 +88042,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/medical/pharmacy) "dgV" = ( /obj/machinery/chem_dispenser, /obj/structure/disposalpipe/segment{ @@ -88069,7 +88052,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dgW" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -88079,7 +88062,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dgX" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -88089,7 +88072,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dgY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -88102,7 +88085,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dgZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -88119,14 +88102,14 @@ }, /obj/structure/cable, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dha" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dhb" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -88144,7 +88127,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dhc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -88537,7 +88520,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" = ( @@ -88919,7 +88902,7 @@ name = "Chemistry Desk" }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "diq" = ( /obj/structure/chair/office/light{ dir = 8 @@ -88927,19 +88910,13 @@ /obj/effect/landmark/start/chemist, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dir" = ( -/obj/machinery/requests_console{ - department = "Chemistry Lab"; - name = "Chemistry RC"; - pixel_y = -64; - receive_ore_updates = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dis" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral{ @@ -88952,17 +88929,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dit" = ( /obj/effect/turf_decal/tile/yellow, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "diu" = ( /obj/machinery/smartfridge/chemistry/preloaded, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/pharmacy) "div" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -89898,23 +89876,30 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dkh" = ( /obj/machinery/chem_heater, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/floor/plasteel, -/area/medical/chemistry) -"dki" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/requests_console{ + department = "Pharmacy"; + name = "Pharmacy RC"; + pixel_y = -32; + receive_ore_updates = 1 }, +/turf/open/floor/plasteel, +/area/medical/pharmacy) +"dki" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dkj" = ( /obj/structure/table/glass, /obj/item/stack/packageWrap, @@ -89928,15 +89913,14 @@ }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dkk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/vending/wardrobe/chem_wardrobe, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dkl" = ( /obj/machinery/light_switch{ pixel_x = 10; @@ -89946,19 +89930,15 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_x = -6; + pixel_x = -4; pixel_y = -26 }, /obj/effect/turf_decal/tile/yellow, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dkm" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab"; - req_access_txt = "5; 69" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -89969,8 +89949,12 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/door/airlock/medical/glass{ + name = "Pharmacy"; + req_access_txt = "5; 69" + }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dkn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -90710,28 +90694,25 @@ /area/hallway/primary/aft) "dlU" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Chemistry Maintenance"; - req_access_txt = "5; 33" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "69; 33" + }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/medical/chemistry) -"dlV" = ( -/turf/closed/wall, -/area/medical/medbay/zone2) "dlW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dlX" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dlY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -91141,118 +91122,122 @@ /turf/open/floor/plasteel, /area/science/robotics/mechbay) "dng" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/roller, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dnh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dni" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) -"dnj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dnk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/medical/central) -"dnl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dnm" = ( -/obj/machinery/light{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dnn" = ( -/obj/machinery/airalarm{ - pixel_y = 22 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dno" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dnp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dnq" = ( -/obj/structure/table/glass, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dnr" = ( -/obj/structure/table/glass, -/obj/machinery/power/apc/highcap/five_k{ - dir = 1; - name = "Ward APC"; - pixel_y = 23 - }, -/obj/item/folder/white, -/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/zone2) +/area/medical/chemistry) +"dnh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dnl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Chemistry - Fore"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dnn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dno" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dnp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dnq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dnr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/chem_heater, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dns" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ @@ -91483,7 +91468,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" = ( @@ -92150,201 +92135,83 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "dpf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dpg" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dph" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable, /turf/open/floor/plating, -/area/maintenance/department/medical/central) +/area/medical/chemistry) +"dph" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dpi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dpj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dpk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dpl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/dropper, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dpm" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dpn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dpo" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ 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/yellow, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dpp" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dpq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dpr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dps" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Ward"; - req_access_txt = "5" - }, +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2) +/turf/closed/wall, +/area/medical/chemistry) "dpt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"dpu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/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, -/area/medical/medbay/central) "dpv" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -92525,7 +92392,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" = ( @@ -93077,181 +92944,24 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dqU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/medical/central) -"dqV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) "dqW" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dqX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dqY" = ( -/obj/structure/rack, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/eyepatch, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/medical/central) -"dqZ" = ( -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dra" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"drb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"drc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/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/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"drd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/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 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dre" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "drf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/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/zone2) -"drg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/airlock/medical/glass{ - name = "Ward"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2) +/area/medical/chemistry) "drh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dri" = ( @@ -93779,73 +93489,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dso" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dsp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dsq" = ( -/turf/open/floor/plating, -/area/maintenance/department/medical/central) -"dsr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dss" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/structure/girder, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dst" = ( -/obj/machinery/camera{ - c_tag = "Medbay - Ward"; - dir = 4; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/wardrobe/pjs, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dsw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dsx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dsz" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) "dsA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dsB" = ( @@ -94316,21 +93967,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dtA" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) -"dtB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dtC" = ( -/turf/closed/wall/r_wall, -/area/medical/medbay/zone2) "dtG" = ( /obj/machinery/power/apc{ areastring = "/area/medical/medbay/central"; @@ -94996,55 +94632,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dvc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dvd" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dvf" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dvg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dvh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dvi" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/r_wall, -/area/medical/medbay/zone2) -"dvp" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) "dvr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -95693,137 +95280,13 @@ /turf/open/floor/plasteel, /area/science/robotics/mechbay) "dwD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dwF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"dwG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/maintenance/department/medical/central) -"dwH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dwI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dwJ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/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/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dwK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/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/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dwL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dwM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/medical/medbay/zone2) -"dwN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dwO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dwP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) "dwV" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -96206,7 +95669,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" = ( @@ -96392,124 +95855,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dyj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/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/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dyk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dyl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dym" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Ward Maintenance"; - req_access_txt = "5" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2) -"dyn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dyo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dyp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dyr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dys" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) "dyw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -97156,77 +96501,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dzN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dzO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +"dzR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dzP" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ 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/yellow, +/obj/structure/disposalpipe/segment{ + dir = 10 }, /obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dzQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/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/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dzR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dzV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dzY" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dAa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ @@ -97641,115 +96929,47 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "dAR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/area/maintenance/department/medical/central) -"dAS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) -"dAT" = ( -/obj/item/radio/intercom{ - pixel_y = -26 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) -"dAU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/medical/central) +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dAV" = ( -/obj/machinery/status_display/ai, -/turf/closed/wall/r_wall, -/area/medical/medbay/zone2) -"dAX" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera{ + c_tag = "Chemistry - Center"; + dir = 1; + name = "medbay camera"; + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dAY" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dBa" = ( -/obj/structure/mirror{ - pixel_y = -33 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dBb" = ( -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dBc" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) -"dBd" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/medical/medbay/zone2) +/area/medical/chemistry) "dBe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sign/poster/official/do_not_question{ - pixel_y = -32 - }, /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/warning/bodysposal{ + pixel_y = -32 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dBf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -97758,6 +96978,9 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dBg" = ( @@ -98382,51 +97605,29 @@ "dCy" = ( /turf/closed/wall, /area/medical/morgue) -"dCz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "9" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dCA" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/medical/morgue) "dCB" = ( /turf/closed/wall/r_wall, /area/medical/morgue) -"dCC" = ( -/turf/closed/wall/r_wall, -/area/maintenance/department/medical/morgue) "dCD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/maintenance/department/medical/morgue) +/area/medical/morgue) "dCE" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Morgue Maintenance"; - req_access_txt = "5" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/structure/cable, +/obj/machinery/door/airlock/grunge{ + name = "Morgue"; + req_access_txt = "5;6" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, /turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) -"dCF" = ( -/turf/closed/wall, -/area/maintenance/department/medical/morgue) +/area/medical/morgue) "dCG" = ( /obj/structure/table/glass, /obj/item/clipboard, @@ -98946,66 +98147,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "dDI" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/turf/open/floor/plating, -/area/medical/morgue) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dDJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"dDK" = ( -/obj/machinery/light_switch{ - pixel_x = 26; - pixel_y = 26 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/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/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"dDL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dDM" = ( /obj/structure/bodycontainer/morgue{ dir = 2 @@ -99013,96 +98164,111 @@ /turf/open/floor/plating, /area/medical/morgue) "dDN" = ( -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/turf/open/floor/plating, /area/medical/morgue) "dDP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ dir = 1 }, +/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/filingcabinet/chestdrawer, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dDR" = ( /obj/structure/bodycontainer/morgue{ dir = 2 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dDS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dDT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/bed/roller, +/obj/item/crowbar{ + pixel_y = -6 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dDU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, /turf/open/floor/plating, /area/medical/morgue) -"dDQ" = ( -/obj/structure/filingcabinet/chestdrawer, +"dDV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/rack, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/twohanded/broom, /turf/open/floor/plating{ icon_state = "platingdmg2" }, /area/medical/morgue) -"dDR" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) -"dDS" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) -"dDT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dDU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dDV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) "dDW" = ( /obj/structure/table/glass, /obj/item/folder/white, @@ -99585,46 +98751,22 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "dER" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/latex, -/turf/open/floor/plating, -/area/medical/morgue) +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dES" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/medical/morgue) -"dET" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dEU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dEV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -99638,6 +98780,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/medical/morgue) "dEW" = ( @@ -99654,8 +98797,62 @@ /turf/open/floor/plasteel, /area/medical/morgue) "dEX" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dEY" = ( +/obj/effect/decal/cleanable/dirt, +/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/mapping_helpers/dead_body_placer, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dEZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/medical/morgue) +"dFb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dFc" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/xeno_spawn, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -99667,47 +98864,14 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dEY" = ( -/turf/open/floor/plating, -/area/medical/morgue) -"dEZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dFa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) -"dFb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dFc" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) +/turf/open/floor/plasteel, +/area/medical/morgue) "dFd" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/flashlight/pen, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel, +/area/medical/morgue) "dFe" = ( /turf/closed/wall, /area/crew_quarters/heads/cmo) @@ -100263,145 +99427,56 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "dGf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dGg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/navbeacon/wayfinding, -/turf/open/floor/plasteel, -/area/medical/morgue) "dGh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/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 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dGi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/medical/morgue) -"dGj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/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{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dGk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dGl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/trunk{ 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/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dGm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ 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/cable, -/turf/open/floor/plasteel, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dGn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -100412,11 +99487,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable, +/obj/structure/table/optable, /turf/open/floor/plasteel, /area/medical/morgue) "dGo" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -100427,111 +99502,93 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dGq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dGs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dGt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dGu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /obj/structure/cable, /turf/open/floor/plasteel, /area/medical/morgue) -"dGp" = ( +"dGv" = ( /obj/machinery/light_switch{ pixel_x = 26; pixel_y = 26 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 24; - pixel_y = -26 + pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/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/cable, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/medical/morgue) -"dGq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) -"dGr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/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/cable, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) -"dGs" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dGt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dGu" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/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/cable, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) -"dGv" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/breath/medical, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) "dGw" = ( /obj/structure/closet/secure_closet/CMO, /obj/item/clothing/under/rank/medical/doctor, @@ -101022,94 +100079,73 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "dHC" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/disposalpipe/segment, -/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 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/welding, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dHD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/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/landmark/start/chemist, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dHE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/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/cable, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/medical/morgue) -"dHF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/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 - }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/area/medical/chemistry) "dHH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/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/item/reagent_containers/dropper, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow{ 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 }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dHI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -101120,101 +100156,16 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel, /area/medical/morgue) -"dHJ" = ( +"dHP" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/morgue) -"dHK" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"dHL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/medical/morgue) -"dHM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) -"dHN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) -"dHO" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dHP" = ( -/obj/effect/decal/cleanable/dirt, -/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 }, @@ -101223,12 +100174,10 @@ }, /obj/structure/cable, /turf/open/floor/plasteel, -/area/maintenance/department/medical/morgue) +/area/medical/morgue) "dHQ" = ( -/obj/structure/rack, +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/obj/item/storage/pill_bottle, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -101239,8 +100188,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/turf/open/floor/plasteel, +/area/medical/morgue) "dHR" = ( /obj/machinery/light{ dir = 8 @@ -101874,14 +100828,24 @@ /turf/open/floor/plating, /area/medical/morgue) "dIV" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/morgue"; - name = "Morgue APC"; - pixel_y = -23 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/medical/morgue) +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/construction/plumbing, +/obj/item/construction/plumbing, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dIW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, @@ -101908,9 +100872,6 @@ name = "medbay camera"; network = list("ss13","medbay") }, -/obj/structure/sign/poster/official/bless_this_spess{ - pixel_y = -32 - }, /obj/structure/bodycontainer/morgue{ dir = 1 }, @@ -101927,86 +100888,59 @@ /turf/open/floor/plasteel/dark, /area/medical/morgue) "dIY" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/clothing/gloves/color/latex{ + pixel_y = 6 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/item/screwdriver{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/medical/morgue) +"dIZ" = ( +/obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; + name = "Morgue APC"; + pixel_y = -23 + }, +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/morgue) +"dJc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bodycontainer/morgue{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dJd" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small, /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/medical/morgue) -"dIZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/morgue) -"dJa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/light_construct/small, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/morgue) -"dJb" = ( +"dJg" = ( /obj/structure/table, /obj/item/stack/packageWrap, /obj/item/hand_labeler, /turf/open/floor/plating, /area/medical/morgue) -"dJc" = ( -/obj/structure/closet/secure_closet/medical3, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dJd" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dJe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"dJf" = ( -/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/cable, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) -"dJg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/medical/morgue"; - name = "Morgue Maintenance APC"; - pixel_y = -23 - }, -/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/cable, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/medical/morgue) "dJh" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/stripes/line{ @@ -102151,7 +101085,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" = ( @@ -102234,7 +101168,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" = ( @@ -102580,16 +101514,17 @@ /area/hallway/primary/aft) "dKm" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/structure/cable, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/aft) "dKn" = ( @@ -106525,7 +105460,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" = ( @@ -107576,7 +106511,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" = ( @@ -113327,6 +112262,25 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/library) +"ekI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/morgue) +"elu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"emj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/chemistry) "eny" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -113476,6 +112430,16 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/maintenance/department/science) +"fbz" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "fbA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -113539,11 +112503,62 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/science/mixing/chamber) +"foK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "fpQ" = ( /obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) +"fvf" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fww" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fxp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemisttop"; + name = "Chemistry Lobby Shutters" + }, +/obj/machinery/door/window/northleft{ + name = "Chemistry Desk" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/southleft{ + name = "Chemistry Desk"; + req_access_txt = "5; 69" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"fAI" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "fGq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -113576,6 +112591,17 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"fXU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/library) +"fYL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "gaK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -113605,6 +112631,10 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"gqD" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/closed/wall, +/area/medical/chemistry) "gvO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -113745,6 +112775,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"gRN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/smartfridge/organ, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "gSi" = ( /turf/closed/wall/r_wall, /area/science/misc_lab) @@ -113753,6 +112797,10 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"gUL" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/wood, +/area/library) "gWD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -113805,6 +112853,19 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"hpY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "hrP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -113965,6 +113026,25 @@ /obj/machinery/light, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"ide" = ( +/obj/effect/decal/cleanable/dirt, +/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/item/storage/bag/bio, +/obj/structure/table, +/obj/machinery/vending/wallmed{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "igE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm{ @@ -114001,15 +113081,21 @@ /turf/open/floor/plasteel/dark, /area/science/nanite) "inw" = ( -/turf/closed/wall, -/area/maintenance/department/medical/central) -"iqc" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/medical/chemistry) +"isC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Chemistry Maintenance"; + req_access_txt = "33" }, -/obj/structure/closet/wardrobe/pjs, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) "itc" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -114103,6 +113189,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"iLU" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -114158,14 +113251,42 @@ }, /turf/open/floor/plasteel, /area/medical/surgery/room_b) -"jac" = ( -/obj/machinery/power/apc/auto_name/east, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) +"jcE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/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 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/machinery/requests_console{ + department = "Chemistry Lab"; + name = "Chemistry RC"; + pixel_y = -32; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "jdO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -114203,6 +113324,16 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/command) +"jpo" = ( +/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) "jqM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -114260,6 +113391,14 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/science/mixing) +"jBu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "jDu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ @@ -114424,6 +113563,22 @@ }, /turf/closed/wall/r_wall, /area/crew_quarters/heads/hor) +"kvv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "kxT" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, @@ -114481,6 +113636,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/misc_lab/range) +"lbd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lcz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "lcU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -114779,6 +113949,9 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"lYb" = ( +/turf/open/floor/plasteel/white, +/area/medical/pharmacy) "mbO" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -114793,6 +113966,16 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"mgW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -114922,6 +114105,22 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/medical/surgery/room_b) +"mUS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "mUY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -114929,6 +114128,16 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"mWu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "mWZ" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -114950,6 +114159,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/surgery/room_b) +"nbA" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "ncP" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/latex, @@ -115018,6 +114232,20 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/aisat) +"ntV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "nvD" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -115056,6 +114284,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/medical/medbay/central) +"nAG" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "nBr" = ( /turf/closed/wall/r_wall, /area/engine/storage_shared) @@ -115081,6 +114317,26 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/mixing) +"nJb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/sign/departments/chemistry{ + pixel_x = -32; + pixel_y = 0 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nKD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "nLd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -115107,10 +114363,26 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"nNI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "nOg" = ( /obj/structure/lattice, /turf/open/space, /area/space) +"nQQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "nQW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -115185,6 +114457,21 @@ /obj/machinery/dna_scannernew, /turf/open/floor/plasteel/dark, /area/science/genetics) +"oCS" = ( +/obj/effect/decal/cleanable/dirt, +/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/cable, +/turf/open/floor/plasteel, +/area/medical/morgue) "oGH" = ( /obj/machinery/shower{ pixel_y = 16 @@ -115264,6 +114551,20 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oPC" = ( +/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/cable, +/turf/open/floor/plasteel, +/area/medical/morgue) "oQn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -115391,23 +114692,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/engineering) -"psi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "ptI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -115433,6 +114717,9 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) +"pxG" = ( +/turf/closed/wall, +/area/medical/pharmacy) "pAL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, @@ -115458,6 +114745,17 @@ }, /turf/closed/wall, /area/medical/sleeper) +"pCo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "pCE" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -115465,6 +114763,20 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/storage_shared) +"pJU" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/medical/chemistry"; + dir = 4; + name = "Chemistry APC"; + pixel_x = 25; + pixel_y = 3 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "pQm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -115480,6 +114792,20 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/science/research/abandoned) +"pRt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = -11 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "pXY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -115567,10 +114893,45 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"qlz" = ( +/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/dropper, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "qnx" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) +"qob" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "qpq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -115677,6 +115038,27 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"qUN" = ( +/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/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "qWg" = ( /obj/structure/table/reinforced, /obj/machinery/light/small{ @@ -115768,6 +115150,13 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/science/storage) +"rAh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "rCv" = ( /turf/open/floor/plasteel, /area/science/misc_lab/range) @@ -115794,6 +115183,15 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"rKo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "rKN" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -115847,6 +115245,19 @@ }, /turf/open/floor/plasteel, /area/engine/storage_shared) +"rPv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "rUD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -115885,6 +115296,24 @@ /obj/structure/bed/roller, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"rYU" = ( +/obj/structure/disposalpipe/segment, +/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, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) "saw" = ( /turf/closed/wall/r_wall, /area/science/misc_lab/range) @@ -115946,6 +115375,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) +"sLr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "sOi" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/navbeacon{ @@ -115965,6 +115404,23 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"sWF" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "tbR" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko, @@ -115978,6 +115434,12 @@ }, /turf/open/floor/plasteel, /area/engine/storage_shared) +"tcO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "tew" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/purple{ @@ -115994,6 +115456,24 @@ /obj/structure/cable, /turf/open/floor/plating, /area/engine/storage_shared) +"tpD" = ( +/obj/effect/decal/cleanable/dirt, +/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/disposalpipe/segment, +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "tse" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -116004,6 +115484,14 @@ }, /turf/open/space/basic, /area/space/nearstation) +"ttx" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "tub" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -116061,6 +115549,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_y = 32 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "tHC" = ( @@ -116118,6 +115609,16 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, /area/medical/sleeper) +"udq" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "ugX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -116131,6 +115632,17 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"uiZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/sign/poster/official/report_crimes{ + pixel_x = -32; + pixel_y = 0 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "ukr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -116152,6 +115664,20 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"unT" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"uoL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "upk" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -116190,11 +115716,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/port/fore) -"uqb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/girder, -/turf/open/floor/plasteel, -/area/maintenance/department/medical/central) "uvc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -116251,6 +115772,32 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"uIV" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/medical/morgue) +"uLB" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "uMN" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -116299,6 +115846,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"uXz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/medical/morgue) "uYa" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -116325,6 +115878,18 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"veI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"vhE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "vko" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -116370,6 +115935,22 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/port) +"vrf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"vwn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "vwU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -116416,14 +115997,19 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"vDv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "vDU" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/storage_shared) -"vEx" = ( -/obj/machinery/firealarm, -/turf/closed/wall, -/area/medical/medbay/zone2) "vFc" = ( /turf/closed/wall, /area/medical/surgery/room_b) @@ -116696,6 +116282,24 @@ "xdD" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"xlt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) "xmt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -116710,6 +116314,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"xvf" = ( +/turf/closed/wall/r_wall, +/area/medical/chemistry) "xxD" = ( /obj/machinery/smartfridge/organ, /obj/structure/cable, @@ -116769,12 +116376,18 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"xFp" = ( -/obj/effect/turf_decal/tile/blue{ +"xFP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2) +/area/medical/chemistry) "xHZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -116797,6 +116410,10 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"xKp" = ( +/obj/effect/landmark/start/librarian, +/turf/open/floor/plasteel/grimy, +/area/library) "xKH" = ( /obj/structure/extinguisher_cabinet{ pixel_y = 32 @@ -143177,7 +142794,7 @@ aLu aMG aOm aPR -aRB +aRw aTc aUV aWM @@ -147070,8 +146687,8 @@ bYM caG ccn cee -cfV -chM +aaX +abc cjr cjs cmp @@ -147326,7 +146943,7 @@ bWD bYM caH cco -cef +aaU cfW chN cjs @@ -147338,7 +146955,7 @@ cqN cmt ctJ caH -cwq +abn cxV czD cBb @@ -147843,7 +147460,7 @@ ccq ceg ccq chO -ceg +abk ckQ cmr ccq @@ -148096,11 +147713,11 @@ bUt bWD bYM caH -ccr -ceh -cfY -chP -cjt +cwq +aaV +caG +caG +abl ckR cms cnO @@ -148351,12 +147968,12 @@ bDl bDl bUu bWE -bYO +aam +caG +aaK +cxV +aaY caG -ccs -cei -cfZ -chQ cjt ckR cms @@ -148608,22 +148225,22 @@ bQq bDu bUv bWC -bYR +aan caG +aaL +cxV +aaZ caG -caG -caG -chR -cjt +abm ckR cmt -cmt -cpu +fXU +gUL cqO cmt ctK cvk -cwt +abo cya czI cBg @@ -148867,10 +148484,10 @@ bUn bWI bYM caG -cct -cej +aaL +cxV +aaZ caG -chS cjt ckR cms @@ -149124,11 +148741,11 @@ bUn bWD bYM caG -ccu -cek -cga -chT -cju +aaL +cxV +aaZ +caG +cjt ckR cms cnQ @@ -149381,10 +148998,10 @@ bUp bWD bYM caG -ccv -cel +aaM +cxV +aba caG -chU cjt ckR cmt @@ -149636,12 +149253,12 @@ bKv bSu bUn bWD -bYS +aaI caG -caG -caG -caG -chV +aaN +cxV +cmt +abd cjt ckT cmu @@ -149895,10 +149512,10 @@ bUx bWJ bYM caG -cct -cej -caG -chW +aaQ +xKp +cxV +abg cjt ckR cmt @@ -150152,20 +149769,20 @@ bUn bWD bYM caG -ccu -cek -cga -chT -cju +aaR +cmt +cmt +ccr +cjt ckR -cmv +cmt cnU cpy cqT cpy ctN cvk -cwy +abr cyf czN caG @@ -150407,12 +150024,12 @@ bQu bQv bUm bWD -bYM +aaJ caG -ccv -cel -caG -chX +aaT +aaW +abb +abh cjt ckR chP @@ -150423,7 +150040,7 @@ csl ctO caG cwz -cyg +abt czO caG cCP @@ -155852,7 +155469,7 @@ dqT cPk cXD cPk -cUp +cPk dlR cPk cPk @@ -156109,10 +155726,10 @@ cXE dsn dtz dvb -dwF +dvb dyh dvb -dvb +nQQ dCx dDH dEQ @@ -156353,30 +155970,30 @@ cWh cND cPy dba -dcM +pxG dba dfv dgT dio dkf -inw -inw +xvf +xvf dpg inw +xvf +xvf +dpg +xvf +xvf inw -inw -inw -dwG -inw -inw -inw -dCy -dCy -dCy -dGg -dCy -dCy -dCy +emj +xvf +xvf +xvf +xvf +xvf +xvf +xvf dKU dMt dNO @@ -156612,28 +156229,28 @@ cPy dbb dcN del -dcM +pxG dgU dip dba -dcM +xvf dng dph -dqU -dso -uqb -dvd -dwH -dvc -dzN +dph +dph +hpY +dph +dph +ntV +rPv dzR -dCy +lcz dDI dER dGh dHC -dIU -dCy +jcE +xvf dKV dMu dNO @@ -156867,7 +156484,7 @@ cWj xJl cZt dbc -dcO +lYb dem dfw dgV @@ -156875,22 +156492,22 @@ diq dkg dcM dnh +nAG +unT dpi -dqV -dsp -dsp -dsp -dwI -uqb -dzO +dpi +udq +fww +fww +mWu dAR -dCy -dDJ +fYL +dcO dES dGi dHD -dES -dCy +qUN +xvf dKW dMv dNS @@ -157131,23 +156748,23 @@ dgW dir dkh dcM -dni -dpj -dqW -dsq -dtA -dvf -dwJ -dyj -dzP -dAS -dCz -dDK -dET -dGj +vwn +dpi +vrf +dcO +dcO +veI +dcO +dcO +dpi +dAR +fYL +dcO +dES +dGi dHE dIV -dCy +xvf dKX dMw dNS @@ -157388,23 +157005,23 @@ dgX dis dki dlU -dnj -dpk -dqX -dsr -dtB -dvg -dwK -dyk -dzQ -dAT -dCy -dDL -dEU -dGk -dHF -dIW -dCy +pCo +dpi +vrf +dcO +dcO +veI +dcO +dcO +dpi +dAR +fYL +dcO +dES +dGi +dGi +dGi +isC dKY dMx dNS @@ -157642,26 +157259,26 @@ dcR dep dfy dgY -den +dcS dkj dcM -dnk -dpl -dqY -dss -jac -dvh -dwL -dyl -dzR -dAU -dCA -dDM +nNI +dpi +vrf +dqW +dqW +vDv +dqW +dcO +dpi +dAR +pJU +dDJ aaH dGl dHH -iQh -dCy +qlz +xvf dKZ dMy dNS @@ -157901,24 +157518,24 @@ dcS dgZ dcS dkk -dcM -dlV -dlV -dlV -vEx -dtC -dvi -dwM -dym -dtC +gqD +rKo +dpi +vrf +dqW +dcO +veI +dqW +dcO +dpi dAV -dCB -tGU -dEV -dGm -dHH -dIX dCy +dCy +uXz +dCy +dCy +dCy +dCB dLa dMz dNT @@ -158160,21 +157777,21 @@ dit dkl dcM dnl +dpi +vrf +dpn +dcO +veI +dpn +dcO +dpi dpm -dqZ -dst -iqc -dpm -dwN -dyn -dsw -dpm -dCB +dCy dDN -dEW -dGl -dHH -psi +pRt +tpD +uIV +dIU dCy dKX dMA @@ -158409,25 +158026,25 @@ cQU cXM cPy dbi -dcM +pxG der -dcM +pxG dhb diu dkm dcM -dnm -dpn -dra -dpn -dra -dpn -dwO -dyo -dra -dAX -dCB -tGU +xFP +dpi +vrf +tcO +dcO +veI +tcO +dcO +dpi +dAR +dCy +ide dEW dGn dHI @@ -158672,22 +158289,22 @@ cPy dhc div dkn -dlV +dcM dnn dpo -drb -dpn -dpn -dpn -dwP -dyp -dzV -dAY -dCB -tGU -dEW -dGl -dHH +vrf +tcO +tcO +nKD +tcO +dcO +dpi +sLr +dCy +gRN +sWF +kvv +dEV dIZ dCy dKZ @@ -158931,21 +158548,21 @@ diw dko dlW dno -dpo -drc -dpn -dra -dpn -dra -dyo -dra -dpm -dCB +qob +elu +uoL +uoL +rAh +vhE +dcO +dpi +dAR +dCy dDP dEX dGo -dHJ -dJa +oCS +dIW dCy dKX dMA @@ -159186,23 +158803,23 @@ dfB dhe dbs dkp -dlW +fxp dnp -dpp -drd -dsx -dsx -dsx -dsx -dyr -dpn -dBa -dCB -dDQ +qob +dcO +dcO +dcO +veI +vrf +dcO +dpi +dAR +dCy +dDM dEY -dGp -dHK -dJb +dEW +oPC +iQh dCy dKY dMD @@ -159445,21 +159062,21 @@ diy dkp dlW dnq -dpq -dre -dpn -dra -dpn -dra -dys -dzY -dBb -dCB -dCy +ttx +fww +fww +fww +jBu +fbz +uLB +foK +dAR dCy +tGU +xlt dGq -dHL -dCy +oPC +dIX dCy dLc dME @@ -159700,24 +159317,24 @@ cPy dhe diz dkp -dlV +dcM dnr dpr drf -dsz -xFp -dvp -dvp -dvp -dvp +drf +jpo +mgW +fAI +fvf +jpo dBc -dCC +dCy dDR -dEZ -dGr -dHM +mUS +dEW +oPC dJc -dCF +dCy dLd dMF dNS @@ -159958,23 +159575,23 @@ dhe diA dkq dlX -dlW +dcM +gqD +gqD +dcM +dcM dps -drg -dlW -dtC -dlW -dlW -dlW -dlW -dBd -dCC +bbj +gqD +dcM +dcM +dCy dDS -dFa +mUS dGs -dHN +oCS dJd -dCF +dCy dLe dMF dNS @@ -160218,20 +159835,20 @@ dfF dns dpt drh -dsA +uiZ dtG dsA +iLU dwV -dwV -dsA +nJb dBe dCD dDT dFb dGt -dHO -dJe -dCD +oPC +dEZ +dCy dLf dMH dNT @@ -160473,11 +160090,11 @@ diC dks dlY dnt -dpu -dri dsB dri dsB +dri +rYU dwW dyw dri @@ -160487,7 +160104,7 @@ dDU dFc dGu dHP -dJf +ekI dKm dLg dMI @@ -160730,22 +160347,22 @@ diD dkt dfG dnu -dnu +nbA drj drj dtI -drj +lbd dwX drj dAa dBg -dCF +dCy dDV dFd dGv dHQ dJg -dCF +dCy dKY dMA dNS diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 38425689ec1..a53be8f3526 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -5174,6 +5174,7 @@ /area/security/warden) "aod" = ( /obj/structure/table, +/obj/item/storage/box/shipping, /turf/open/floor/plating, /area/storage/tech) "aoe" = ( @@ -11771,11 +11772,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 +18040,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" = ( @@ -29709,7 +29714,6 @@ /obj/structure/table, /obj/item/hand_labeler, /obj/item/stack/packageWrap, -/obj/item/destTagger, /obj/item/destTagger{ pixel_x = 2; pixel_y = 2 @@ -29717,6 +29721,7 @@ /obj/item/radio/intercom{ pixel_x = 30 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/quartermaster/office) "bAQ" = ( @@ -38797,7 +38802,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" = ( @@ -47392,7 +47397,6 @@ /obj/structure/table, /obj/item/storage/box, /obj/item/storage/box, -/obj/item/storage/box, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper, @@ -47400,6 +47404,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/tools) "qxm" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 54e40168596..7e74fd5b366 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -22713,6 +22713,10 @@ }, /obj/item/stack/packageWrap, /obj/item/hand_labeler, +/obj/item/storage/box/shipping{ + pixel_x = -4; + pixel_y = -4 + }, /turf/open/floor/plasteel/dark, /area/storage/primary) "aKb" = ( @@ -25621,6 +25625,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" = ( @@ -42741,6 +42749,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel/dark, /area/quartermaster/storage) "bmv" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 26397ce2117..1bd685297b6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -27534,16 +27534,13 @@ /area/quartermaster/sorting) "biJ" = ( /obj/structure/table, -/obj/item/destTagger{ - pixel_x = 4; - pixel_y = 3 - }, /obj/machinery/light_switch{ pixel_x = 27 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel/white/corner, /area/quartermaster/sorting) "biK" = ( @@ -41192,7 +41189,7 @@ /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/bridge/showroom/corporate"; dir = 4; - name = "Nanotrasen Corporate Showroom APC"; + name = "\improper Nanotrasen Corporate Showroom APC"; pixel_x = 24 }, /obj/item/cigbutt, @@ -41906,7 +41903,7 @@ /obj/structure/table/wood, /obj/item/toy/plush/carpplushie{ color = "red"; - name = "Nanotrasen wildlife department space carp plushie" + name = "\improper Nanotrasen wildlife department space carp plushie" }, /turf/open/floor/carpet, /area/bridge/showroom/corporate) @@ -42297,7 +42294,7 @@ /obj/structure/table/wood, /obj/item/storage/secure/briefcase{ desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; - name = "Nanotrasen-brand secure briefcase exhibit"; + name = "\improper Nanotrasen-brand secure briefcase exhibit"; pixel_y = 2 }, /turf/open/floor/carpet, @@ -42317,7 +42314,7 @@ "bRA" = ( /obj/item/toy/beach_ball{ desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen"; - name = "Nanotrasen-brand beach ball"; + name = "\improper Nanotrasen-brand beach ball"; pixel_y = 7 }, /obj/structure/table/wood, @@ -42378,7 +42375,7 @@ }, /obj/structure/table/wood, /obj/item/toy/talking/AI{ - name = "Nanotrasen-brand toy AI"; + name = "\improper Nanotrasen-brand toy AI"; pixel_y = 6 }, /turf/open/floor/carpet, @@ -47705,12 +47702,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 }, @@ -47723,6 +47718,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" = ( @@ -68922,6 +68923,7 @@ dir = 8 }, /obj/structure/cable, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/primary) "dhM" = ( @@ -69200,7 +69202,7 @@ /obj/item/poster/random_official, /obj/item/paicard{ desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; - name = "Nanotrasen-brand personal AI device exhibit" + name = "\improper Nanotrasen-brand personal AI device exhibit" }, /obj/structure/cable, /turf/open/floor/carpet, @@ -72626,7 +72628,7 @@ "lfv" = ( /obj/effect/mob_spawn/human/corpse/assistant{ belt = null; - husk = TRUE; + husk = 1; id = null; l_pocket = /obj/item/pen }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 3336c41997b..54f60593d79 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -12670,6 +12670,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/primary) "aGi" = ( @@ -15281,10 +15282,10 @@ /area/quartermaster/sorting) "aNK" = ( /obj/structure/table, -/obj/item/destTagger, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aNL" = ( @@ -18931,8 +18932,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 +27979,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 +34645,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 +34652,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" = ( 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/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index b2b404f7289..159de484c17 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1111,6 +1111,7 @@ /obj/structure/table, /obj/machinery/light, /obj/item/storage/firstaid/regular, +/obj/item/healthanalyzer/advanced, /turf/open/floor/plasteel, /area/storage/primary) "dP" = ( @@ -2242,6 +2243,11 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/space/nearstation) +"sH" = ( +/obj/structure/table, +/obj/item/storage/box/shipping, +/turf/open/floor/plasteel, +/area/storage/primary) "tG" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -7852,7 +7858,7 @@ dJ dJ dJ dJ -dN +sH cS fU gb 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/achievements.dm b/code/__DEFINES/achievements.dm index acf77ed73e1..65bced18233 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -21,6 +21,7 @@ #define MEDAL_CLEANBOSS "Cleanboss" #define MEDAL_RULE8 "Rule 8" #define MEDAL_LONGSHIFT "longshift" +#define MEDAL_SNAIL "KKKiiilll mmmeee" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" @@ -38,6 +39,7 @@ #define BOSS_MEDAL_LEGION "Legion Killer" #define BOSS_MEDAL_TENDRIL "Tendril Exterminator" #define BOSS_MEDAL_SWARMERS "Swarmer Beacon Killer" +#define BOSS_MEDAL_KINGGOAT "King Goat Killer" #define BOSS_MEDAL_MINER_CRUSHER "Blood-drunk Miner Crusher" #define BOSS_MEDAL_BUBBLEGUM_CRUSHER "Bubblegum Crusher" @@ -46,6 +48,7 @@ #define BOSS_MEDAL_HIEROPHANT_CRUSHER "Hierophant Crusher" #define BOSS_MEDAL_LEGION_CRUSHER "Legion Crusher" #define BOSS_MEDAL_SWARMERS_CRUSHER "Swarmer Beacon Crusher" +#define BOSS_MEDAL_KINGGOAT_CRUSHER "King Goat Crusher" // Medal hub IDs for boss-kill scores #define BOSS_SCORE "Bosses Killed" @@ -56,4 +59,5 @@ #define HIEROPHANT_SCORE "Hierophants Killed" #define LEGION_SCORE "Legion Killed" #define SWARMER_BEACON_SCORE "Swarmer Beacs Killed" +#define KINGGOAT_SCORE "King Goat Killed" #define TENDRIL_CLEAR_SCORE "Tendrils Killed" diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 5a7f465ee24..64d661d4108 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -20,7 +20,7 @@ #define POD_STYLES list(\ list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ + list("centcompod", "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 69a3fb941dd..fcd819098e1 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -135,6 +135,14 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) #define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) +#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle) +#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while +#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1) + +#define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) +#define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1) +#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) +#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) //Gun weapon weight #define WEAPON_LIGHT 1 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 69% rename from code/__DEFINES/components.dm rename to code/__DEFINES/dcs/signals.dm index badaaef9ce8..e96bfb2e236 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -1,442 +1,405 @@ -/// 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) - -// /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 - -/*******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" + +/// fires on the target datum when an element is attached to it (/datum/element) +#define COMSIG_ELEMENT_ATTACH "element_attach" +/// fires on the target datum when an element is attached to it (/datum/element) +#define COMSIG_ELEMENT_DETACH "element_detach" + +// /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 signals for economy +#define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem +#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" //called when a wrapped up structure is opened by hand +#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" //called when a wrapped up item is opened by hand + #define COMSIG_ITEM_SPLIT_VALUE 1 +#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" //Called when getting the item's exact ratio for cargo's profit. + +// /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 +#define COMSIG_HUMAN_EMBED_RIP "item_embed_removing" // called on human when said human tries to rip out this embedded item (mob/living/carbon/human/target, /obj/item, /obj/item/bodypart/L) +#define COMSIG_HUMAN_EMBED_REMOVAL "item_embed_remove_surgery" // called on human from /datum/surgery_step/remove_object/success (mob/living/carbon/human/target, /obj/item, /obj/item/bodypart/L) + +// /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/flags.dm b/code/__DEFINES/flags.dm index 835114b2c6c..cad7d57fb49 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -92,10 +92,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ZAP_OBJ_DAMAGE (1<<2) #define ZAP_MOB_DAMAGE (1<<3) #define ZAP_MOB_STUN (1<<4) -#define ZAP_IS_TESLA (1<<5) #define ZAP_DEFAULT_FLAGS ALL -#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA +#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN #define ZAP_SUPERMATTER_FLAGS NONE //EMP protection 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..04242823456 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -16,7 +16,7 @@ #define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage)) #define PERCENT(val) (round((val)*100, 0.1)) -#define CLAMP01(x) (CLAMP(x, 0, 1)) +#define CLAMP01(x) (clamp(x, 0, 1)) //time of day but automatically adjusts to the server going into the next day within the same round. //for when you need a reliable time number that doesn't depend on byond time. @@ -30,27 +30,14 @@ // 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))) ) // Real modulus that handles decimals #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)) +#define COT(x) (1 / tan(x)) // Secant #define SEC(x) (1 / cos(x)) @@ -188,8 +175,8 @@ while(pixel_y < -16) pixel_y += 32 new_y-- - new_x = CLAMP(new_x, 0, world.maxx) - new_y = CLAMP(new_y, 0, world.maxy) + new_x = clamp(new_x, 0, world.maxx) + new_y = clamp(new_y, 0, world.maxy) return locate(new_x, new_y, starting.z) // Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles @@ -214,7 +201,7 @@ #define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) ) -#define LORENTZ_DISTRIBUTION(x, s) ( s*TAN(TODEGREES(PI*(rand()-0.5))) + x ) +#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x ) #define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) #define RULE_OF_THREE(a, b, x) ((a*x)/b) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 89097b48e3f..0160aecb034 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -266,6 +266,7 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define FIRST_DIAG_STEP 1 #define SECOND_DIAG_STEP 2 +#define DEADCHAT_ANNOUNCEMENT "announcement" #define DEADCHAT_ARRIVALRATTLE "arrivalrattle" #define DEADCHAT_DEATHRATTLE "deathrattle" #define DEADCHAT_LAWCHANGE "lawchange" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index c5e6c1fc2ae..bbcab316b27 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -35,8 +35,8 @@ #define VENTCRAWLER_ALWAYS 2 //Bloodcrawling defines -#define BLOODCRAWL 1 -#define BLOODCRAWL_EAT 2 +#define BLOODCRAWL 1 /// bloodcrawling, see: [/mob/living/var/bloodcrawl] +#define BLOODCRAWL_EAT 2 /// crawling+mob devour //Mob bio-types flags #define MOB_ORGANIC 1 << 0 @@ -242,9 +242,9 @@ ///The shock doesn't stun. #define SHOCK_NOSTUN (1 << 3) -#define INCORPOREAL_MOVE_BASIC 1 -#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows -#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt +#define INCORPOREAL_MOVE_BASIC 1 /// normal movement, see: [/mob/living/var/incorporeal_move] +#define INCORPOREAL_MOVE_SHADOW 2 /// leaves a trail of shadows +#define INCORPOREAL_MOVE_JAUNT 3 /// is blocked by holy water/salt //Secbot and ED209 judgement criteria bitflag values #define JUDGE_EMAGGED (1<<0) 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/reagents.dm b/code/__DEFINES/reagents.dm index bf307f74055..d6648af5383 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -29,7 +29,6 @@ #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) #define CLEAR_REAGENTS 4 // all reagents were cleared -#define REACT_REAGENTS 5 // a reaction occured #define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds #define TRESHOLD_UNHUSK 50 //Health treshold for instabitaluri and rezadone to unhusk someone diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 85314155c58..8e4fc4ca1d8 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -1,9 +1,8 @@ - +///Defines for the R&D console, see: [/modules/research/rdconsole][rdconsole] #define RDCONSOLE_UI_MODE_NORMAL 1 #define RDCONSOLE_UI_MODE_EXPERT 2 #define RDCONSOLE_UI_MODE_LIST 3 -//RDSCREEN screens #define RDSCREEN_MENU 0 #define RDSCREEN_TECHDISK 1 #define RDSCREEN_DESIGNDISK 20 @@ -27,6 +26,7 @@ #define RDSCREEN_NOBREAK "" +///Sanity check defines for when these devices aren't connected or no disk is inserted #define RDSCREEN_TEXT_NO_PROTOLATHE "

No Protolathe Linked!


" #define RDSCREEN_TEXT_NO_IMPRINTER "

No Circuit Imprinter Linked!


" #define RDSCREEN_TEXT_NO_DECONSTRUCT "

No Destructive Analyzer Linked!


" @@ -43,12 +43,14 @@ #define RDSCREEN_UI_SNODE_CHECK if(!selected_node) { return RDSCREEN_TEXT_NO_SNODE } #define RDSCREEN_UI_SDESIGN_CHECK if(!selected_design) { return RDSCREEN_TEXT_NO_SDESIGN } +///Defines for the Protolathe screens, see: [/modules/research/machinery/protolathe][Protolathe] #define RESEARCH_FABRICATOR_SCREEN_MAIN 1 #define RESEARCH_FABRICATOR_SCREEN_CHEMICALS 2 #define RESEARCH_FABRICATOR_SCREEN_MATERIALS 3 #define RESEARCH_FABRICATOR_SCREEN_SEARCH 4 #define RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW 5 +///Department flags for techwebs. Defines which department can print what from each protolathe so Cargo can't print guns, etc. #define DEPARTMENTAL_FLAG_SECURITY (1<<0) #define DEPARTMENTAL_FLAG_MEDICAL (1<<1) #define DEPARTMENTAL_FLAG_CARGO (1<<2) @@ -56,28 +58,28 @@ #define DEPARTMENTAL_FLAG_ENGINEERING (1<<4) #define DEPARTMENTAL_FLAG_SERVICE (1<<5) #define DEPARTMENTAL_FLAG_ALL (1<<6) //NO THIS DOESN'T ALLOW YOU TO PRINT EVERYTHING, IT'S FOR ALL DEPARTMENTS! -//#define DEPARTMENTAL_FLAG_MINING (1<<7) +//#define DEPARTMENTAL_FLAG_MINING (1<<7) //I swear I'm actually going to use this eventually leave it here -#define DESIGN_ID_IGNORE "IGNORE_THIS_DESIGN" +#define DESIGN_ID_IGNORE "IGNORE_THIS_DESIGN" ///For instances where we don't want a design showing up due to it being for debug/sanity purposes #define RESEARCH_MATERIAL_RECLAMATION_ID "__materials" -//When adding new types, update the list below! +///Techweb names for new point types. Can be used to define specific point values for specific types of research (science, security, engineering, etc.) #define TECHWEB_POINT_TYPE_GENERIC "General Research" #define TECHWEB_POINT_TYPE_NANITES "Nanite Research" #define TECHWEB_POINT_TYPE_DEFAULT TECHWEB_POINT_TYPE_GENERIC -//defined here so people don't forget to change this! +///Associative names for techweb point values, see: [/modules/research/techweb/all_nodes][all_nodes] #define TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES list(\ TECHWEB_POINT_TYPE_GENERIC = "General Research",\ TECHWEB_POINT_TYPE_NANITES = "Nanite Research"\ ) -#define TECHWEB_BOMB_POINTCAP 50000 //Adjust as needed; Stops toxins from nullifying RND progression mechanics. Current Value Cap Radius: 100 - -//research point values for slime extracts +///R&D point value for a maxcap bomb. Can be adjusted if need be. Current Value Cap Radius: 100 +#define TECHWEB_BOMB_POINTCAP 50000 +///Research point values for slime extracts, see: [/modules/research/xenobiology/xenobio_camera][xenobio_camera] #define SLIME_RESEARCH_TIER_0 100 #define SLIME_RESEARCH_TIER_1 500 #define SLIME_RESEARCH_TIER_2 1000 diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index e45ba3d2bb2..8da9a806493 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -4,11 +4,11 @@ //Bot defines, placed here so they can be read by other things! #define BOT_STEP_DELAY 4 //Delay between movemements -#define BOT_STEP_MAX_RETRIES 5 //Maximum times a bot will retry to step from its position +#define BOT_STEP_MAX_RETRIES 5 //Maximum times a bot will retry to step from its position #define DEFAULT_SCAN_RANGE 7 //default view range for finding targets. -//Mode defines +//Mode defines. If you add a new one make sure you update mode_name in /mob/living/simple_animal/bot #define BOT_IDLE 0 // idle #define BOT_HUNT 1 // found target, hunting #define BOT_PREP_ARREST 2 // at target, preparing to arrest @@ -27,6 +27,7 @@ #define BOT_NAV 15 // computing navigation #define BOT_WAIT_FOR_NAV 16 // waiting for nav computation #define BOT_NO_ROUTE 17 // no destination beacon found (or no route) +#define BOT_SHOWERSTANCE 18 // cleaning unhygienic humans //Bot types #define SEC_BOT (1<<0) // Secutritrons (Beepsky) and ED-209s @@ -36,6 +37,7 @@ #define MED_BOT (1<<4) // Medibots #define HONK_BOT (1<<5) // Honkbots & ED-Honks #define FIRE_BOT (1<<6) // Firebots +#define HYGIENE_BOT (1<<7) // Hygienebots //AI notification defines #define NEW_BORG 1 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/rust_g.dm b/code/__DEFINES/rust_g.dm index ccd5b92c79d..509ad461504 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -1,10 +1,27 @@ // rust_g.dm - DM API for rust_g extension library #define RUST_G "rust_g" +#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" +#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" +#define RUSTG_JOB_ERROR "JOB PANICKED" + #define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname) +#define rustg_dmi_create_png(fname,width,height,data) call(RUST_G, "dmi_create_png")(fname,width,height,data) #define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev) #define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev) #define rustg_log_write(fname, text) call(RUST_G, "log_write")(fname, text) /proc/rustg_log_close_all() return call(RUST_G, "log_close_all")() + +// RUST-G defines & procs for HTTP component +#define RUSTG_HTTP_METHOD_GET "get" +#define RUSTG_HTTP_METHOD_POST "post" +#define RUSTG_HTTP_METHOD_PUT "put" +#define RUSTG_HTTP_METHOD_DELETE "delete" +#define RUSTG_HTTP_METHOD_PATCH "patch" +#define RUSTG_HTTP_METHOD_HEAD "head" + +#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers) +#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers) +#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index ee3f3ee70fa..e61cb51ab77 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -24,7 +24,7 @@ #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 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..269d41365b8 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 @@ -258,3 +259,4 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SLEEPING_CARP_TRAIT "sleeping_carp" #define MADE_UNCLONEABLE "made-uncloneable" #define TIMESTOP_TRAIT "timestop" +#define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name 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/mobs.dm b/code/__HELPERS/mobs.dm index b0e42aff3fc..605bd0d3aab 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -425,7 +425,7 @@ GLOBAL_LIST_EMPTY(species_list) var/override = FALSE if(M.client.holder && (chat_toggles & CHAT_DEAD)) override = TRUE - if(HAS_TRAIT(M, TRAIT_SIXTHSENSE)) + if(HAS_TRAIT(M, TRAIT_SIXTHSENSE) && message_type == DEADCHAT_REGULAR) override = TRUE if(isnewplayer(M) && !override) continue diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 1d3c9bf3441..a8baf3a1d7d 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -2,9 +2,9 @@ /proc/sanitize_frequency(frequency, free = FALSE) frequency = round(frequency) if(free) - . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) + . = clamp(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) else - . = CLAMP(frequency, MIN_FREQ, MAX_FREQ) + . = clamp(frequency, MIN_FREQ, MAX_FREQ) if(!(. % 2)) // Ensure the last digit is an odd number . += 1 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/type2type.dm b/code/__HELPERS/type2type.dm index 2026397a047..a50b364d821 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -120,27 +120,8 @@ return //Converts an angle (degrees) into an ss13 direction -/proc/angle2dir(degree) - degree = SIMPLIFY_DEGREES(degree) - switch(degree) - if(0 to 22.5) //north requires two angle ranges - return NORTH - if(22.5 to 67.5) //each range covers 45 degrees - return NORTHEAST - if(67.5 to 112.5) - return EAST - if(112.5 to 157.5) - return SOUTHEAST - if(157.5 to 202.5) - return SOUTH - if(202.5 to 247.5) - return SOUTHWEST - if(247.5 to 292.5) - return WEST - if(292.5 to 337.5) - return NORTHWEST - if(337.5 to 360) - return NORTH +GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST)) +#define angle2dir(X) (GLOB.modulo_angle_to_dir[round((((X%360)+382.5)%360)/45)+1]) /proc/angle2dir_cardinal(degree) degree = SIMPLIFY_DEGREES(degree) @@ -548,4 +529,3 @@ return "turf" else //regex everything else (works for /proc too) return lowertext(replacetext("[the_type]", "[type2parent(the_type)]/", "")) - diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bb3a7136815..70a24287f3a 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. */ @@ -859,8 +850,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tX = splittext(tX[1], ":") tX = tX[1] var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = CLAMP(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) - tY = CLAMP(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) + tX = clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) + tY = clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) return locate(tX, tY, tZ) /proc/screen_loc2turf(text, turf/origin, client/C) @@ -873,8 +864,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tX = text2num(tX[2]) tZ = origin.z var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = CLAMP(origin.x + round(actual_view[1] / 2) - tX, 1, world.maxx) - tY = CLAMP(origin.y + round(actual_view[2] / 2) - tY, 1, world.maxy) + tX = clamp(origin.x + round(actual_view[1] / 2) - tX, 1, world.maxx) + tY = clamp(origin.y + round(actual_view[2] / 2) - tY, 1, world.maxy) return locate(tX, tY, tZ) /proc/IsValidSrc(datum/D) 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/bitfields.dm b/code/_globalvars/bitfields.dm index 14ed32967c6..dce002235b1 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -155,7 +155,6 @@ GLOBAL_LIST_INIT(bitfields, list( "ZAP_MOB_STUN" = ZAP_MOB_STUN, "ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES, "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE, - "ZAP_IS_TESLA" = ZAP_IS_TESLA, ), "smooth" = list( "SMOOTH_TRUE" = SMOOTH_TRUE, diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 87dd36803df..01cdf38b265 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, @@ -139,6 +140,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/bodybag = 1, /obj/item/grenade/smokebomb = 1, /obj/item/stack/spacecash/c10 = 1, + /obj/item/stack/sticky_tape = 1, //light sources /obj/item/flashlight = 1, @@ -215,6 +217,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items list(//food /obj/item/reagent_containers/food/snacks/canned/peaches/maint = 1, + /obj/item/storage/box/gum/happiness = 1, /obj/item/storage/box/donkpockets = 1, list(//Donk Varieties /obj/item/storage/box/donkpockets/donkpocketspicy = 1, diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 2e0a70dcdcf..578db6d69d3 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -42,6 +42,8 @@ GLOBAL_VAR(tgui_log) GLOBAL_PROTECT(tgui_log) GLOBAL_VAR(world_shuttle_log) GLOBAL_PROTECT(world_shuttle_log) +GLOBAL_VAR(discord_api_log) +GLOBAL_PROTECT(discord_api_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) 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/click.dm b/code/_onclick/click.dm index 5fe96c168ac..bcfed9aa069 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -29,15 +29,15 @@ adj += S.nextmove_adjust() next_move = world.time + ((num + adj)*mod) -/* - Before anything else, defer these calls to a per-mobtype handler. This allows us to - remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. - - Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, - that's a lot of code duplication and is hard to maintain. - - Note that this proc can be overridden, and is in the case of screen objects. -*/ +/** + * Before anything else, defer these calls to a per-mobtype handler. This allows us to + * remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. + * + * Alternately, you could hardcode every mob's variation in a flat [/mob/proc/ClickOn] proc; however, + * that's a lot of code duplication and is hard to maintain. + * + * Note that this proc can be overridden, and is in the case of screen objects. + */ /atom/Click(location,control,params) if(flags_1 & INITIALIZED_1) SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) @@ -51,19 +51,19 @@ if(flags_1 & INITIALIZED_1) usr.MouseWheelOn(src, delta_x, delta_y, params) -/* - Standard mob ClickOn() - Handles exceptions: Buildmode, middle click, modified clicks, mech actions - - After that, mostly just check your state, check whether you're holding an item, - check whether you're adjacent to the target, then pass off the click to whoever - is receiving it. - The most common are: - * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves - * atom/attackby(item,user) - used only when adjacent - * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent - * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed -*/ +/** + * Standard mob ClickOn() + * Handles exceptions: Buildmode, middle click, modified clicks, mech actions + * + * After that, mostly just check your state, check whether you're holding an item, + * check whether you're adjacent to the target, then pass off the click to whoever + * is receiving it. + * The most common are: + * * [mob/proc/UnarmedAttack] (atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves + * * [atom/proc/attackby] (item,user) - used only when adjacent + * * [obj/item/proc/afterattack] (atom,user,adjacent,params) - used both ranged and adjacent + * * [mob/proc/RangedAttack] (atom,params) - used only ranged, only used for tk and laser eyes but could be changed + */ /mob/proc/ClickOn( atom/A, params ) if(world.time <= next_click) return @@ -158,7 +158,7 @@ else RangedAttack(A,params) -//Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it +/// Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it /atom/proc/IsObscured() if(!isturf(loc)) //This only makes sense for things directly on turfs for now return FALSE @@ -177,9 +177,11 @@ return TRUE return FALSE +/** + * A backwards depth-limited breadth-first-search to see if the target is + * logically "in" anything adjacent to us. + */ /atom/movable/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) - // A backwards depth-limited breadth-first-search to see if the target is - // logically "in" anything adjacent to us. var/list/direct_access = DirectAccess() var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH) @@ -243,48 +245,48 @@ return qdel(dummy) -// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) +/// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) /mob/proc/DblClickOn(atom/A, params) return -/* - Translates into attack_hand, etc. - - Note: proximity_flag here is used to distinguish between normal usage (flag=1), - and usage when clicking on things telekinetically (flag=0). This proc will - not be called at ranged except with telekinesis. - - proximity_flag is not currently passed to attack_hand, and is instead used - in human click code to allow glove touches only at melee range. -*/ +/** + * Translates into [atom/proc/attack_hand], etc. + * + * Note: proximity_flag here is used to distinguish between normal usage (flag=1), + * and usage when clicking on things telekinetically (flag=0). This proc will + * not be called at ranged except with telekinesis. + * + * proximity_flag is not currently passed to attack_hand, and is instead used + * in human click code to allow glove touches only at melee range. + */ /mob/proc/UnarmedAttack(atom/A, proximity_flag) if(ismob(A)) changeNext_move(CLICK_CD_MELEE) return -/* - Ranged unarmed attack: - - This currently is just a default for all mobs, involving - laser eyes and telekinesis. You could easily add exceptions - for things like ranged glove touches, spitting alien acid/neurotoxin, - animals lunging, etc. -*/ +/** + * Ranged unarmed attack: + * + * This currently is just a default for all mobs, involving + * laser eyes and telekinesis. You could easily add exceptions + * for things like ranged glove touches, spitting alien acid/neurotoxin, + * animals lunging, etc. + */ /mob/proc/RangedAttack(atom/A, params) SEND_SIGNAL(src, COMSIG_MOB_ATTACK_RANGED, A, params) -/* - Restrained ClickOn - - Used when you are handcuffed and click things. - Not currently used by anything but could easily be. -*/ +/** + * Restrained ClickOn + * + * Used when you are handcuffed and click things. + * Not currently used by anything but could easily be. + */ /mob/proc/RestrainedClickOn(atom/A) return /** - *Middle click - *Mainly used for swapping hands + * Middle click + * Mainly used for swapping hands */ /mob/proc/MiddleClickOn(atom/A) . = SEND_SIGNAL(src, COMSIG_MOB_MIDDLECLICKON, A) @@ -292,11 +294,11 @@ return swap_hand() -/* - Shift click - For most mobs, examine. - This is overridden in ai.dm -*/ +/** + * Shift click + * For most mobs, examine. + * This is overridden in ai.dm + */ /mob/proc/ShiftClickOn(atom/A) A.ShiftClick(src) return @@ -307,11 +309,10 @@ user.examinate(src) return -/* - Ctrl click - For most objects, pull -*/ - +/** + * Ctrl click + * For most objects, pull + */ /mob/proc/CtrlClickOn(atom/A) A.CtrlClick(src) return @@ -331,10 +332,10 @@ H.changeNext_move(CLICK_CD_MELEE) else ..() -/* - Alt click - Unused except for AI -*/ +/** + * Alt click + * Unused except for AI + */ /mob/proc/AltClickOn(atom/A) . = SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, A) if(. & COMSIG_MOB_CANCEL_CLICKON) @@ -348,7 +349,7 @@ user.listed_turf = T user.client.statpanel = T.name -// Use this instead of /mob/proc/AltClickOn(atom/A) where you only want turf content listing without additional atom alt-click interaction +/// Use this instead of [/mob/proc/AltClickOn] where you only want turf content listing without additional atom alt-click interaction /atom/proc/AltClickNoInteract(mob/user, atom/A) var/turf/T = get_turf(A) if(T && user.TurfAdjacent(T)) @@ -358,10 +359,10 @@ /mob/proc/TurfAdjacent(turf/T) return T.Adjacent(src) -/* - Control+Shift click - Unused except for AI -*/ +/** + * Control+Shift click + * Unused except for AI + */ /mob/proc/CtrlShiftClickOn(atom/A) A.CtrlShiftClick(src) return @@ -379,7 +380,7 @@ face_atom: turns the mob towards what you clicked on */ -// Simple helper to face what you clicked on, in case it should be needed in more than one place +/// Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(atom/A) if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return @@ -452,8 +453,7 @@ T.Click(location, control, params) . = 1 -/* MouseWheelOn */ - +/// MouseWheelOn /mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params) return diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index e028212e96b..5e474331f61 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -102,8 +102,8 @@ add_overlay(standard_background) /obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) - width = CLAMP(width, 0, max_dimensions) - height = CLAMP(height, 0, max_dimensions) + width = clamp(width, 0, max_dimensions) + height = clamp(height, 0, max_dimensions) src.width = width src.height = height diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index ddb8aedad18..d8a1281df82 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -47,7 +47,7 @@ /obj/screen/plane_master/floor/backdrop(mob/mymob) filters = list() if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(CLAMP(mymob.eye_blurry*0.1,0.6,3)) + filters += GAUSSIAN_BLUR(clamp(mymob.eye_blurry*0.1,0.6,3)) /obj/screen/plane_master/game_world name = "game world plane master" @@ -60,7 +60,7 @@ if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion) filters += AMBIENT_OCCLUSION if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(CLAMP(mymob.eye_blurry*0.1,0.6,3)) + filters += GAUSSIAN_BLUR(clamp(mymob.eye_blurry*0.1,0.6,3)) /obj/screen/plane_master/lighting name = "lighting plane master" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 47bf212c768..3028bf7a904 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,11 +1,11 @@ /** - *This is the proc that handles the order of an item_attack. - *The order of procs called is: - *tool_act on the target. If it returns TRUE, the chain will be stopped. - *pre_attack() on src. If this returns TRUE, the chain will be stopped. - *attackby on the target. If it returns TRUE, the chain will be stopped. - *and lastly - *afterattack. The return value does not matter. + * This is the proc that handles the order of an item_attack. + * + * The order of procs called is: + * * [/atom/proc/tool_act] on the target. If it returns TRUE, the chain will be stopped. + * * [/obj/item/proc/pre_attack] on src. If this returns TRUE, the chain will be stopped. + * * [/atom/proc/attackby] on the target. If it returns TRUE, the chain will be stopped. + * * [/obj/item/proc/afterattack]. The return value does not matter. */ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) @@ -19,18 +19,37 @@ return afterattack(target, user, TRUE, params) -// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. +/// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT) return interact(user) +/** + * Called on the item before it hits something + * + * Arguments: + * * atom/A - The atom about to be hit + * * mob/living/user - The mob doing the htting + * * params - click params such as alt/shift etc + * + * See: [/obj/item/proc/melee_attack_chain] + */ /obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby! if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK) return TRUE return FALSE //return TRUE to avoid calling attackby after this proc does stuff -// No comment +/** + * Called on an object being hit by an item + * + * Arguments: + * * obj/item/W - The item hitting this atom + * * mob/user - The wielder of this item + * * params - click params such as alt/shift etc + * + * See: [/obj/item/proc/melee_attack_chain] + */ /atom/proc/attackby(obj/item/W, mob/user, params) if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) return TRUE @@ -45,7 +64,13 @@ user.changeNext_move(CLICK_CD_MELEE) return I.attack(src, user) - +/** + * Called from [/mob/living/attackby] + * + * Arguments: + * * mob/living/M - The mob being hit by this item + * * mob/living/user - The mob hitting with this item + */ /obj/item/proc/attack(mob/living/M, mob/living/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK) return @@ -75,7 +100,7 @@ add_fingerprint(user) -//the equivalent of the standard version of attack() but for object targets. +/// The equivalent of the standard version of [/obj/item/proc/attack] but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) return @@ -85,6 +110,7 @@ user.do_attack_animation(O) O.attacked_by(src, user) +/// Called from [/obj/item/proc/attack_obj] and [/obj/item/proc/attack] if the attack succeeds /atom/movable/proc/attacked_by() return @@ -115,13 +141,20 @@ else return ..() -// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. -// Click parameters is the params string from byond Click() code, see that documentation. +/** + * Last proc in the [/obj/item/proc/melee_attack_chain] + * + * Arguments: + * * atom/target - The thing that was hit + * * mob/user - The mob doing the hitting + * * proximity_flag - is 1 if this afterattack was called on something adjacent, in your square, or on your person. + * * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation. + */ /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) -// Called if the target gets deleted by our attack +/// Called if the target gets deleted by our attack /obj/item/proc/attack_qdeleted(atom/target, mob/user, proximity_flag, click_parameters) SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters) SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters) @@ -129,9 +162,9 @@ /obj/item/proc/get_clamped_volume() if(w_class) if(force) - return CLAMP((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 + return clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 else - return CLAMP(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 + return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 /mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area) var/message_verb = "attacked" 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/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1d6c4d82852..00ab119f219 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -22,7 +22,7 @@ SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A, proximity) A.attack_hand(src) -//Return TRUE to cancel other attack hand effects that respect it. +/// Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user) . = FALSE if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 0115d5cb975..b6245085b38 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -98,7 +98,7 @@ return FALSE var/temp = text2num(trim(str_val)) if(!isnull(temp)) - config_entry_value = CLAMP(integer ? round(temp) : temp, min_val, max_val) + config_entry_value = clamp(integer ? round(temp) : temp, min_val, max_val) if(config_entry_value != temp && !(datum_flags & DF_VAR_EDITED)) log_config("Changing [name] from [temp] to [config_entry_value]!") return TRUE diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 210b3e8cacb..467c27f6b02 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -484,3 +484,13 @@ /datum/config_entry/flag/reopen_roundstart_suicide_roles_command_report /datum/config_entry/flag/auto_profile + +// DISCORD ROLE STUFFS +// Using strings for everything because BYOND does not like numbers this big +/datum/config_entry/flag/enable_discord_autorole + +/datum/config_entry/string/discord_token + +/datum/config_entry/string/discord_guildid + +/datum/config_entry/string/discord_roleid diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index eb3e65b54da..15f2f59cad0 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -56,6 +56,7 @@ SUBSYSTEM_DEF(atoms) testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() +/// Init this specific atom /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) var/the_type = A.type if(QDELING(A)) 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/discord.dm b/code/controllers/subsystem/discord.dm index 73105a33217..a76edd50da5 100644 --- a/code/controllers/subsystem/discord.dm +++ b/code/controllers/subsystem/discord.dm @@ -1,4 +1,4 @@ -/* +/* NOTES: There is a DB table to track ckeys and associated discord IDs. This system REQUIRES TGS, and will auto-disable if TGS is not present. @@ -15,7 +15,7 @@ ROUNDSTART: 2] A ping is sent to the discord with the IDs of people who wished to be notified 3] The file is emptied -MIDROUND: +MIDROUND: 1] Someone usees the notify verb, it adds their discord ID to the list. 2] On fire, it will write that to the disk, as long as conditions above are correct @@ -43,7 +43,7 @@ SUBSYSTEM_DEF(discord) enabled = 1 // Allows other procs to use this (Account linking, etc) else can_fire = 0 // We dont want excess firing - return ..() // Cancel + return ..() // Cancel try people_to_notify = json_decode(file2text(notify_file)) @@ -57,18 +57,18 @@ SUBSYSTEM_DEF(discord) send2chat("[notifymsg]", CONFIG_GET(string/chat_announce_new_game)) // Sends the message to the discord, using same config option as the roundstart notification fdel(notify_file) // Deletes the file return ..() - + /datum/controller/subsystem/discord/fire() if(!enabled) return // Dont do shit if its disabled if(notify_members == notify_members_cache) - return // Dont re-write the file + return // Dont re-write the file // If we are all clear write_notify_file() - + /datum/controller/subsystem/discord/Shutdown() write_notify_file() // Guaranteed force-write on server close - + /datum/controller/subsystem/discord/proc/write_notify_file() if(!enabled) // Dont do shit if its disabled return @@ -113,3 +113,20 @@ SUBSYSTEM_DEF(discord) /datum/controller/subsystem/discord/proc/id_clean(input) var/regex/num_only = regex("\[^0-9\]", "g") return num_only.Replace(input, "") + +/datum/controller/subsystem/discord/proc/grant_role(id) + // Ignore this shit if config isnt enabled for it + if(!CONFIG_GET(flag/enable_discord_autorole)) + return + + var/url = "https://discordapp.com/api/guilds/[CONFIG_GET(string/discord_guildid)]/members/[id]/roles/[CONFIG_GET(string/discord_roleid)]" + + // Make the request + + var/datum/http_request/req = new() + req.prepare(RUSTG_HTTP_METHOD_PUT, url, "", list("Authorization" = "Bot [CONFIG_GET(string/discord_token)]")) + req.begin_async() + UNTIL(req.is_complete()) + var/datum/http_response/res = req.into_response() + + WRITE_LOG(GLOB.discord_api_log, "PUT [url] returned [res.status_code] [res.body]") diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 54bbabdb005..226af527400 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -19,6 +19,7 @@ SUBSYSTEM_DEF(persistence) var/list/picture_logging_information = list() var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums + var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() LoadPoly() @@ -30,6 +31,7 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() + LoadPaintings() return ..() /datum/controller/subsystem/persistence/proc/LoadPoly() @@ -176,6 +178,7 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) CollectAntagReputation() SaveRandomizedRecipes() + SavePaintings() /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") @@ -338,7 +341,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 +357,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 +367,23 @@ 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)) + +/datum/controller/subsystem/persistence/proc/LoadPaintings() + var/json_file = file("data/paintings.json") + if(fexists(json_file)) + paintings = json_decode(file2text(json_file)) + + for(var/obj/structure/sign/painting/P in world) + P.load_persistent() + +/datum/controller/subsystem/persistence/proc/SavePaintings() + for(var/obj/structure/sign/painting/P in world) + P.save_persistent() + + var/json_file = file("data/paintings.json") + fdel(json_file) + WRITE_FILE(json_file, json_encode(paintings)) 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/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 8966f85d2f9..1a8d7d4e2d8 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -235,7 +235,7 @@ SUBSYSTEM_DEF(shuttle) var/area/A = get_area(user) log_shuttle("[key_name(user)] has called the emergency shuttle.") - deadchat_broadcast(" has called the shuttle at [A.name].", "[user.real_name]", user) + deadchat_broadcast(" has called the shuttle at [A.name].", "[user.real_name]", user, message_type=DEADCHAT_ANNOUNCEMENT) if(call_reason) SSblackbox.record_feedback("text", "shuttle_reason", 1, "[call_reason]") log_shuttle("Shuttle call reason: [call_reason]") @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(shuttle) emergency.cancel(get_area(user)) log_shuttle("[key_name(user)] has recalled the shuttle.") message_admins("[ADMIN_LOOKUPFLW(user)] has recalled the shuttle.") - deadchat_broadcast(" has recalled the shuttle from [get_area_name(user, TRUE)].", "[user.real_name]", user) + deadchat_broadcast(" has recalled the shuttle from [get_area_name(user, TRUE)].", "[user.real_name]", user, message_type=DEADCHAT_ANNOUNCEMENT) return 1 /datum/controller/subsystem/shuttle/proc/canRecall() 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/achievements/_awards.dm b/code/datums/achievements/_awards.dm index 0edf24a922d..06fa6ce475d 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -2,7 +2,7 @@ ///Name of the achievement, If null it wont show up in the achievement browser. (Handy for inheritance trees) var/name var/desc = "You did it." - ///Found in /datum/asset/spritesheet/simple/achievements + ///Found in UI_Icons/Achievements var/icon = "default" var/category = "Normal" diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm index 1c0cc0ad9ee..b15b848b479 100644 --- a/code/datums/achievements/boss_achievements.dm +++ b/code/datums/achievements/boss_achievements.dm @@ -56,6 +56,12 @@ database_id = BOSS_MEDAL_SWARMERS icon = "swarmer" +/datum/award/achievement/boss/king_goat_kill + name = "King Goat Killer" + desc = "The king is dead, long live the king!" + database_id = BOSS_MEDAL_KINGGOAT + icon = "goatboss" + /datum/award/achievement/boss/blood_miner_crusher name = "Blood-drunk Miner Crusher" desc = "I guess he couldn't handle his drink that well." @@ -95,3 +101,9 @@ name = "Swarm Beacon Crusher" desc = "GET THEM OFF OF ME!" database_id = BOSS_MEDAL_SWARMERS_CRUSHER + +/datum/award/achievement/boss/king_goat_crusher + name = "King Goat Crusher" + desc = "The king is dead, long live the king!" + database_id = BOSS_MEDAL_KINGGOAT_CRUSHER + icon = "goatboss" diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 3d3fe61a9f0..c81d2c51ddb 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -43,7 +43,7 @@ desc = "You janked hard" database_id = MEDAL_HELBITALJANKEN icon = "helbital" - + /datum/award/achievement/misc/getting_an_upgrade name = "Getting an upgrade" desc = "Make your first unique material item!" @@ -95,3 +95,9 @@ desc = "Well, that didn't take long." database_id = MEDAL_LONGSHIFT icon = "longshift" + +/datum/award/achievement/misc/snail + name = "KKKiiilll mmmeee" + desc = "You were a little too ambitious, but hey, I guess you're still alive?" + database_id = MEDAL_SNAIL + icon = "snail" diff --git a/code/datums/action.dm b/code/datums/action.dm index 32b7c643178..3c1913fdb38 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -277,11 +277,22 @@ icon_icon = 'icons/mob/actions/actions_spacesuit.dmi' button_icon_state = "thermal_off" +/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() @@ -323,6 +334,11 @@ button_icon_state = "vortex_recall" /datum/action/item_action/vortex_recall/IsAvailable() + var/turf/current_location = get_turf(target) + var/area/current_area = current_location.loc + if(current_area.noteleport) + to_chat(target, "[src] fizzles uselessly.") + return if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.teleporting) 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/phobia.dm b/code/datums/brain_damage/phobia.dm index 12faa9ba365..bb8e454d8d6 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -35,7 +35,7 @@ ..() if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return - if(is_blind(owner)) + if(owner.is_blind()) return if(world.time > next_check && world.time > next_scare) next_check = world.time + 50 diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index f5a0d1134e8..4874fd3581e 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -165,7 +165,7 @@ stress = max(stress - 4, 0) /datum/brain_trauma/severe/monophobia/proc/check_alone() - if(HAS_TRAIT(owner, TRAIT_BLIND)) + if(owner.is_blind()) return TRUE for(var/mob/M in oview(owner, 7)) if(!isliving(M)) //ghosts ain't people @@ -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/callback.dm b/code/datums/callback.dm index eb55fcb4862..95343844aa2 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -10,7 +10,7 @@ * you can also use the compiler define shorthand * var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype) * ``` - * + * * Note: proc strings can only be given for datum proc calls, global procs must be proc paths * * Also proc strings are strongly advised against because they don't compile error if the proc stops existing @@ -30,7 +30,7 @@ * .procname * * `CALLBACK(GLOBAL_PROC, .some_proc_here)` - * + * * ### proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents: * .procname * @@ -38,9 +38,9 @@ * * ### when the above doesn't apply: *.proc/procname - * + * * `CALLBACK(src, .proc/some_proc_here)` - * + * * * proc defined on a parent of a some type * @@ -50,7 +50,7 @@ */ /datum/callback - ///The object we will be calling the proc on + ///The object we will be calling the proc on var/datum/object = GLOBAL_PROC ///The proc we will be calling on the object var/delegate @@ -98,11 +98,11 @@ /** * Invoke this callback - * + * * Calls the registered proc on the registered object, if the user ref * can be resolved it also inclues that as an arg * - * If the datum being called on is varedited, the call is wrapped via WrapAdminProcCall + * If the datum being called on is varedited, the call is wrapped via [WrapAdminProcCall][/proc/WrapAdminProcCall] */ /datum/callback/proc/Invoke(...) if(!usr) @@ -131,7 +131,7 @@ /** * Invoke this callback async (waitfor=false) - * + * * Calls the registered proc on the registered object, if the user ref * can be resolved it also inclues that as an arg * @@ -195,7 +195,7 @@ * Runs a list of callbacks asyncronously, returning only when all have finished * * Callbacks can be repeated, to call it multiple times - * + * * Arguments: * * list/callbacks the list of callbacks to be called * * list/callback_args the list of lists of arguments to pass into each callback diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 8a4c8f682ff..984a298bef5 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -10,41 +10,54 @@ * Useful when you want shared behaviour independent of type inheritance */ /datum/component - /// Defines how duplicate existing components are handled when added to a datum - /// See `COMPONENT_DUPE_*` definitions for available options + /** + * Defines how duplicate existing components are handled when added to a datum + * + * See [COMPONENT_DUPE_*][COMPONENT_DUPE_ALLOWED] 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 + + /** + * 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 + + /** + * Only set to true if you are able to properly transfer this component + * + * At a minimum [RegisterWithParent][/datum/component/proc/RegisterWithParent] and [UnregisterFromParent][/datum/component/proc/UnregisterFromParent] should be used + * + * Make sure you also implement [PostTransfer][/datum/component/proc/PostTransfer] for any post transfer handling + */ var/can_transfer = FALSE /** * Create a new component. - * Additional arguments are passed to `Initialize()` + * + * Additional arguments are passed to [Initialize()][/datum/component/proc/Initialize] * * 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. + * * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead */ /datum/component/proc/Initialize(...) @@ -52,8 +65,10 @@ /** * Properly removes the component from `parent` and cleans up references - * Setting `force` makes it not check for and remove the component from the parent - * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal + * + * Arguments: + * * force - makes it not check for and remove the component from the parent + * * silent - deletes the component without sending a [COMSIG_COMPONENT_REMOVING] signal */ /datum/component/Destroy(force=FALSE, silent=FALSE) if(!force && parent) @@ -126,6 +141,7 @@ * Register the component with the parent object * * Use this proc to register with your parent object + * * Overridable proc that's called when added to a new parent */ /datum/component/proc/RegisterWithParent() @@ -135,6 +151,7 @@ * Unregister from our parent object * * Use this proc to unregister from your parent object + * * Overridable proc that's called when removed from a parent * * */ @@ -190,6 +207,7 @@ * Stop listening to a given signal from target * * Breaks the relationship between target and source datum, removing the callback when the signal fires + * * Doesn't care if a registration exists or not * * Arguments: @@ -229,7 +247,9 @@ /** * Called on a component when a component of the same type was added to the same parent - * See `/datum/component/var/dupe_mode` + * + * See [/datum/component/var/dupe_mode] + * * `C`'s type will always be the same of the called component */ /datum/component/proc/InheritComponent(datum/component/C, i_am_original) @@ -237,9 +257,12 @@ /** - * Called on a component when a component of the same type was added to the same parent with COMPONENT_DUPE_SELECTIVE - * See `/datum/component/var/dupe_mode` + * Called on a component when a component of the same type was added to the same parent with [COMPONENT_DUPE_SELECTIVE] + * + * See [/datum/component/var/dupe_mode] + * * `C`'s type will always be the same of the called component + * * return TRUE if you are absorbing the component, otherwise FALSE if you are fine having it exist as a duplicate component */ /datum/component/proc/CheckDupeComponent(datum/component/C, ...) @@ -250,7 +273,6 @@ * Callback Just before this component is transferred * * Use this to do any special cleanup you might need to do before being deregged from an object - * */ /datum/component/proc/PreTransfer() return @@ -259,8 +281,8 @@ * Callback Just after a component is transferred * * Use this to do any special setup you need to do after being moved to a new object - * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead * + * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead */ /datum/component/proc/PostTransfer() return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it @@ -279,8 +301,10 @@ /** * Internal proc to handle most all of the signaling procedure + * * Will runtime if used on datums with an empty component list - * Use the `SEND_SIGNAL` define instead + * + * Use the [SEND_SIGNAL] define instead */ /datum/proc/_SendSignal(sigtype, list/arguments) var/target = comp_lookup[sigtype] @@ -301,6 +325,7 @@ // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** * Return any component assigned to this datum of the given type + * * This will throw an error if it's possible to have more than one component of that type on the parent * * Arguments: @@ -320,6 +345,7 @@ // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** * Return any component assigned to this datum of the exact given type + * * This will throw an error if it's possible to have more than one component of that type on the parent * * Arguments: @@ -356,12 +382,17 @@ /** * Creates an instance of `new_type` in the datum and attaches to it as parent - * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum - * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set + * + * Sends the [COMSIG_COMPONENT_ADDED] signal to the datum + * + * Returns the component that was created. Or the old component in a dupe situation where [COMPONENT_DUPE_UNIQUE] was set + * * 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 +407,7 @@ new_comp = nt nt = new_comp.type - args[1] = src + raw_args[1] = src if(dm != COMPONENT_DUPE_ALLOWED) if(!dt) @@ -387,24 +418,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 +446,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 +469,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/butchering.dm b/code/datums/components/butchering.dm index 98d519dd6a8..6a964029b47 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -55,7 +55,7 @@ log_combat(user, H, "starts slicing the throat of") playsound(H.loc, butcher_sound, 50, TRUE, -1) - if(do_mob(user, H, CLAMP(500 / source.force, 30, 100)) && H.Adjacent(source)) + if(do_mob(user, H, clamp(500 / source.force, 30, 100)) && H.Adjacent(source)) if(H.has_status_effect(/datum/status_effect/neck_slice)) user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", MSG_VISUAL, \ "Their neck has already been already cut, you can't make the bleeding any worse!") @@ -65,7 +65,7 @@ "[user] slits your throat...") log_combat(user, H, "finishes slicing the throat of") H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD) - H.bleed_rate = CLAMP(H.bleed_rate + 20, 0, 30) + H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30) H.apply_status_effect(/datum/status_effect/neck_slice) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) 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/creamed.dm b/code/datums/components/creamed.dm index 8ac46132a94..38759e56561 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( /mob/living/silicon/ai))) /** - * # Creamed component + * Creamed component * * For when you have pie on your face */ @@ -53,9 +53,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( /datum/component/creamed/UnregisterFromParent() UnregisterSignal(parent, list( - COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_COMPONENT_CLEAN_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT)) - + ///Callback to remove pieface /datum/component/creamed/proc/clean_up(datum/source, strength) if(strength >= CLEAN_WEAK) 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/embedded.dm b/code/datums/components/embedded.dm new file mode 100644 index 00000000000..6cdfa8352b3 --- /dev/null +++ b/code/datums/components/embedded.dm @@ -0,0 +1,309 @@ +/* + This component is responsible for handling individual instances of embedded objects. The embeddable element is what allows an item to be embeddable and stores its embedding stats, + and when it impacts and meets the requirements to stick into something, it instantiates an embedded component. Once the item falls out, the component is destroyed, while the + element survives to embed another day. + + There are 2 different things that can be embedded presently: humans, and closed turfs (see: walls) + + - Human embedding has all the classical embedding behavior, and tracks more events and signals. The main behaviors and hooks to look for are: + -- Every process tick, there is a chance to randomly proc pain, controlled by pain_chance. There may also be a chance for the object to fall out randomly, per fall_chance + -- Every time the mob moves, there is a chance to proc jostling pain, controlled by jostle_chance (and only 50% as likely if the mob is walking or crawling) + -- Various signals hooking into human topic() and the embed removal surgery in order to handle removals. + + - Turf embedding is much simpler. All we do here is draw an overlay of the item's inhand on the turf, hide the item, and create an HTML link in the turf's inspect + that allows you to rip the item out. There's nothing dynamic about this, so far less checks. + + + In addition, there are 2 cases of embedding: embedding, and sticking + + - Embedding involves harmful and dangerous embeds, whether they cause brute damage, stamina damage, or a mix. This is the default behavior for embeddings, for when something is "pointy" + + - Sticking occurs when an item should not cause any harm while embedding (imagine throwing a sticky ball of tape at someone, rather than a shuriken). An item is considered "sticky" + when it has 0 for both pain multiplier and jostle pain multiplier. It's a bit arbitrary, but fairly straightforward. + + Stickables differ from embeds in the following ways: + -- Text descriptors use phrasing like "X is stuck to Y" rather than "X is embedded in Y" + -- There is no slicing sound on impact + -- All damage checks and bloodloss are skipped for humans + -- Pointy objects create sparks when embedding into a turf + +*/ + + +/datum/component/embedded + dupe_mode = COMPONENT_DUPE_ALLOWED + var/obj/item/bodypart/L + var/obj/item/weapon + + // all of this stuff is explained in _DEFINES/combat.dm + var/embed_chance // not like we really need it once we're already stuck in but hey + var/fall_chance + var/pain_chance + var/pain_mult + var/impact_pain_mult + var/remove_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + + ///if both our pain multiplier and jostle pain multiplier are 0, we're harmless and can omit most of the damage related stuff + var/harmful + var/mutable_appearance/overlay + +/datum/component/embedded/Initialize(obj/item/I, + datum/thrownthing/throwingdatum, + embed_chance = EMBED_CHANCE, + fall_chance = EMBEDDED_ITEM_FALLOUT, + pain_chance = EMBEDDED_PAIN_CHANCE, + pain_mult = EMBEDDED_PAIN_MULTIPLIER, + remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, + ignore_throwspeed_threshold = FALSE, + jostle_chance = EMBEDDED_JOSTLE_CHANCE, + jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, + pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) + + if((!ishuman(parent) && !isclosedturf(parent)) || !isitem(I)) + return COMPONENT_INCOMPATIBLE + + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + src.impact_pain_mult = impact_pain_mult + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + + src.weapon = I + + if(src.pain_mult || src.jostle_pain_mult) + harmful = TRUE + + if(ishuman(parent)) + initHuman() + else if(isclosedturf(parent)) + initTurf(throwingdatum) + +/datum/component/embedded/RegisterWithParent() + if(ishuman(parent)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/jostleCheck) + RegisterSignal(parent, COMSIG_HUMAN_EMBED_RIP, .proc/ripOutHuman) + RegisterSignal(parent, COMSIG_HUMAN_EMBED_REMOVAL, .proc/safeRemoveHuman) + else if(isclosedturf(parent)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examineTurf) + +/datum/component/embedded/UnregisterFromParent() + if(ishuman(parent)) + UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_HUMAN_EMBED_RIP, COMSIG_HUMAN_EMBED_REMOVAL)) + else if(isclosedturf(parent)) + UnregisterSignal(parent, COMSIG_PARENT_EXAMINE) + +/datum/component/embedded/process() + if(ishuman(parent)) + processHuman() + +/datum/component/embedded/Destroy() + if(overlay) + var/atom/A = parent + A.cut_overlay(overlay, TRUE) + qdel(overlay) + + return ..() + +//////////////////////////////////////// +/////////////HUMAN PROCS//////////////// +//////////////////////////////////////// + +/// Set up an instance of embedding for a human. This is basically an extension of Initialize() so not much to say +/datum/component/embedded/proc/initHuman() + START_PROCESSING(SSdcs, src) + var/mob/living/carbon/human/victim = parent + L = pick(victim.bodyparts) + L.embedded_objects |= weapon // on the inside... on the inside... + weapon.forceMove(victim) + + if(harmful) + victim.visible_message("[weapon] embeds itself in [victim]'s [L.name]!","[weapon] embeds itself in your [L.name]!") + victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + playsound(victim,'sound/weapons/bladeslice.ogg', 40) + weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! + var/damage = weapon.w_class * impact_pain_mult + L.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + else + victim.visible_message("[weapon] sticks itself to [victim]'s [L.name]!","[weapon] sticks itself to your [L.name]!") + + +/// Called every time a human with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the human is crawling or walking. +/datum/component/embedded/proc/jostleCheck() + var/mob/living/carbon/human/victim = parent + + var/chance = jostle_chance + if(victim.m_intent == MOVE_INTENT_WALK || victim.lying) + chance *= 0.5 + + if(prob(chance)) + var/damage = weapon.w_class * jostle_pain_mult + L.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + to_chat(victim, "[weapon] embedded in your [L.name] jostles and stings!") + + +/// Called when then item randomly falls out of a human. This handles the damage and descriptors, then calls safe_remove() +/datum/component/embedded/proc/fallOutHuman() + var/mob/living/carbon/human/victim = parent + + if(harmful) + var/damage = weapon.w_class * remove_pain_mult + L.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + victim.visible_message("[weapon] falls out of [victim.name]'s [L.name]!","[weapon] falls out of your [L.name]!") + else + victim.visible_message("[weapon] falls off of [victim.name]'s [L.name]!","[weapon] falls off of your [L.name]!") + + safeRemoveHuman() + + +/// Called when a human with an object embedded/stuck to them inspects themselves and clicks the appropriate link to begin ripping the item out. This handles the ripping attempt, descriptors, and dealing damage, then calls safe_remove() +/datum/component/embedded/proc/ripOutHuman() + var/mob/living/carbon/human/victim = parent + var/time_taken = rip_time * weapon.w_class + + victim.visible_message("[victim] attempts to remove [weapon] from [victim.p_their()] [L.name].","You attempt to remove [weapon] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") + if(do_after(victim, time_taken, target = victim)) + if(!weapon || !L || weapon.loc != victim || !(weapon in L.embedded_objects)) + qdel(src) + + if(harmful) + var/damage = weapon.w_class * remove_pain_mult + L.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) //It hurts to rip it out, get surgery you dingus. + victim.emote("scream") + victim.visible_message("[victim] successfully rips [weapon] out of [victim.p_their()] [L.name]!", "You successfully remove [weapon] from your [L.name].") + else + victim.visible_message("[victim] successfully rips [weapon] off of [victim.p_their()] [L.name]!", "You successfully remove [weapon] from your [L.name].") + + safeRemoveHuman(TRUE) + + +/// This proc handles the final step and actual removal of an embedded/stuck item from a human, whether or not it was actually removed safely. +/// Pass TRUE for to_hands if we want it to go to the victim's hands when they pull it out +/datum/component/embedded/proc/safeRemoveHuman(to_hands) + var/mob/living/carbon/human/victim = parent + L.embedded_objects -= weapon + + if(!victim) + weapon.forceMove(get_turf(weapon)) + qdel(src) + + if(to_hands) + victim.put_in_hands(weapon) + else + weapon.forceMove(get_turf(victim)) + + if(!victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + qdel(src) + + +/// Items embedded/stuck to humans both check whether they randomly fall out (if applicable), as well as if the target mob and limb still exists. +/// Items harmfully embedded in humans have an additional check for random pain (if applicable) +/datum/component/embedded/proc/processHuman() + var/mob/living/carbon/human/victim = parent + + if(!victim || !L) // in case the victim and/or their limbs exploded (say, due to a sticky bomb) + weapon.forceMove(get_turf(weapon)) + qdel(src) + + if(victim.stat == DEAD) + return + + if(harmful && prob(pain_chance)) + var/damage = weapon.w_class * pain_mult + L.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + to_chat(victim, "[weapon] embedded in your [L.name] hurts!") + + if(prob(fall_chance)) + fallOutHuman() + + +//////////////////////////////////////// +//////////////TURF PROCS//////////////// +//////////////////////////////////////// + +/// Turfs are much lower maintenance, since we don't care if they're in pain, but since they don't bleed or scream, we draw an overlay to show their status. +/// The only difference pointy/sticky items make here is text descriptors and pointy objects making a spark shower on impact. +/datum/component/embedded/proc/initTurf(datum/thrownthing/throwingdatum) + var/turf/closed/hit = parent + + // we can't store the item IN the turf (cause turfs are just kinda... there), so we fake it by making the item invisible and bailing if it moves due to a blast + weapon.forceMove(hit) + weapon.invisibility = INVISIBILITY_ABSTRACT + RegisterSignal(weapon, COMSIG_MOVABLE_MOVED, .proc/itemMoved) + + var/pixelX = rand(-2, 2) + var/pixelY = rand(-1, 3) // bias this upwards since in-hands are usually on the lower end of the sprite + + switch(throwingdatum.init_dir) + if(NORTH) + pixelY -= 2 + if(SOUTH) + pixelY += 2 + if(WEST) + pixelX += 2 + if(EAST) + pixelX -= 2 + + if(throwingdatum.init_dir in list(NORTH, WEST, NORTHWEST, SOUTHWEST)) + overlay = mutable_appearance(icon=weapon.righthand_file,icon_state=weapon.item_state) + else + overlay = mutable_appearance(icon=weapon.lefthand_file,icon_state=weapon.item_state) + + var/matrix/M = matrix() + M.Translate(pixelX, pixelY) + overlay.transform = M + hit.add_overlay(overlay, TRUE) + + if(harmful) + hit.visible_message("[weapon] embeds itself in [hit]!") + playsound(hit,'sound/weapons/bladeslice.ogg', 70) + + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(1, 1, parent) + sparks.attach(parent) + sparks.start() + else + hit.visible_message("[weapon] sticks itself to [hit]!") + + +/datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list) + if(harmful) + examine_list += "\t There is \a [weapon] embedded in [parent]!" + else + examine_list += "\t There is \a [weapon] stuck to [parent]!" + + +/// Someone is ripping out the item from the turf by hand +/datum/component/embedded/Topic(datum/source, href_list) + var/mob/living/us = usr + if(in_range(us, parent) && locate(href_list["embedded_object"]) == weapon) + if(harmful) + us.visible_message("[us] begins unwedging [weapon] from [parent].", "You begin unwedging [weapon] from [parent]...") + else + us.visible_message("[us] begins unsticking [weapon] from [parent].", "You begin unsticking [weapon] from [parent]...") + + if(do_after(us, 30, target = parent)) + us.put_in_hands(weapon) + qdel(src) + + +/// This proc handles if something knocked the invisible item loose from the turf somehow (probably an explosion). Just make it visible and say it fell loose, then get outta here. +/datum/component/embedded/proc/itemMoved() + weapon.invisibility = initial(weapon.invisibility) + weapon.visible_message("[weapon] falls loose from [parent].") + qdel(src) 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/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 11705540cb2..7445ab582bf 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -54,7 +54,7 @@ /datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent - comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10)) + comp.appliedComponents += master.AddComponent(/datum/component/igniter, clamp(comp.quality, 1, 10)) return "pyromantic [newName]" /datum/fantasy_affix/vampiric diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 890a854694c..d3f1a91b117 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(GPS_list) if(!ui) // Variable window height, depending on how many GPS units there are // to show, clamped to relatively safe range. - var/gps_window_height = CLAMP(325 + GLOB.GPS_list.len * 14, 325, 700) + var/gps_window_height = clamp(325 + GLOB.GPS_list.len * 14, 325, 700) ui = new(user, src, ui_key, "gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height ui.open() 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/mirage_border.dm b/code/datums/components/mirage_border.dm index d5d32010cd1..a366f4b822f 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -14,8 +14,8 @@ var/x = target.x var/y = target.y var/z = target.z - var/turf/southwest = locate(CLAMP(x - (direction & WEST ? range : 0), 1, world.maxx), CLAMP(y - (direction & SOUTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) - var/turf/northeast = locate(CLAMP(x + (direction & EAST ? range : 0), 1, world.maxx), CLAMP(y + (direction & NORTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) + var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) + var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) //holder.vis_contents += block(southwest, northeast) // This doesnt work because of beta bug memes for(var/i in block(southwest, northeast)) holder.vis_contents += i diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index b98fa8d87e8..afdc2821a95 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -42,8 +42,8 @@ RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT_RND, .proc/add_event) //Mood events that are only for RnD members /datum/component/mood/proc/print_mood(mob/user) - var/msg = "*---------*\nYour current mood\n" - msg += "My mental status: " //Long term + var/msg = "*---------*\nMy current mental status:\n" + msg += "My current sanity: " //Long term switch(sanity) if(SANITY_GREAT to INFINITY) msg += "My mind feels like a temple!\n" diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index dc1e73dd264..15b5169bba3 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)) @@ -176,7 +176,7 @@ return (nanite_volume > 0) /datum/component/nanites/proc/adjust_nanites(datum/source, amount) - nanite_volume = CLAMP(nanite_volume + amount, 0, max_nanites) + nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) if(nanite_volume <= 0) //oops we ran out qdel(src) @@ -188,7 +188,7 @@ if(remove || stealth) return //bye icon var/nanite_percent = (nanite_volume / max_nanites) * 100 - nanite_percent = CLAMP(CEILING(nanite_percent, 10), 10, 100) + nanite_percent = clamp(CEILING(nanite_percent, 10), 10, 100) holder.icon_state = "nanites[nanite_percent]" /datum/component/nanites/proc/on_emp(datum/source, severity) @@ -250,13 +250,13 @@ return FALSE /datum/component/nanites/proc/set_volume(datum/source, amount) - nanite_volume = CLAMP(amount, 0, max_nanites) + nanite_volume = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_max_volume(datum/source, amount) max_nanites = max(1, max_nanites) /datum/component/nanites/proc/set_cloud(datum/source, amount) - cloud_id = CLAMP(amount, 0, 100) + cloud_id = clamp(amount, 0, 100) /datum/component/nanites/proc/set_cloud_sync(datum/source, method) switch(method) @@ -268,7 +268,7 @@ cloud_active = TRUE /datum/component/nanites/proc/set_safety(datum/source, amount) - safety_threshold = CLAMP(amount, 0, max_nanites) + safety_threshold = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_regen(datum/source, amount) regen_rate = amount 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/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index df00cdec4c1..675c3c3719b 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -31,9 +31,12 @@ return reagents.flags &= ~NO_REACT - RC.emptying = TRUE reagents.handle_reactions() + RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update + //everything for every chemical removed, wich isn't a good option either. + RC.on_reagent_change() //We need to check it now, because some reactions leave nothing left. + /datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) . = ..() var/obj/machinery/plumbing/reaction_chamber/RC = parent diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm new file mode 100644 index 00000000000..3220dc425a5 --- /dev/null +++ b/code/datums/components/pricetag.dm @@ -0,0 +1,28 @@ +/datum/component/pricetag + var/datum/bank_account/owner + var/profit_ratio = 1 + +/datum/component/pricetag/Initialize(_owner,_profit_ratio) + if(!isobj(parent)) //Has to account for both objects and sellable structures like crates. + return COMPONENT_INCOMPATIBLE + owner = _owner + if(_profit_ratio) + profit_ratio = _profit_ratio + RegisterSignal(parent, COMSIG_ITEM_SOLD, .proc/split_profit) + RegisterSignal(parent, COMSIG_STRUCTURE_UNWRAPPED, .proc/Unwrapped) + RegisterSignal(parent, COMSIG_ITEM_UNWRAPPED, .proc/Unwrapped) + RegisterSignal(parent, COMSIG_ITEM_SPLIT_PROFIT, .proc/return_ratio) + +/datum/component/pricetag/proc/Unwrapped() + qdel(src) //Once it leaves it's wrapped container, the object in question should lose it's pricetag component. + +/datum/component/pricetag/proc/split_profit(var/item_value) + var/price = item_value + if(price) + var/adjusted_value = price*(profit_ratio/100) + owner.adjust_money(adjusted_value) + owner.bank_card_talk("Sale recorded. [adjusted_value] credits added to account.") + return TRUE + +/datum/component/pricetag/proc/return_ratio() + return profit_ratio 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/storage/storage.dm b/code/datums/components/storage/storage.dm index 1e12ff9fd33..840893d906b 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -335,8 +335,8 @@ numbered_contents = _process_numerical_display() adjusted_contents = numbered_contents.len - var/columns = CLAMP(max_items, 1, screen_max_columns) - var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + var/columns = clamp(max_items, 1, screen_max_columns) + var/rows = clamp(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) standard_orient_objs(rows, columns, numbered_contents) //This proc draws out the inventory and places the items on it. It uses the standard position. 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/uplink.dm b/code/datums/components/uplink.dm index 38e6267abab..a6d28a97b73 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -247,7 +247,7 @@ var/obj/item/pda/master = parent if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code))) if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code))) - failsafe() + failsafe(user) return COMPONENT_STOP_RINGTONE_CHANGE return locked = FALSE @@ -267,7 +267,7 @@ var/frequency = arguments[1] if(frequency != unlock_code) if(frequency == failsafe_code) - failsafe() + failsafe(master.loc) return locked = FALSE if(ismob(master.loc)) @@ -289,7 +289,7 @@ to_chat(user, "Your pen makes a clicking noise, before quickly rotating back to 0 degrees!") else if(compare_list(previous_attempts, failsafe_code)) - failsafe() + failsafe(user) /datum/component/uplink/proc/setup_unlock_code() unlock_code = generate_code() @@ -312,11 +312,13 @@ L += rand(1, 360) return L -/datum/component/uplink/proc/failsafe() +/datum/component/uplink/proc/failsafe(mob/living/carbon/user) if(!parent) return var/turf/T = get_turf(parent) if(!T) return + message_admins("[ADMIN_LOOKUPFLW(user)] has triggered an uplink failsafe explosion at [AREACOORD(T)] The owner of the uplink was [ADMIN_LOOKUPFLW(owner)].") + log_game("[key_name(user)] triggered an uplink failsafe explosion. The owner of the uplink was [key_name(owner)].") explosion(T,1,2,3) qdel(parent) //Alternatively could brick the uplink. diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 715c20e4219..c138a2a377f 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. @@ -177,7 +177,7 @@ /datum/component/wet_floor/proc/_do_add_wet(type, duration_minimum, duration_add, duration_maximum) var/time = 0 if(LAZYACCESS(time_left_list, "[type]")) - time = CLAMP(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) + time = clamp(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) else time = min(duration_minimum, duration_maximum) LAZYSET(time_left_list, "[type]", time) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 60ecc62f766..0e22a4f350f 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -43,7 +43,7 @@ addtimer(CALLBACK(src, .proc/charge), charge_rate) /datum/action/innate/dash/proc/charge() - current_charges = CLAMP(current_charges + 1, 0, max_charges) + current_charges = clamp(current_charges + 1, 0, max_charges) holder.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, TRUE) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 0a8617b70cd..4608b0ceb68 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -21,19 +21,28 @@ var/list/active_timers /// Status traits attached to this datum var/list/status_traits - - /// Components attached to this datum - /// Lazy associated list in the structure of `type:component/list of components` + + /** + * Components attached to this datum + * + * Lazy associated list in the structure of `type:component/list of components` + */ var/list/datum_components - /// Any datum registered to receive signals from this datum is in this list - /// Lazy associated list in the structure of `signal:registree/list of registrees` + /** + * Any datum registered to receive signals from this datum is in this list + * + * Lazy associated list in the structure of `signal:registree/list of registrees` + */ var/list/comp_lookup /// Lazy associated list in the structure of `signals:proctype` that are run when the datum receives that signal var/list/list/datum/callback/signal_procs - /// Is this datum capable of sending signals? - /// Set to true when a signal has been registered + /** + * Is this datum capable of sending signals? + * + * Set to true when a signal has been registered + */ var/signal_enabled = FALSE - + /// Datum level flags var/datum_flags = NONE @@ -52,7 +61,7 @@ /** * Called when a href for this datum is clicked * - * Sends a COMSIG_TOPIC signal + * Sends a [COMSIG_TOPIC] signal */ /datum/Topic(href, href_list[]) ..() @@ -60,20 +69,20 @@ /** * Default implementation of clean-up code. - * + * * This should be overridden to remove all references pointing to the object being destroyed, if * you do override it, make sure to call the parent and return it's return value by default - * - * Return an appropriate QDEL_HINT to modify handling of your deletion; - * in most cases this is QDEL_HINT_QUEUE. + * + * Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion; + * in most cases this is [QDEL_HINT_QUEUE]. * * The base case is responsible for doing the following * * Erasing timers pointing to this datum * * Erasing compenents on this datum * * Notifying datums listening to signals from this datum that we are going away * - * Returns QDEL_HINT_QUEUE - */ + * Returns [QDEL_HINT_QUEUE] + */ /datum/proc/Destroy(force=FALSE, ...) SHOULD_CALL_PARENT(1) tag = null diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index b6b1b55a8cd..9d269370c7c 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -248,7 +248,7 @@ SetSpread(DISEASE_SPREAD_BLOOD) permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) - cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20 + cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_rate"], 2) SetSeverity(properties["severity"]) GenerateCure(properties) @@ -303,7 +303,7 @@ // Will generate a random cure, the more resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/GenerateCure() if(properties && properties.len) - var/res = CLAMP(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) + var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) if(res == oldres) return cures = list(pick(advance_cures[res])) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 87a784e7ded..079d94b55aa 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -63,7 +63,7 @@ Bonus M.become_nearsighted(EYE_DAMAGE) if(prob(eyes.damage - 10 + 1)) if(!remove_eyes) - if(!HAS_TRAIT(M, TRAIT_BLIND)) + if(!M.is_blind()) to_chat(M, "You go blind!") eyes.applyOrganDamage(eyes.maxHealth) else diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 29ca49e2f1e..96efd38d5bc 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -1,7 +1,7 @@ /datum/disease/gastrolosis name = "Invasive Gastrolosis" max_stages = 4 - spread_text = "Degenerative Virus" + spread_text = "Unknown" spread_flags = DISEASE_SPREAD_SPECIAL cure_text = "Salt and mutadone" agent = "Agent S and DNA restructuring" @@ -56,6 +56,7 @@ return if(shell && eyes && tongue && prob(5)) affected_mob.set_species(/datum/species/snail) + affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob) affected_mob.visible_message("[affected_mob] turns into a snail!", \ "You turned into a snail person! You feel an urge to cccrrraaawwwlll...") cure() @@ -68,7 +69,7 @@ /datum/disease/gastrolosis/cure() . = ..() - if(!is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening + if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening var/mob/living/carbon/human/H = affected_mob var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.internal_organs if(tongue) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index d6db4de908f..e7b6f40e09a 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -607,7 +607,7 @@ if(elligible_organs.len) var/obj/item/organ/O = pick(elligible_organs) O.Remove(src) - visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart" + visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart" O.forceMove(drop_location()) if(prob(20)) O.animate_atom_living() @@ -647,7 +647,7 @@ /mob/living/carbon/human/proc/something_horrible_mindmelt() - if(!HAS_TRAIT(src, TRAIT_BLIND)) + if(!is_blind()) var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in internal_organs if(!eyes) return diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bf510e0f56f..46a295f90be 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -9,7 +9,9 @@ var/element_flags = NONE /** * The index of the first attach argument to consider for duplicate elements - * Is only used when flags contains ELEMENT_BESPOKE + * + * Is only used when flags contains [ELEMENT_BESPOKE] + * * This is infinity so you must explicitly set this */ var/id_arg_index = INFINITY @@ -19,11 +21,13 @@ SHOULD_CALL_PARENT(1) if(type == /datum/element) return ELEMENT_INCOMPATIBLE + SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src) if(element_flags & ELEMENT_DETACH) RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE) /// Deactivates the functionality defines by the element on the given datum /datum/element/proc/Detach(datum/source, force) + SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) SHOULD_CALL_PARENT(1) UnregisterSignal(source, COMSIG_PARENT_QDELETING) @@ -36,16 +40,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 + * 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/embed.dm b/code/datums/elements/embed.dm new file mode 100644 index 00000000000..ab2c0d53706 --- /dev/null +++ b/code/datums/elements/embed.dm @@ -0,0 +1,131 @@ +/* + The presence of this element allows an item to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) + with either at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. + + This element is granted primarily to any /obj/item that has something in its /embedding var, which should be formatted as a list. If you wish to be able to + grant/rescind the ability for an item to embed (say, when activating and deactivating an edagger), you can do so in two ways: + + 1. Drop the throw_speed var below EMBED_THROWSPEED_THRESHOLD (object will still be able to otherwise embed if thrown at high speed by something else like a blast) + 2. Add/Remove the embed element as needed (won't be able to embed at all) + + Otherwise non-embeddable or stickable items can be made embeddable/stickable through wizard events/sticky tape/admin memes. + +*/ + +#define STANDARD_WALL_HARDNESS 40 + +/datum/element/embed + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + + // all of this stuff is explained in _DEFINES/combat.dm + var/embed_chance + var/fall_chance + var/pain_chance + var/pain_mult + var/remove_pain_mult + var/impact_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + +/datum/element/embed/Attach(datum/target, list/embedArgs) + . = ..() + parseArgs(arglist(embedArgs)) + + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther) + RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined) + + +/datum/element/embed/Detach(obj/item/target) + . = ..() + UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE)) + + +/// Checking to see if we're gonna embed into a human +/datum/element/embed/proc/checkEmbedMob(obj/item/weapon, mob/living/carbon/human/victim, hit_zone, datum/thrownthing/throwingdatum) + if(!istype(victim)) + return + + if((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && prob(embed_chance) && !HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) + victim.AddComponent(/datum/component/embedded,\ + weapon,\ + throwingdatum,\ + embed_chance = embed_chance,\ + fall_chance = fall_chance,\ + pain_chance = pain_chance,\ + pain_mult = pain_mult,\ + remove_pain_mult = remove_pain_mult,\ + rip_time = rip_time,\ + ignore_throwspeed_threshold = ignore_throwspeed_threshold,\ + jostle_chance = jostle_chance,\ + jostle_pain_mult = jostle_pain_mult,\ + pain_stam_pct = pain_stam_pct) + + +/// We need the hit_zone if we're embedding into a human, so this proc only handled if we're embedding into a turf +/datum/element/embed/proc/checkEmbedOther(obj/item/weapon, turf/closed/hit, datum/thrownthing/throwingdatum) + if(!istype(hit)) + return + + var/chance = embed_chance + if(iswallturf(hit)) + var/turf/closed/wall/W = hit + chance += 2 * (W.hardness - STANDARD_WALL_HARDNESS) + + if((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && prob(chance)) + hit.AddComponent(/datum/component/embedded,\ + weapon,\ + throwingdatum,\ + embed_chance = embed_chance,\ + fall_chance = fall_chance,\ + pain_chance = pain_chance,\ + pain_mult = pain_mult,\ + remove_pain_mult = remove_pain_mult,\ + rip_time = rip_time,\ + ignore_throwspeed_threshold = ignore_throwspeed_threshold,\ + jostle_chance = jostle_chance,\ + jostle_pain_mult = jostle_pain_mult,\ + pain_stam_pct = pain_stam_pct) + +/datum/element/embed/proc/parseArgs(embed_chance = EMBED_CHANCE, + fall_chance = EMBEDDED_ITEM_FALLOUT, + pain_chance = EMBEDDED_PAIN_CHANCE, + pain_mult = EMBEDDED_PAIN_MULTIPLIER, + remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, + impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + ignore_throwspeed_threshold = FALSE, + jostle_chance = EMBEDDED_JOSTLE_CHANCE, + jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, + pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) + + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.impact_pain_mult = impact_pain_mult + src.rip_time = rip_time + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + +///A different embed element has been attached, so we'll detach and let them handle things +/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E) + if(istype(E, /datum/element/embed)) + Detach(weapon) + +/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) + if(!pain_mult && !jostle_pain_mult) + examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!" + else + examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!" 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/selfknockback.dm b/code/datums/elements/selfknockback.dm index ae918de9ea1..5e153579d6a 100644 --- a/code/datums/elements/selfknockback.dm +++ b/code/datums/elements/selfknockback.dm @@ -14,12 +14,12 @@ clamping the Knockback_Force value below. */ RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, .proc/Item_SelfKnockback) else if(isprojectile(target)) RegisterSignal(target, COMSIG_PROJECTILE_FIRE, .proc/Projectile_SelfKnockback) - else + else return ELEMENT_INCOMPATIBLE - + override_throw_val = throw_amount override_speed_val = speed_amount - + /datum/element/selfknockback/Detach(datum/source, force) . = ..() UnregisterSignal(source, list(COMSIG_ITEM_AFTERATTACK, COMSIG_PROJECTILE_FIRE)) @@ -40,8 +40,8 @@ clamping the Knockback_Force value below. */ if(isturf(attacktarget) && !attacktarget.density) return if(proximity_flag || (get_dist(attacktarget, usertarget) <= I.reach)) - var/knockback_force = Get_Knockback_Force(CLAMP(CEILING((I.force / 10), 1), 1, 5)) - var/knockback_speed = Get_Knockback_Speed(CLAMP(knockback_force, 1, 5)) + var/knockback_force = Get_Knockback_Force(clamp(CEILING((I.force / 10), 1), 1, 5)) + var/knockback_speed = Get_Knockback_Speed(clamp(knockback_force, 1, 5)) var/target_angle = Get_Angle(attacktarget, usertarget) var/move_target = get_ranged_target_turf(usertarget, angle2dir(target_angle), knockback_force) @@ -52,8 +52,8 @@ clamping the Knockback_Force value below. */ if(!P.firer) return - var/knockback_force = Get_Knockback_Force(CLAMP(CEILING((P.damage / 10), 1), 1, 5)) - var/knockback_speed = Get_Knockback_Speed(CLAMP(knockback_force, 1, 5)) + var/knockback_force = Get_Knockback_Force(clamp(CEILING((P.damage / 10), 1), 1, 5)) + var/knockback_speed = Get_Knockback_Speed(clamp(knockback_force, 1, 5)) var/atom/movable/knockback_target = P.firer var/move_target = get_edge_target_turf(knockback_target, angle2dir(P.original_angle+180)) 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/embedding_behavior.dm b/code/datums/embedding_behavior.dm index d4181f94344..449fb3ba1cc 100644 --- a/code/datums/embedding_behavior.dm +++ b/code/datums/embedding_behavior.dm @@ -1,58 +1,73 @@ -#define EMBEDID "embed-[embed_chance]-[embedded_fall_chance]-[embedded_pain_chance]-[embedded_pain_multiplier]-[embedded_fall_pain_multiplier]-[embedded_impact_pain_multiplier]-[embedded_unsafe_removal_pain_multiplier]-[embedded_unsafe_removal_time]-[embedded_ignore_throwspeed_threshold]" +#define EMBEDID "embed-[embed_chance]-[fall_chance]-[pain_chance]-[pain_mult]-[fall_pain_mult]-[impact_pain_mult]-[rip_pain_mult]-[rip_time]-[ignore_throwspeed_threshold]-[jostle_chance]-[jostle_pain_mult]-[pain_stam_pct]" /proc/getEmbeddingBehavior(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME, - embedded_ignore_throwspeed_threshold = FALSE) + fall_chance = EMBEDDED_ITEM_FALLOUT, + pain_chance = EMBEDDED_PAIN_CHANCE, + pain_mult = EMBEDDED_PAIN_MULTIPLIER, + fall_pain_mult = EMBEDDED_FALL_PAIN_MULTIPLIER, + impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + rip_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, + ignore_throwspeed_threshold = FALSE, + jostle_chance = EMBEDDED_JOSTLE_CHANCE, + jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, + pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) . = locate(EMBEDID) if (!.) - . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time, embedded_ignore_throwspeed_threshold) + . = new /datum/embedding_behavior(embed_chance, fall_chance, pain_chance, pain_mult, fall_pain_mult, impact_pain_mult, rip_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct) /datum/embedding_behavior var/embed_chance - var/embedded_fall_chance - var/embedded_pain_chance - var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) - var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) - var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) - var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) - var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. - var/embedded_ignore_throwspeed_threshold //if we don't give a damn about EMBED_THROWSPEED_THRESHOLD + var/fall_chance + var/pain_chance + var/pain_mult //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/fall_pain_mult //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/impact_pain_mult //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/rip_pain_mult //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/rip_time //A time in ticks, multiplied by the w_class. + var/ignore_throwspeed_threshold //if we don't give a damn about EMBED_THROWSPEED_THRESHOLD + var/jostle_chance //Chance to cause pain every time the victim moves (1/2 chance if they're walking or crawling) + var/jostle_pain_mult //The coefficient of multiplication for the damage when jostle damage is applied (this*w_class) + var/pain_stam_pct //Percentage of all pain damage dealt as stamina instead of brute (none by default) /datum/embedding_behavior/New(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME, - embedded_ignore_throwspeed_threshold = FALSE) + fall_chance = EMBEDDED_ITEM_FALLOUT, + pain_chance = EMBEDDED_PAIN_CHANCE, + pain_mult = EMBEDDED_PAIN_MULTIPLIER, + fall_pain_mult = EMBEDDED_FALL_PAIN_MULTIPLIER, + impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + rip_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, + ignore_throwspeed_threshold = FALSE, + jostle_chance = EMBEDDED_JOSTLE_CHANCE, + jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, + pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) src.embed_chance = embed_chance - src.embedded_fall_chance = embedded_fall_chance - src.embedded_pain_chance = embedded_pain_chance - src.embedded_pain_multiplier = embedded_pain_multiplier - src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier - src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier - src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier - src.embedded_unsafe_removal_time = embedded_unsafe_removal_time - src.embedded_ignore_throwspeed_threshold = embedded_ignore_throwspeed_threshold + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.fall_pain_mult = fall_pain_mult + src.impact_pain_mult = impact_pain_mult + src.rip_pain_mult = rip_pain_mult + src.rip_time = rip_time + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct tag = EMBEDID -/datum/embedding_behavior/proc/setRating(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time, embedded_ignore_throwspeed_threshold) +/datum/embedding_behavior/proc/setRating(embed_chance, fall_chance, pain_chance, pain_mult, fall_pain_mult, impact_pain_mult, rip_pain_mult, rip_time, ignore_throwspeed_threshold) return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ - (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ - (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ - (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ - (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ - (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ - (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ - (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time),\ - (isnull(embedded_ignore_throwspeed_threshold) ? src.embedded_ignore_throwspeed_threshold : embedded_ignore_throwspeed_threshold)) + (isnull(fall_chance) ? src.fall_chance : fall_chance),\ + (isnull(pain_chance) ? src.pain_chance : pain_chance),\ + (isnull(pain_mult) ? src.pain_mult : pain_mult),\ + (isnull(fall_pain_mult) ? src.fall_pain_mult : fall_pain_mult),\ + (isnull(impact_pain_mult) ? src.impact_pain_mult : impact_pain_mult),\ + (isnull(rip_pain_mult) ? src.rip_pain_mult : rip_pain_mult),\ + (isnull(rip_time) ? src.rip_time : rip_time),\ + (isnull(ignore_throwspeed_threshold) ? src.ignore_throwspeed_threshold : ignore_throwspeed_threshold),\ + (isnull(jostle_chance) ? src.jostle_chance : jostle_chance),\ + (isnull(jostle_pain_mult) ? src.jostle_pain_mult : jostle_pain_mult),\ + (isnull(pain_stam_pct) ? src.pain_stam_pct : pain_stam_pct)) #undef EMBEDID diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index b748d1d3bfa..f751de8bc86 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -121,14 +121,14 @@ GLOBAL_LIST_EMPTY(explosions) if(dist <= round(max_range + world.view - 2, 1)) M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound) if(baseshakeamount > 0) - shake_camera(M, 25, CLAMP(baseshakeamount, 0, 10)) + shake_camera(M, 25, clamp(baseshakeamount, 0, 10)) // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. else if(dist <= far_dist) - var/far_volume = CLAMP(far_dist, 30, 50) // Volume is based on explosion size and dist + var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound) if(baseshakeamount > 0) - shake_camera(M, 10, CLAMP(baseshakeamount*0.25, 0, 2.5)) + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) EX_PREPROCESS_CHECK_TICK //postpone processing for a bit diff --git a/code/datums/http.dm b/code/datums/http.dm new file mode 100644 index 00000000000..58eb815acbf --- /dev/null +++ b/code/datums/http.dm @@ -0,0 +1,74 @@ +/datum/http_request + var/id + var/in_progress = FALSE + + var/method + var/body + var/headers + var/url + + var/_raw_response + +/datum/http_request/proc/prepare(method, url, body = "", list/headers) + if (!length(headers)) + headers = "" + else + headers = json_encode(headers) + + src.method = method + src.url = url + src.body = body + src.headers = headers + +/datum/http_request/proc/execute_blocking() + _raw_response = rustg_http_request_blocking(method, url, body, headers) + +/datum/http_request/proc/begin_async() + if (in_progress) + CRASH("Attempted to re-use a request object.") + + id = rustg_http_request_async(method, url, body, headers) + + if (isnull(text2num(id))) + CRASH("Proc error: [id]") + _raw_response = "Proc error: [id]" + else + in_progress = TRUE + +/datum/http_request/proc/is_complete() + if (isnull(id)) + return TRUE + + if (!in_progress) + return TRUE + + var/r = rustg_http_check_request(id) + + if (r == RUSTG_JOB_NO_RESULTS_YET) + return FALSE + else + _raw_response = r + in_progress = FALSE + return TRUE + +/datum/http_request/proc/into_response() + var/datum/http_response/R = new() + + try + var/list/L = json_decode(_raw_response) + R.status_code = L["status_code"] + R.headers = L["headers"] + R.body = L["body"] + catch + R.errored = TRUE + R.error = _raw_response + + return R + +/datum/http_response + var/status_code + var/body + var/list/headers + + var/errored = FALSE + var/error 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..e67b30b3915 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 @@ -104,7 +106,7 @@ to_chat(A, "You pound [D] on the chest!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) if(D.losebreath <= 10) - D.losebreath = CLAMP(D.losebreath + 5, 0, 10) + D.losebreath = clamp(D.losebreath + 5, 0, 10) D.adjustOxyLoss(10) log_combat(A, D, "quickchoked") return 1 @@ -116,7 +118,7 @@ playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) D.apply_damage(5, A.dna.species.attack_type) if(D.silent <= 10) - D.silent = CLAMP(D.silent + 10, 0, 10) + D.silent = clamp(D.silent + 10, 0, 10) log_combat(A, D, "neck chopped") 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/drug_events.dm b/code/datums/mood_events/drug_events.dm index 15102a0cfe8..5b30b521837 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -11,7 +11,7 @@ description = "I hate that brand of cigarettes.\n" mood_change = -2 timeout = 6 MINUTES - + /datum/mood_event/overdose mood_change = -8 timeout = 5 MINUTES @@ -44,7 +44,7 @@ description = "[drug_name]! [drug_name]! [drug_name]!\n" /datum/mood_event/happiness_drug - description = "I can't feel anything and I never want this to end.\n" + description = "Can't feel a thing...\n" mood_change = 50 /datum/mood_event/happiness_drug_good_od 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/actions.dm b/code/datums/mutations/actions.dm index ac4bf863a73..40af7caac07 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -54,9 +54,10 @@ var/old_target = tracking_target possible = list() var/list/prints = sniffed.return_fingerprints() - for(var/mob/living/carbon/C in GLOB.carbon_list) - if(prints[md5(C.dna.uni_identity)]) - possible |= C + if(prints) + for(var/mob/living/carbon/C in GLOB.carbon_list) + if(prints[md5(C.dna.uni_identity)]) + possible |= C if(!length(possible)) to_chat(user,"Despite your best efforts, there are no scents to be found on [sniffed]...") return @@ -342,11 +343,11 @@ chems = new chems.transfered = embedded_mob chems.spikey = src - to_chat(fired_by, "Link established! Use the \"Transfer Chemicals\" ability to send your chemicals to the linked target!") + to_chat(fired_by, "Link established! Use the \"Transfer Chemicals\" ability to send your chemicals to the linked target!") chems.Grant(fired_by) /obj/item/hardened_spike/chem/unembedded() - to_chat(fired_by, "Link lost!") + to_chat(fired_by, "Link lost!") QDEL_NULL(chems) ..() diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 183b2235be3..2d3ad4551f2 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -42,7 +42,7 @@ if (user.client) user.client.images += bar - progress = CLAMP(progress, 0, goal) + progress = clamp(progress, 0, goal) last_progress = progress bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" if (!shown) 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/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 53f7336d954..55263a326a1 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -172,6 +172,7 @@ S.forceMove(holder.drop_location()) return S +/// Called from [/atom/proc/emp_act] /datum/wires/proc/emp_pulse() var/list/possible_wires = shuffle(wires) var/remaining_pulses = MAXIMUM_EMP_WIRES 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..f576a5d4b35 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -45,7 +45,7 @@ ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays var/list/managed_vis_overlays - ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc + ///overlays managed by [update_overlays][/atom/proc/update_overlays] to prevent removing overlays that weren't added by the same proc var/list/managed_overlays ///Proximity monitor associated with this atom @@ -85,8 +85,8 @@ * Called when an atom is created in byond (built in engine proc) * * Not a lot happens here in SS13 code, as we offload most of the work to the - * [Intialization](atom.html#proc/Initialize) proc, mostly we run the preloader - * if the preloader is being used and then call InitAtom of which the ultimate + * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader + * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate * result is that the Intialize proc is called. * * We also generate a tag here if the DF_USE_TAG flag is set on the atom @@ -134,11 +134,11 @@ * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map * there are no other arguments * - * Must return an [initialization hint](code/__DEFINES/subsystems.html) or a runtime will occur. + * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. * * Note: the following functions don't call the base for optimization and must copypasta handling: - * * /turf/Initialize - * * /turf/open/space/Initialize + * * [/turf/Initialize] + * * [/turf/open/space/Initialize] */ /atom/proc/Initialize(mapload, ...) if(flags_1 & INITIALIZED_1) @@ -173,10 +173,9 @@ /** * Late Intialization, for code that should run after all atoms have run Intialization * - * To have your LateIntialize proc be called, your atoms [Initalization](atom.html#proc/Initialize) + * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize] * proc must return the hint - * [INITIALIZE_HINT_LATELOAD](code/__DEFINES/subsystems.html#define/INITIALIZE_HINT_LATELOAD) - * otherwise you will never be called. + * [INITIALIZE_HINT_LATELOAD] otherwise you will never be called. * * useful for doing things like finding other machines on GLOB.machines because you can guarantee * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization @@ -185,7 +184,7 @@ /atom/proc/LateInitialize() set waitfor = FALSE -/// Put your AddComponent() calls here +/// Put your [AddComponent] calls here /atom/proc/ComponentInitialize() return @@ -337,7 +336,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 @@ -411,10 +410,10 @@ /** * React to an EMP of the given severity * - * Default behaviour is to send the COMSIG_ATOM_EMP_ACT signal + * Default behaviour is to send the [COMSIG_ATOM_EMP_ACT] signal * * If the signal does not return protection, and there are attached wires then we call - * emp_pulse() on the wires + * [emp_pulse][/datum/wires/proc/emp_pulse] on the wires * * We then return the protection value */ @@ -427,7 +426,7 @@ /** * React to a hit by a projectile object * - * Default behaviour is to send the COMSIG_ATOM_BULLET_ACT and then call on_hit() on the projectile + * Default behaviour is to send the [COMSIG_ATOM_BULLET_ACT] and then call [on_hit][/obj/projectile/proc/on_hit] on the projectile */ /atom/proc/bullet_act(obj/projectile/P, def_zone) SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) @@ -446,7 +445,7 @@ * Get the name of this object for examine * * You can override what is returned from this proc by registering to listen for the - * COMSIG_ATOM_GET_EXAMINE_NAME signal + * [COMSIG_ATOM_GET_EXAMINE_NAME] signal */ /atom/proc/get_examine_name(mob/user) . = "\a [src]" @@ -465,9 +464,9 @@ * Called when a mob examines (shift click or verb) this atom * * Default behaviour is to get the name and icon of the object and it's reagents where - * the TRANSPARENT flag is set on the reagents holder + * the [TRANSPARENT] flag is set on the reagents holder * - * Produces a signal COMSIG_PARENT_EXAMINE + * Produces a signal [COMSIG_PARENT_EXAMINE] */ /atom/proc/examine(mob/user) . = list("[get_examine_string(user, TRUE)].") @@ -537,7 +536,7 @@ * An atom we are buckled or is contained within us has tried to move * * Default behaviour is to send a warning that the user can't move while buckled as long - * as the buckle_message_cooldown has expired (50 ticks) + * as the [buckle_message_cooldown][/atom/var/buckle_message_cooldown] has expired (50 ticks) */ /atom/proc/relaymove(mob/user) if(buckle_message_cooldown <= world.time) @@ -552,7 +551,7 @@ /** * React to being hit by an explosion * - * Default behaviour is to call contents_explosion() and send the COMSIG_ATOM_EX_ACT signal + * Default behaviour is to call [contents_explosion][/atom/proc/contents_explosion] and send the [COMSIG_ATOM_EX_ACT] signal */ /atom/proc/ex_act(severity, target) set waitfor = FALSE @@ -562,7 +561,7 @@ /** * React to a hit by a blob objecd * - * default behaviour is to send the COMSIG_ATOM_BLOB_ACT signal + * default behaviour is to send the [COMSIG_ATOM_BLOB_ACT] signal */ /atom/proc/blob_act(obj/structure/blob/B) SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) @@ -575,7 +574,7 @@ /** * React to being hit by a thrown object * - * Default behaviour is to call hitby_react() on ourselves after 2 seconds if we are dense + * Default behaviour is to call [hitby_react][/atom/proc/hitby_react] on ourselves after 2 seconds if we are dense * and under normal gravity. * * Im not sure why this the case, maybe to prevent lots of hitby's if the thrown object is @@ -659,7 +658,7 @@ /** * Respond to the singularity pulling on us * - * Default behaviour is to send COMSIG_ATOM_SING_PULL and return + * Default behaviour is to send [COMSIG_ATOM_SING_PULL] and return */ /atom/proc/singularity_pull(obj/singularity/S, current_size) SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) @@ -668,7 +667,7 @@ /** * Respond to acid being used on our atom * - * Default behaviour is to send COMSIG_ATOM_ACID_ACT and return + * Default behaviour is to send [COMSIG_ATOM_ACID_ACT] and return */ /atom/proc/acid_act(acidpwr, acid_volume) SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) @@ -676,7 +675,7 @@ /** * Respond to an emag being used on our atom * - * Default behaviour is to send COMSIG_ATOM_EMAG_ACT and return + * Default behaviour is to send [COMSIG_ATOM_EMAG_ACT] and return */ /atom/proc/emag_act(mob/user) SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT, user) @@ -684,7 +683,7 @@ /** * Respond to a radioactive wave hitting this atom * - * Default behaviour is to send COMSIG_ATOM_RAD_ACT and return + * Default behaviour is to send [COMSIG_ATOM_RAD_ACT] and return */ /atom/proc/rad_act(strength) SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) @@ -692,7 +691,7 @@ /** * Respond to narsie eating our atom * - * Default behaviour is to send COMSIG_ATOM_NARSIE_ACT and return + * Default behaviour is to send [COMSIG_ATOM_NARSIE_ACT] and return */ /atom/proc/narsie_act() SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) @@ -706,7 +705,7 @@ /** * Respond to an RCD acting on our item * - * Default behaviour is to send COMSIG_ATOM_RCD_ACT and return FALSE + * Default behaviour is to send [COMSIG_ATOM_RCD_ACT] and return FALSE */ /atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) @@ -755,9 +754,9 @@ return null /** - * This proc is called when an atom in our contents has it's Destroy() called + * This proc is called when an atom in our contents has it's [Destroy][/atom/Destroy] called * - * Default behaviour is to simply send COMSIG_ATOM_CONTENTS_DEL + * Default behaviour is to simply send [COMSIG_ATOM_CONTENTS_DEL] */ /atom/proc/handle_atom_del(atom/A) SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) @@ -792,7 +791,7 @@ /** * Hook for running code when a dir change occurs * - * Not recommended to use, listen for the COMSIG_ATOM_DIR_CHANGE signal instead (sent by this proc) + * Not recommended to use, listen for the [COMSIG_ATOM_DIR_CHANGE] signal instead (sent by this proc) */ /atom/proc/setDir(newdir) SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) @@ -862,6 +861,22 @@ color = C return + +///Proc for being washed by a shower +/atom/proc/washed(var/atom/washer) + . = SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + + var/datum/component/radioactive/healthy_green_glow = GetComponent(/datum/component/radioactive) + if(!healthy_green_glow || QDELETED(healthy_green_glow)) + return + var/strength = healthy_green_glow.strength + if(strength <= RAD_BACKGROUND_RADIATION) + qdel(healthy_green_glow) + return + healthy_green_glow.strength -= max(0, (healthy_green_glow.strength - (RAD_BACKGROUND_RADIATION * 2)) * 0.2) + + /** * call back when a var is edited on this atom * @@ -870,7 +885,7 @@ * At the atom level, if you edit a var named "color" it will add the atom colour with * admin level priority to the atom colours list * - * Also, if GLOB.Debug2 is FALSE, it sets the ADMIN_SPAWNED_1 flag on flags_1, which signifies + * Also, if GLOB.Debug2 is FALSE, it sets the [ADMIN_SPAWNED_1] flag on [flags_1][/atom/var/flags_1], which signifies * the object has been admin edited */ /atom/vv_edit_var(var_name, var_value) @@ -889,7 +904,7 @@ /atom/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION("", "---------") - if(!ismovableatom(src)) + if(!ismovable(src)) var/turf/curturf = get_turf(src) if(curturf) . += "" @@ -979,7 +994,7 @@ /** * An atom has entered this atom's contents * - * Default behaviour is to send the COMSIG_ATOM_ENTERED + * Default behaviour is to send the [COMSIG_ATOM_ENTERED] */ /atom/Entered(atom/movable/AM, atom/oldLoc) SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) @@ -987,7 +1002,7 @@ /** * An atom is attempting to exit this atom's contents * - * Default behaviour is to send the COMSIG_ATOM_EXIT + * Default behaviour is to send the [COMSIG_ATOM_EXIT] * * Return value should be set to FALSE if the moving atom is unable to leave, * otherwise leave value the result of the parent call @@ -1000,7 +1015,7 @@ /** * An atom has exited this atom's contents * - * Default behaviour is to send the COMSIG_ATOM_EXITED + * Default behaviour is to send the [COMSIG_ATOM_EXITED] */ /atom/Exited(atom/movable/AM, atom/newLoc) SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) @@ -1146,11 +1161,12 @@ /** * Log a combat message in the attack log * - * 1 argument is the actor performing the action - * 2 argument is the target of the action - * 3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) - * 4 is a tool with which the action was made (usually an item) - * 5 is any additional text, which will be appended to the rest of the log line + * Arguments: + * * atom/user - argument is the actor performing the action + * * atom/target - argument is the target of the action + * * what_done - is a verb describing the action (e.g. punched, throwed, kicked, etc.) + * * atom/object - is a tool with which the action was made (usually an item) + * * addition - is any additional text, which will be appended to the rest of the log line */ /proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) var/ssource = key_name(user) @@ -1224,7 +1240,7 @@ /** * Returns true if this atom has gravity for the passed in turf * - * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with + * Sends signals [COMSIG_ATOM_HAS_GRAVITY] and [COMSIG_TURF_HAS_GRAVITY], both can force gravity with * the forced gravity var * * Gravity situations: diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8622abd8563..d925b2d04d8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -25,7 +25,7 @@ var/inertia_next_move = 0 var/inertia_move_delay = 5 var/pass_flags = NONE - /// If false makes CanPass call CanPassThrough on this type instead of using default behaviour + /// If false makes [CanPass][/atom/proc/CanPass] call [CanPassThrough][/atom/movable/proc/CanPassThrough] on this type instead of using default behaviour var/generic_canpass = TRUE var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. @@ -487,11 +487,17 @@ /atom/movable/proc/setMovetype(newval) movement_type = newval -//Called whenever an object moves and by mobs when they attempt to move themselves through space -//And when an object or action applies a force on src, see newtonian_move() below -//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting -//Mobs should return 1 if they should be able to move of their own volition, see client/Move() in mob_movement.dm -//movement_dir == 0 when stopping or any dir when trying to move +/** + * Called whenever an object moves and by mobs when they attempt to move themselves through space + * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move] + * + * Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting + * + * Mobs should return 1 if they should be able to move of their own volition, see [/client/Move] + * + * Arguments: + * * movement_dir - 0 when stopping or any dir when trying to move + */ /atom/movable/proc/Process_Spacemove(movement_dir = 0) if(has_gravity(src)) return 1 @@ -511,7 +517,8 @@ return 0 -/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity +/// Only moves the object if it's under no gravity +/atom/movable/proc/newtonian_move(direction) if(!loc || Process_Spacemove(0)) inertia_dir = 0 return 0 @@ -538,7 +545,8 @@ return return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) //If this returns FALSE then callback will not be called. +///If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) . = FALSE if (!target || speed <= 0) return @@ -662,11 +670,11 @@ SHOULD_CALL_PARENT(TRUE) return blocker_opinion -// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. +/// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) return -// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. +/// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /atom/movable/proc/on_enter_storage(datum/component/storage/concrete/S) return @@ -689,7 +697,7 @@ break . = dense_object_backup -//called when a mob resists while inside a container that is itself inside something. +///called when a mob resists while inside a container that is itself inside something. /atom/movable/proc/relay_container_resist(mob/living/user, obj/O) return @@ -886,8 +894,11 @@ return FALSE return TRUE -/// Updates the grab state of the movable -/// This exists to act as a hook for behaviour +/** + * Updates the grab state of the movable + * + * This exists to act as a hook for behaviour + */ /atom/movable/proc/setGrabState(newstate) grab_state = newstate diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 36f29b5ae8c..574df08d169 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -290,10 +290,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) generate_threat() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time + midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") return TRUE @@ -624,7 +624,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) // Somehow it managed to trigger midround multiple times so this was moved here. // There is no way this should be able to trigger an injection twice now. var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - midround_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time) + midround_injection_cooldown = (round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time) // Time to inject some threat into the round if(EMERGENCY_ESCAPED_OR_ENDGAMED) // Unless the shuttle is gone @@ -753,7 +753,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules)) var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time /// Refund threat, but no more than threat_level. /datum/game_mode/dynamic/proc/refund_threat(regain) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index a8ecc841597..e64700d8084 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -651,6 +651,6 @@ if (prob(meteorminutes/2)) wavetype = GLOB.meteors_catastrophic - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) + var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 8bcbb3669b5..3b88abfb83b 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -26,7 +26,7 @@ if (prob(meteorminutes/2)) wavetype = GLOB.meteors_catastrophic - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) + var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 7da2177f35a..c01028dde29 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -306,6 +306,42 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list name = "protect nonhuman" human_check = FALSE +/datum/objective/jailbreak + name = "jailbreak" + martyr_compatible = TRUE //why not? + var/target_role_type + +/datum/objective/jailbreak/find_target_by_role(role, role_type, invert=FALSE) + if(!invert) + target_role_type = role_type + return ..() + +/datum/objective/jailbreak/check_completion() + return completed || (considered_escaped(target)) + +/datum/objective/jailbreak/update_explanation_text() + ..() + if(target?.current) + explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role : target.special_role] escapes alive and out of custody." + else + explanation_text = "Free Objective" + +/datum/objective/jailbreak/admin_edit(mob/admin) + admin_simple_target_pick(admin) + +/datum/objective/jailbreak/detain + name = "detain" + +/datum/objective/jailbreak/detain/check_completion() + return completed || (!considered_escaped(target) && (considered_alive(target) && target.current.onCentCom())) + +/datum/objective/jailbreak/detain/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role : target.special_role] is delivered to nanotrasen alive and in custody." + else + explanation_text = "Free Objective" + /datum/objective/hijack name = "hijack" explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." @@ -1062,6 +1098,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/maroon, /datum/objective/debrain, /datum/objective/protect, + /datum/objective/jailbreak, + /datum/objective/jailbreak/detain, /datum/objective/destroy, /datum/objective/hijack, /datum/objective/escape, 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/_machinery.dm b/code/game/machinery/_machinery.dm index 15139a39e50..684e2d5675c 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -532,10 +532,10 @@ Class Procs: . = 1 /obj/machinery/zap_act(power, zap_flags, shocked_objects) - ..() + . = ..() if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE)) explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE) - if(zap_flags & ZAP_OBJ_DAMAGE) + else if(zap_flags & ZAP_OBJ_DAMAGE) take_damage(power/2000, BURN, "energy") if(prob(40)) emp_act(EMP_LIGHT) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 15d9b737c52..0f1e15f9055 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -128,13 +128,14 @@ GLOBAL_LIST_EMPTY(announcement_systems) return if(NewMessage) arrival = NewMessage + log_game("The arrivals announcement was updated: [NewMessage] by:[key_name(usr)]") else if(href_list["NewheadTopic"]) var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead) if(!usr.canUseTopic(src, !issilicon(usr))) return if(NewMessage) newhead = NewMessage - + log_game("The head announcement was updated: [NewMessage] by:[key_name(usr)]") else if(href_list["NewheadT-Topic"]) newheadToggle = !newheadToggle update_icon() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 32cf77212bf..05780c4e776 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) @@ -173,7 +174,7 @@ var/multiplier = text2num(href_list["multiplier"]) var/is_stack = ispath(being_built.build_path, /obj/item/stack) - multiplier = CLAMP(multiplier,1,50) + multiplier = clamp(multiplier,1,50) ///////////////// diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 69118856363..10994a9f4c2 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -152,7 +152,7 @@ return log_activity("changed greater than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = CLAMP(new_filter, 0, 100) + new_filter = clamp(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) result_filters["Charge Above"] = new_filter if(href_list["below_filter"]) @@ -162,7 +162,7 @@ return log_activity("changed lesser than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = CLAMP(new_filter, 0, 100) + new_filter = clamp(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) result_filters["Charge Below"] = new_filter if(href_list["access_filter"]) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index a2e3efb9e5c..7c4222a07ea 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -307,7 +307,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("rate") var/target = text2num(params["rate"]) if(!isnull(target)) - target = CLAMP(target, 0, MAX_TRANSFER_RATE) + target = clamp(target, 0, MAX_TRANSFER_RATE) signal.data += list("tag" = input_tag, "set_volume_rate" = target) . = TRUE if("output") @@ -316,7 +316,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("pressure") var/target = text2num(params["pressure"]) if(!isnull(target)) - target = CLAMP(target, 0, 4500) + target = clamp(target, 0, 4500) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index bf7665b4591..c865633cbe9 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -23,7 +23,7 @@ network += "[idnum][i]" /obj/machinery/computer/security/check_eye(mob/user) - if( (machine_stat & (NOPOWER|BROKEN)) || user.incapacitated() || user.eye_blind ) + if( (machine_stat & (NOPOWER|BROKEN)) || user.incapacitated() || user.is_blind() ) user.unset_machine() return if(!(user in watchers)) @@ -102,7 +102,7 @@ return if(C) var/camera_fail = 0 - if(!C.can_use() || user.machine != src || user.eye_blind || user.incapacitated()) + if(!C.can_use() || user.machine != src || user.is_blind() || user.incapacitated()) camera_fail = 1 else if(iscyborg(user) || long_ranged) var/list/viewing = viewers(src) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index a9c54680e1b..b09a50cf29f 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -79,7 +79,7 @@ playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) /obj/machinery/computer/camera_advanced/check_eye(mob/user) - if( (machine_stat & (NOPOWER|BROKEN)) || (!Adjacent(user) && !user.has_unlimited_silicon_privilege) || user.eye_blind || user.incapacitated() ) + if( (machine_stat & (NOPOWER|BROKEN)) || (!Adjacent(user) && !user.has_unlimited_silicon_privilege) || user.is_blind() || user.incapacitated() ) user.unset_machine() /obj/machinery/computer/camera_advanced/Destroy() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f45cd30ae0e..02cb0af50e9 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -109,7 +109,7 @@ var/security_level = get_security_level() log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].") message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].") - deadchat_broadcast(" has changed the security level to [security_level] with [src] at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has changed the security level to [security_level] with [src] at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) tmp_alertlevel = 0 else to_chat(usr, "You are not authorized to do this!") @@ -144,7 +144,7 @@ minor_announce(input, title = "Outgoing message to allied station") usr.log_talk(input, LOG_SAY, tag="message to the other server") message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.") - deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[usr.real_name]", usr) + deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) CM.lastTimeUsed = world.time if("purchase_menu") @@ -250,13 +250,13 @@ make_maint_all_access() log_game("[key_name(usr)] enabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") - deadchat_broadcast(" enabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" enabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) state = STATE_DEFAULT if("disableemergency") revoke_maint_all_access() log_game("[key_name(usr)] disabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.") - deadchat_broadcast(" disabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" disabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) state = STATE_DEFAULT // Status display stuff @@ -290,7 +290,7 @@ CentCom_announce(input, usr) to_chat(usr, "Message transmitted to Central Command.") usr.log_talk(input, LOG_SAY, tag="CentCom announcement") - deadchat_broadcast(" has messaged CentCom, \"[input]\" at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has messaged CentCom, \"[input]\" at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) CM.lastTimeUsed = world.time // OMG SYNDICATE ...LETTERHEAD @@ -307,7 +307,7 @@ Syndicate_announce(input, usr) to_chat(usr, "SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.") usr.log_talk(input, LOG_SAY, tag="Syndicate announcement") - deadchat_broadcast(" has messaged the Syndicate, \"[input]\" at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has messaged the Syndicate, \"[input]\" at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) CM.lastTimeUsed = world.time if("RestoreBackup") @@ -392,7 +392,7 @@ var/security_level = get_security_level() log_game("[key_name(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].") message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].") - deadchat_broadcast(" has changed the security level to [security_level] from [src] at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has changed the security level to [security_level] from [src] at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) tmp_alertlevel = 0 aistate = STATE_DEFAULT if("ai-changeseclevel") @@ -403,13 +403,13 @@ make_maint_all_access() log_game("[key_name(usr)] enabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") - deadchat_broadcast(" enabled emergency maintenance access.", "[usr.real_name]", usr) + deadchat_broadcast(" enabled emergency maintenance access.", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) aistate = STATE_DEFAULT if("ai-disableemergency") revoke_maint_all_access() log_game("[key_name(usr)] disabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.") - deadchat_broadcast(" disabled emergency maintenance access.", "[usr.real_name]", usr) + deadchat_broadcast(" disabled emergency maintenance access.", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) aistate = STATE_DEFAULT updateUsrDialog() @@ -715,7 +715,7 @@ else input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too. SScommunications.make_announcement(user, is_silicon, input) - deadchat_broadcast(" made a priority announcement from [get_area_name(usr, TRUE)].", "[user.real_name]", user) + deadchat_broadcast(" made a priority announcement from [get_area_name(usr, TRUE)].", "[user.real_name]", user, message_type=DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/proc/post_status(command, data1, data2) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 3d7c7b056ee..87501ff7831 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -38,13 +38,13 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Detective"] = 13 jobs["Chief Medical Officer"] = 20 jobs["Chemist"] = 21 - jobs["Geneticist"] = 22 - jobs["Virologist"] = 23 - jobs["Medical Doctor"] = 24 - jobs["Paramedic"] = 25 + jobs["Virologist"] = 22 + jobs["Medical Doctor"] = 23 + jobs["Paramedic"] = 24 jobs["Research Director"] = 30 jobs["Scientist"] = 31 jobs["Roboticist"] = 32 + jobs["Geneticist"] = 33 jobs["Chief Engineer"] = 40 jobs["Station Engineer"] = 41 jobs["Atmospheric Technician"] = 42 diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 4f1334cd37d..0a15070c4cc 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -604,13 +604,13 @@ if("setbufferlabel") var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null) if(num && text) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot["label"] = text if("setbuffer") if(num && viable_occupant) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) buffer[num] = list( "label"="Buffer[num]:[viable_occupant.real_name]", "UI"=viable_occupant.dna.uni_identity, @@ -620,7 +620,7 @@ ) if("clearbuffer") if(num) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot.Cut() @@ -635,7 +635,7 @@ apply_buffer(SCANNER_ACTION_MIXED,num) if("injector") if(num && injectorready < world.time) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) var/obj/item/dnainjector/timed/I @@ -662,11 +662,11 @@ injectorready = world.time + INJECTOR_TIMEOUT if("loaddisk") if(num && diskette && diskette.fields) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) buffer[num] = diskette.fields.Copy() if("savedisk") if(num && diskette && !diskette.read_only) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) diskette.name = "data disk \[[buffer_slot["label"]]\]" @@ -923,7 +923,7 @@ if("add_advinjector") if(LAZYLEN(injector_selection) < max_injector_selections) - var/new_selection = input(usr, "Enter Adv. Injector name", "Advanced Injectors") as text|null + var/new_selection = stripped_input(usr, "Enter Adv. Injector name", "Advanced Injectors") if(new_selection && !(new_selection in injector_selection)) injector_selection[new_selection] = list() @@ -955,7 +955,7 @@ return viable_occupant /obj/machinery/computer/scan_consolenew/proc/apply_buffer(action,buffer_num) - buffer_num = CLAMP(buffer_num, 1, NUMBER_OF_BUFFERS) + buffer_num = clamp(buffer_num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[buffer_num] var/mob/living/carbon/viable_occupant = get_viable_occupant() if(istype(buffer_slot)) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 40d9434ce3d..9da901cd20e 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -97,7 +97,7 @@ return if(!new_goal) new_goal = default_goal - contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + contained_id.goal = clamp(new_goal, 0, 1000) //maximum 1000 points return TRUE if("toggle_open") if(teleporter.locked) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 356cd54c990..a9573e2a1ee 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -33,7 +33,7 @@ to_chat(user, "You begin repairing [src]...") if(I.use_tool(src, user, 40, volume=40)) - obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) + obj_integrity = clamp(obj_integrity + 20, 0, max_integrity) else return ..() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 38aca8e7e74..4e5fa5f48ae 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -138,7 +138,7 @@ . /= 10 /obj/machinery/door_timer/proc/set_timer(value) - var/new_time = CLAMP(value,0,MAX_TIMER) + var/new_time = clamp(value,0,MAX_TIMER) . = new_time == timer_duration //return 1 on no change timer_duration = new_time 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/launch_pad.dm b/code/game/machinery/launch_pad.dm index 8ef69e39322..265832a6a74 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -102,9 +102,9 @@ if(teleporting) return if(!isnull(x)) - x_offset = CLAMP(x, -range, range) + x_offset = clamp(x, -range, range) if(!isnull(y)) - y_offset = CLAMP(y, -range, range) + y_offset = clamp(y, -range, range) update_indicator() /obj/machinery/launchpad/proc/doteleport(mob/user, sending) diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index 1182440f2d0..3dc2090260e 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -66,9 +66,9 @@ ..() /obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - to_chat(user, "You start furiously plunging [name].") + to_chat(user, "You start furiously plunging [name].") if(do_after(user, 30, target = src)) - to_chat(user, "You finish plunging the [name].") + to_chat(user, "You finish plunging the [name].") reagents.reaction(get_turf(src), TOUCH) reagents.clear_reagents() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index e64ef7aba17..5b72ef26844 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -55,9 +55,9 @@ new /obj/item/pipe_meter(loc) wait = world.time + 15 if(href_list["layer_up"]) - piping_layer = CLAMP(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = clamp(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if(href_list["layer_down"]) - piping_layer = CLAMP(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = clamp(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index f7410c45cdb..6a5a613a0e5 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -98,11 +98,7 @@ 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)) - to_eat = AM0.GetAllContents() - else - to_eat = list(AM0) + var/list/to_eat = AM0.GetAllContents() var/living_detected = FALSE //technically includes silicons as well but eh var/list/nom = list() diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 351c432b8f2..783da0c5eaa 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -245,13 +245,13 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) to_department = GLOB.req_console_ckey_departments[to_department] message = new_message screen = REQ_SCREEN_AUTHENTICATE - priority = CLAMP(text2num(href_list["priority"]), REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY) + priority = clamp(text2num(href_list["priority"]), REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY) if(href_list["writeAnnouncement"]) var/new_message = reject_bad_text(stripped_input(usr, "Write your message:", "Awaiting Input", "", MAX_MESSAGE_LEN)) if(new_message) message = new_message - priority = CLAMP(text2num(href_list["priority"]) || REQ_NORMAL_MESSAGE_PRIORITY, REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY) + priority = clamp(text2num(href_list["priority"]) || REQ_NORMAL_MESSAGE_PRIORITY, REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY) else message = "" announceAuth = FALSE @@ -267,7 +267,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) GLOB.news_network.SubmitArticle(message, department, "Station Announcements", null) usr.log_talk(message, LOG_SAY, tag="station announcement from [src]") message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].") - deadchat_broadcast(" made a station announcement from [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" made a station announcement from [get_area_name(usr, TRUE)].", "[usr.real_name]", usr, message_type=DEADCHAT_ANNOUNCEMENT) announceAuth = FALSE message = "" screen = REQ_SCREEN_MAIN @@ -324,7 +324,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) //Handle screen switching if(href_list["setScreen"]) - var/set_screen = CLAMP(text2num(href_list["setScreen"]) || 0, REQ_SCREEN_MAIN, REQ_SCREEN_ANNOUNCE) + var/set_screen = clamp(text2num(href_list["setScreen"]) || 0, REQ_SCREEN_MAIN, REQ_SCREEN_ANNOUNCE) switch(set_screen) if(REQ_SCREEN_MAIN) to_department = "" diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index bb17ba0a4e0..6407b0e8b62 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -95,7 +95,7 @@ anchored = !anchored . = TRUE if("ChangeBetAmount") - chosen_bet_amount = CLAMP(text2num(params["amount"]), 10, 500) + chosen_bet_amount = clamp(text2num(params["amount"]), 10, 500) . = TRUE if("ChangeBetType") chosen_bet_type = params["type"] diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 398c3d8243e..fb3880b90b6 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -216,7 +216,7 @@ . = TRUE if("set_nanite_cloud") var/new_cloud = text2num(params["new_cloud"]) - nanite_cloud = CLAMP(round(new_cloud, 1), 1, 100) + nanite_cloud = clamp(round(new_cloud, 1), 1, 100) . = TRUE //Some species are not scannable, like abductors (too unknown), androids (too artificial) or skeletons (too magic) if("set_target_species") diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 95f73e76490..454dedaf125 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -131,7 +131,7 @@ settableTemperatureRange = cap * 30 efficiency = (cap + 1) * 10000 - targetTemperature = CLAMP(targetTemperature, + targetTemperature = clamp(targetTemperature, max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) @@ -234,7 +234,7 @@ target= text2num(target) + T0C . = TRUE if(.) - targetTemperature = CLAMP(round(target), + targetTemperature = clamp(round(target), max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) if("eject") 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/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index cfc23656d8f..545e2d9ab63 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -192,12 +192,12 @@ /obj/machinery/syndicatebomb/proc/settings(mob/user) var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num|null - + if (isnull(new_timer)) return - + if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station - timer_set = CLAMP(new_timer, minimum_timer, maximum_timer) + timer_set = clamp(new_timer, minimum_timer, maximum_timer) loc.visible_message("[icon2html(src, viewers(src))] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(!active) 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/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/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..7ac11a09af7 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -65,7 +65,7 @@ /obj/machinery/mecha_part_fabricator/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [rmat.local_size] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%." + . += "The status display reads: Storing up to [rmat.local_size] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.
" /obj/machinery/mecha_part_fabricator/emag_act() if(obj_flags & EMAGGED) @@ -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..44a5cc69c74 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, + "key" = /obj/item/assembly/signaler/anomaly/bluespace, "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 @@ -1668,8 +1189,8 @@ user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") if(26) if(diff==FORWARD) - user.visible_message("[user] carefully inserts the anomaly core into [parent] and secures it.", - "You slowly place the anomaly core into its socket and close its chamber.") + user.visible_message("[user] carefully inserts the bluespace anomaly core into [parent] and secures it.", + "You slowly place the bluespace anomaly core into its socket and close its chamber.") return TRUE //ODYSSEUS @@ -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..78b8179799f 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -8,7 +8,7 @@ anchored = TRUE light_range = 3 var/movechance = 70 - var/obj/item/assembly/signaler/anomaly/aSignal + var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly var/area/impact_area var/lifespan = 990 @@ -26,8 +26,7 @@ if (!impact_area) return INITIALIZE_HINT_QDEL - aSignal = new(src) - aSignal.name = "[name] core" + aSignal = new aSignal(src) aSignal.code = rand(1,100) aSignal.anomaly_type = type @@ -88,6 +87,7 @@ icon_state = "shield2" density = FALSE var/boing = 0 + aSignal = /obj/item/assembly/signaler/anomaly/grav /obj/effect/anomaly/grav/anomalyEffect() ..() @@ -142,6 +142,7 @@ name = "flux wave anomaly" icon_state = "electricity2" density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/flux var/canshock = FALSE var/shockdamage = 20 var/explosive = TRUE @@ -180,6 +181,7 @@ icon = 'icons/obj/projectiles.dmi' icon_state = "bluespace" density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/bluespace /obj/effect/anomaly/bluespace/anomalyEffect() ..() @@ -252,6 +254,7 @@ name = "pyroclastic anomaly" icon_state = "mustard" var/ticks = 0 + aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/pyro/anomalyEffect() ..() @@ -276,11 +279,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)].") ///////////////////// @@ -289,6 +298,7 @@ name = "vortex anomaly" icon_state = "bhole3" desc = "That's a nice station you have there. It'd be a shame if something happened to it." + aSignal = /obj/item/assembly/signaler/anomaly/vortex /obj/effect/anomaly/bhole/anomalyEffect() ..() diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index bf7ff0818c0..04811e40a08 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) @@ -440,7 +440,7 @@ icon_state = "poster1_legit" /obj/structure/sign/poster/official/nanotrasen_logo - name = "Nanotrasen Logo" + name = "\improper Nanotrasen logo" desc = "A poster depicting the Nanotrasen logo." icon_state = "poster2_legit" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index c988704828b..c6f8422c6cf 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)) @@ -100,6 +100,9 @@ S.blood_state = blood_state update_icon() H.update_inv_shoes() +/atom/effect/decal/cleanable/washed(atom/washer) + . = ..() + qdel(src) /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 055c792d684..7ba12e24770 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -231,3 +231,9 @@ icon = 'icons/obj/objects.dmi' icon_state = "shards" color = "#c6f4ff" + +/obj/effect/decal/cleanable/wrapping + name = "wrapping shreds" + desc = "Torn pieces of cardboard and paper, left over from a package." + icon = 'icons/obj/objects.dmi' + icon_state = "paper_shreds" 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/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.dm b/code/game/objects/items.dm index 6eba8746a31..f443a0aec83 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,6 +4,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // if true, everyone item when created will have its name changed to be // more... RPG-like. +GLOBAL_VAR_INIT(stickpocalypse, FALSE) // if true, all non-embeddable items will be able to harmlessly stick to people when thrown +GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to embed in people, takes precedence over stickpocalypse + /obj/item name = "item" icon = 'icons/obj/items_and_weapons.dmi' @@ -85,7 +88,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged - var/datum/embedding_behavior/embedding + var/list/embedding = NONE var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES var/heat = 0 @@ -129,7 +132,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/Initialize() - if (attack_verb) + if(attack_verb) attack_verb = typelist("attack_verb", attack_verb) . = ..() @@ -137,9 +140,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) new path(src) actions_types = null - if(GLOB.rpg_loot_items) - AddComponent(/datum/component/fantasy) - if(force_string) item_flags |= FORCE_STRING_OVERRIDE @@ -149,16 +149,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(damtype == "brute") hitsound = "swing_hit" - if (!embedding) - embedding = getEmbeddingBehavior() - else if (islist(embedding)) - embedding = getEmbeddingBehavior(arglist(embedding)) - else if (!istype(embedding, /datum/embedding_behavior)) - stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()") - - if(sharpness) //give sharp objects butchering functionality, for consistency - AddComponent(/datum/component/butchering, 80 * toolspeed) - /obj/item/Destroy() item_flags &= ~DROPDEL //prevent reqdels if(ismob(loc)) @@ -178,6 +168,28 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(B && B.loc == loc) qdel(src) +/obj/item/ComponentInitialize() + . = ..() + + // this proc says it's for initializing components, but we're initializing elements too because it's you and me against the world >:) + if(embedding) + AddElement(/datum/element/embed, embedding) + else if(GLOB.embedpocalypse) + embedding = EMBED_POINTY + AddElement(/datum/element/embed, embedding) + name = "pointy [name]" + else if(GLOB.stickpocalypse) + embedding = EMBED_HARMLESS + AddElement(/datum/element/embed, embedding) + name = "sticky [name]" + + if(GLOB.rpg_loot_items) + AddComponent(/datum/component/fantasy) + + if(sharpness) //give sharp objects butchering functionality, for consistency + AddComponent(/datum/component/butchering, 80 * toolspeed) + + //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -530,7 +542,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.adjust_blurriness(15) if(M.stat != DEAD) to_chat(M, "Your eyes start to bleed profusely!") - if(!(HAS_TRAIT(M, TRAIT_BLIND) || HAS_TRAIT(M, TRAIT_NEARSIGHT))) + if(!(M.is_blind() || HAS_TRAIT(M, TRAIT_NEARSIGHT))) to_chat(M, "You become nearsighted!") M.become_nearsighted(EYE_DAMAGE) if(prob(50)) @@ -863,3 +875,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/doStrip(mob/stripper, mob/owner) return owner.dropItemToGround(src) + +/** + * Does the current embedding var meet the criteria for being harmless? Namely, does it have a pain multiplier and jostle pain mult of 0? If so, return true. + * + */ +/obj/item/proc/is_embed_harmless() + if(embedding) + return (!embedding["pain_mult"] && !embedding["jostle_pain_mult"]) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 7865320f050..5729c63ca22 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -95,7 +95,7 @@ /obj/item/station_charter/flag - name = "nanotrasen banner" + name = "\improper Nanotrasen banner" icon = 'icons/obj/banner.dmi' name_type = "planet" icon_state = "banner" diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index a2557d56879..c385be7b793 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) @@ -200,7 +203,7 @@ /obj/structure/chrono_field/update_icon() var/ttk_frame = 1 - (tickstokill / initial(tickstokill)) - ttk_frame = CLAMP(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) + ttk_frame = clamp(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) if(ttk_frame != RPpos) RPpos = ttk_frame mob_underlay.icon_state = "frame[RPpos]" @@ -234,6 +237,8 @@ else gun = null return .() + else if(!attached) + tickstokill-- else tickstokill++ else diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index d78d4202c0c..bc0b228790e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -420,7 +420,7 @@ //Supply /obj/item/circuitboard/computer/bounty - name = "Nanotrasen Bounty Console (Computer Board)" + name = "\improper Nanotrasen Bounty Console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/bounty diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 73f5ced87c0..1d5102bbaf1 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -702,7 +702,7 @@ if(!new_cost || (loc != user)) to_chat(user, "You must hold the circuitboard to change its cost!") return - custom_cost = CLAMP(round(new_cost, 1), 10, 1000) + custom_cost = clamp(round(new_cost, 1), 10, 1000) to_chat(user, "The cost is now set to [custom_cost].") /obj/item/circuitboard/machine/medical_kiosk/examine(mob/user) @@ -883,7 +883,7 @@ if(!new_cloud || (loc != user)) to_chat(user, "You must hold the circuitboard to change its Cloud ID!") return - cloud_id = CLAMP(round(new_cloud, 1), 1, 100) + cloud_id = clamp(round(new_cloud, 1), 1, 100) /obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user) . = ..() @@ -1172,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 @@ -1207,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/crab17.dm b/code/game/objects/items/crab17.dm index 6cb0a22b5d4..13847dc517e 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -24,7 +24,7 @@ dumped = TRUE /obj/structure/checkoutmachine - name = "Nanotrasen Space-Coin Market" + name = "\improper Nanotrasen Space-Coin Market" desc = "This is good for spacecoin because" icon = 'icons/obj/money_machine.dmi' icon_state = "bogdanoff" @@ -210,7 +210,7 @@ bogdanoff = user addtimer(CALLBACK(src, .proc/startLaunch), 100) sound_to_playing_players('sound/items/dump_it.ogg', 20) - deadchat_broadcast("Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!", turf_target = get_turf(src)) + deadchat_broadcast("Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!", turf_target = get_turf(src), message_type=DEADCHAT_ANNOUNCEMENT) /obj/effect/dumpeetTarget/proc/startLaunch() DF = new /obj/effect/dumpeetFall(drop_location()) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 5219a3032fd..b89a60a326d 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -335,8 +335,8 @@ var/clicky if(click_params && click_params["icon-x"] && click_params["icon-y"]) - clickx = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - clicky = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + clickx = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + clicky = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) if(!instant) to_chat(user, "You start drawing a [temp] on the [target.name]...") diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 7ca699371b0..52757dedaac 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -276,7 +276,7 @@ return /obj/item/defibrillator/compact/combat/loaded/nanotrasen - name = "elite nanotrasen defibrillator" + name = "elite Nanotrasen defibrillator" desc = "A belt-equipped state-of-the-art defibrillator. Can revive through spacesuits, has an experimental self-recharging battery, and can be utilized in combat via applying the paddles in a disarming or agressive manner." icon_state = "defibnt" //needs defib inhand sprites item_state = "defibnt" @@ -659,7 +659,7 @@ base_icon_state = "syndiepaddles" /obj/item/twohanded/shockpaddles/syndicate/nanotrasen - name = "elite nanotrasen defibrillator paddles" + name = "elite Nanotrasen defibrillator paddles" desc = "A pair of paddles used to revive deceased ERT members. They possess both the ability to penetrate armor and to deliver powerful or disabling shocks offensively." icon_state = "ntpaddles0" item_state = "ntpaddles0" diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index fc1b6380f26..92a8a0c2469 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -60,7 +60,7 @@ interact(user) /obj/item/camera_bug/check_eye(mob/user) - if ( loc != user || user.incapacitated() || user.eye_blind || !current ) + if ( loc != user || user.incapacitated() || user.is_blind() || !current ) user.unset_machine() return 0 var/turf/T_user = get_turf(user.loc) diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index d9735dea15b..f5b7cd58fdd 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -38,7 +38,7 @@ var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num if(new_duration) new_duration = new_duration SECONDS - new_duration = CLAMP(new_duration, 50, max_duration) + new_duration = clamp(new_duration, 50, max_duration) duration = new_duration to_chat(user, "You set the duration to [DisplayTimeText(duration)].") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 8fe7c4b711b..89aefd48318 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -42,7 +42,7 @@ return 1 /obj/item/flashlight/suicide_act(mob/living/carbon/human/user) - if (user.eye_blind) + if (user.is_blind()) user.visible_message("[user] is putting [src] close to [user.p_their()] eyes and turning it on... but [user.p_theyre()] blind!") return SHAME user.visible_message("[user] is putting [src] close to [user.p_their()] eyes and turning it on! It looks like [user.p_theyre()] trying to commit suicide!") @@ -86,7 +86,7 @@ else user.visible_message("[user] directs [src] to [M]'s eyes.", \ "You direct [src] to [M]'s eyes.") - if(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_BLIND)) || !M.flash_act(visual = 1)) //mob is dead or fully blind + if(M.stat == DEAD || (M.is_blind()) || !M.flash_act(visual = 1)) //mob is dead or fully blind to_chat(user, "[M]'s pupils don't react to the light!") else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-ray vision to_chat(user, "[M]'s pupils give an eerie glow!") @@ -276,11 +276,7 @@ STOP_PROCESSING(SSobj, src) /obj/item/flashlight/flare/ignition_effect(atom/A, mob/user) - if(fuel && on) - . = "[user] lights [A] with [src] like a real \ - badass." - else - . = "" + . = fuel && on ? "[user] lights [A] with [src] like a real badass." : "" /obj/item/flashlight/flare/proc/turn_off() on = FALSE diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 67ac4f310f1..a7456e5b286 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -114,6 +114,16 @@ icon_state = "[initial(icon_state)]" update_icon() +/obj/item/instrument/piano_synth/headphones/spacepods + name = "\improper 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." diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 232b9c71dbd..5e8db504704 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -134,7 +134,7 @@ //catpeople for(var/mob/living/carbon/human/H in view(1,targloc)) - if(!isfelinid(H) || H.incapacitated() || H.eye_blind ) + if(!isfelinid(H) || H.incapacitated() || H.is_blind()) continue if(user.mobility_flags & MOBILITY_STAND) H.setDir(get_dir(H,targloc)) // kitty always looks at the light diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 2ba67135243..de808acbd90 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -165,7 +165,7 @@ // Negative numbers will subtract /obj/item/lightreplacer/proc/AddUses(amount = 1) - uses = CLAMP(uses + amount, 0, max_uses) + uses = clamp(uses + amount, 0, max_uses) /obj/item/lightreplacer/proc/AddShards(amount = 1, user) bulb_shards += amount 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/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 62dfab7d024..f617e8dc300 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -10,23 +10,25 @@ slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE custom_materials = list(/datum/material/iron=10000, /datum/material/glass=2500) + var/ui_x = 260 + var/ui_y = 137 var/on = TRUE var/code = 2 var/frequency = FREQ_ELECTROPACK - var/shock_cooldown = 0 - -/obj/item/electropack/suicide_act(mob/user) - user.visible_message("[user] hooks [user.p_them()]self to the electropack and spams the trigger! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) + var/shock_cooldown = FALSE /obj/item/electropack/Initialize() . = ..() - SSradio.add_object(src, frequency, RADIO_SIGNALER) + set_frequency(frequency) /obj/item/electropack/Destroy() SSradio.remove_object(src, frequency) return ..() +/obj/item/electropack/suicide_act(mob/user) + user.visible_message("[user] hooks [user.p_them()]self to the electropack and spams the trigger! It looks like [user.p_theyre()] trying to commit suicide!") + return (FIRELOSS) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/electropack/attack_hand(mob/user) if(iscarbon(user)) @@ -56,55 +58,15 @@ else return ..() -/obj/item/electropack/Topic(href, href_list) - //..() - var/mob/living/carbon/C = usr - if(usr.stat || usr.restrained() || C.back == src) - return - if((ishuman(usr) && usr.contents.Find(src)) || usr.contents.Find(master) || (in_range(src, usr) && isturf(loc))) - usr.set_machine(src) - if(href_list["freq"]) - SSradio.remove_object(src, frequency) - frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) - SSradio.add_object(src, frequency, RADIO_SIGNALER) - else - if(href_list["code"]) - code += text2num(href_list["code"]) - code = round(code) - code = min(100, code) - code = max(1, code) - else - if(href_list["power"]) - on = !( on ) - icon_state = "electropack[on]" - if(!( master )) - if(ismob(loc)) - attack_self(loc) - else - for(var/mob/M in viewers(1, src)) - if(M.client) - attack_self(M) - else - if(ismob(master.loc)) - attack_self(master.loc) - else - for(var/mob/M in viewers(1, master)) - if(M.client) - attack_self(M) - else - usr << browse(null, "window=radio") - return - return - /obj/item/electropack/receive_signal(datum/signal/signal) if(!signal || signal.data["code"] != code) return if(isliving(loc) && on) - if(shock_cooldown != 0) + if(shock_cooldown) return - shock_cooldown = 1 - addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100) + shock_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 100) var/mob/living/L = loc step(L, pick(GLOB.cardinals)) @@ -117,28 +79,63 @@ if(master) master.receive_signal() - return -/obj/item/electropack/attack_self(mob/user) +/obj/item/electropack/proc/set_frequency(new_frequency) + SSradio.remove_object(src, frequency) + frequency = new_frequency + SSradio.add_object(src, frequency, RADIO_SIGNALER) - if(!ishuman(user)) +/obj/item/electropack/ui_status(mob/user) + var/mob/living/carbon/C = user + if(C?.back == src) + return UI_CLOSE + return ..() + +/obj/item/electropack/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, "electropack", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/electropack/ui_data(mob/user) + var/list/data = list() + data["power"] = on + data["frequency"] = frequency + data["code"] = code + data["minFrequency"] = MIN_FREE_FREQ + data["maxFrequency"] = MAX_FREE_FREQ + return data + +/obj/item/electropack/ui_act(action, params) + if(..()) return - user.set_machine(src) - var/dat = {"Turned [on ? "On" : "Off"] - -Toggle
-Frequency/Code for electropack:
-Frequency: -- -- [format_frequency(frequency)] -+ -+
-Code: -- -- [code] -+ -+
-
"} - user << browse(dat, "window=radio") - onclose(user, "radio") - return + var/mob/living/carbon/C = usr + if(C?.back == src) + return + + switch(action) + if("power") + on = !on + icon_state = "electropack[on]" + . = TRUE + if("freq") + var/value = unformat_frequency(params["freq"]) + if(value) + frequency = sanitize_frequency(value, TRUE) + set_frequency(frequency) + . = TRUE + if("code") + var/value = text2num(params["code"]) + if(value) + value = round(value) + code = clamp(value, 1, 100) + . = TRUE + if("reset") + if(params["reset"] == "freq") + frequency = initial(frequency) + . = TRUE + else if(params["reset"] == "code") + code = initial(code) + . = TRUE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8917927b4ee..e3881672e6d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -133,7 +133,7 @@ GENE SCANNER // Used by the PDA medical scanner too /proc/healthscan(mob/user, mob/living/M, mode = SCANNER_VERBOSE, advanced = FALSE) - if(isliving(user) && (user.incapacitated() || user.eye_blind)) + if(isliving(user) && (user.incapacitated() || user.is_blind())) return // the final list of strings to render @@ -256,7 +256,7 @@ GENE SCANNER message = "\nSubject does not have eyes." if(istype(eyes)) message = "" - if(HAS_TRAIT(C, TRAIT_BLIND)) + if(C.is_blind()) message += "\nSubject is blind." if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) message += "\nSubject is nearsighted." @@ -429,7 +429,7 @@ GENE SCANNER /obj/item/analyzer/attack_self(mob/user) add_fingerprint(user) - if (user.stat || user.eye_blind) + if (user.stat || user.is_blind()) return var/turf/location = user.loc @@ -590,7 +590,7 @@ GENE SCANNER custom_materials = list(/datum/material/iron=30, /datum/material/glass=20) /obj/item/slime_scanner/attack(mob/living/M, mob/living/user) - if(user.stat || user.eye_blind) + if(user.stat || user.is_blind()) return if (!isslime(M)) to_chat(user, "This device can only scan slimes!") 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..3a3bdec7ff2 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" @@ -232,7 +250,7 @@ effective or pretty fucking useless. charge = max(0,charge - 25)//Quick decrease in light else charge = min(max_charge,charge + 50) //Charge in the dark - animate(user,alpha = CLAMP(255 - charge,0,255),time = 10) + animate(user,alpha = clamp(255 - charge,0,255),time = 10) /obj/item/jammer diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 5b012089f8e..a30a22b6777 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -7,12 +7,14 @@ righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' desc = "Regulates the transfer of air between two tanks." w_class = WEIGHT_CLASS_BULKY + var/ui_x = 310 + var/ui_y = 320 var/obj/item/tank/tank_one var/obj/item/tank/tank_two var/obj/item/assembly/attached_device var/mob/attacher = null var/valve_open = FALSE - var/toggle = 1 + var/toggle = TRUE /obj/item/transfer_valve/IsAssemblyHolder() return TRUE @@ -54,7 +56,7 @@ attacher = user return -//Attached device memes +//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. /obj/item/transfer_valve/Move() . = ..() if(attached_device) @@ -74,58 +76,14 @@ if(attached_device) attached_device.Crossed(AM) -/obj/item/transfer_valve/attack_hand()//Triggers mousetraps +//Triggers mousetraps +/obj/item/transfer_valve/attack_hand() . = ..() if(.) return if(attached_device) attached_device.attack_hand() -//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. - - -/obj/item/transfer_valve/attack_self(mob/user) - user.set_machine(src) - var/dat = {" Valve properties: -
Attachment one: [tank_one] [tank_one ? "Remove" : ""] -
Attachment two: [tank_two] [tank_two ? "Remove" : ""] -
Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""] -
Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"} - - var/datum/browser/popup = new(user, "trans_valve", name) - popup.set_content(dat) - popup.open() - return - -/obj/item/transfer_valve/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src, BE_CLOSE)) - return - if(tank_one && href_list["tankone"]) - split_gases() - valve_open = FALSE - tank_one.forceMove(drop_location()) - tank_one = null - update_icon() - else if(tank_two && href_list["tanktwo"]) - split_gases() - valve_open = FALSE - tank_two.forceMove(drop_location()) - tank_two = null - update_icon() - else if(href_list["open"]) - toggle_valve() - else if(attached_device) - if(href_list["rem_device"]) - attached_device.on_detach() - attached_device = null - update_icon() - if(href_list["device"]) - attached_device.attack_self(usr) - - attack_self(usr) - add_fingerprint(usr) - /obj/item/transfer_valve/proc/process_activation(obj/item/D) if(toggle) toggle = FALSE @@ -186,11 +144,10 @@ tank_one.air_contents.merge(temp) tank_two.air_contents.volume -= tank_one.air_contents.volume - /* +/* Exadv1: I know this isn't how it's going to work, but this was just to check it explodes properly when it gets a signal (and it does). - */ - +*/ /obj/item/transfer_valve/proc/toggle_valve() if(!valve_open && tank_one && tank_two) valve_open = TRUE @@ -216,7 +173,6 @@ admin_bomber_message = " - Last touched by: [ADMIN_LOOKUPFLW(bomber)]" bomber_message = " - Last touched by: [key_name_admin(bomber)]" - var/admin_bomb_message = "Bomb valve opened in [ADMIN_VERBOSEJMP(bombturf)][admin_attachment_message][admin_bomber_message]" GLOB.bombers += admin_bomb_message message_admins(admin_bomb_message) @@ -230,8 +186,58 @@ split_gases() valve_open = FALSE update_icon() - -// this doesn't do anything but the timer etc. expects it to be here -// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs +/* + This doesn't do anything but the timer etc. expects it to be here + eventually maybe have it update icon to show state (timer, prox etc.) like old bombs +*/ /obj/item/transfer_valve/proc/c_state() return + +/obj/item/transfer_valve/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, "transfer_valve", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/transfer_valve/ui_data(mob/user) + var/list/data = list() + data["tank_one"] = tank_one + data["tank_two"] = tank_two + data["attached_device"] = attached_device + data["valve"] = valve_open + return data + +/obj/item/transfer_valve/ui_act(action, params) + if(..()) + return + + switch(action) + if("tankone") + if(tank_one) + split_gases() + valve_open = FALSE + tank_one.forceMove(drop_location()) + tank_one = null + . = TRUE + if("tanktwo") + if(tank_two) + split_gases() + valve_open = FALSE + tank_two.forceMove(drop_location()) + tank_two = null + . = TRUE + if("toggle") + toggle_valve() + . = TRUE + if("device") + if(attached_device) + attached_device.attack_self(usr) + . = TRUE + if("remove_device") + if(attached_device) + attached_device.on_detach() + attached_device = null + . = TRUE + + update_icon() diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 0e15f306885..25210566996 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -189,7 +189,7 @@ obj/item/dice/d6/ebony /obj/item/dice/proc/diceroll(mob/user) result = roll(sides) if(rigged != DICE_NOT_RIGGED && result != rigged_value) - if(rigged == DICE_BASICALLY_RIGGED && prob(CLAMP(1/(sides - 1) * 100, 25, 80))) + if(rigged == DICE_BASICALLY_RIGGED && prob(clamp(1/(sides - 1) * 100, 25, 80))) result = rigged_value else if(rigged == DICE_TOTALLY_RIGGED) result = rigged_value 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/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index e07d42edfce..ae5fc2dc426 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -273,7 +273,7 @@ var/newspread = text2num(stripped_input(user, "Please enter a new spread amount", name)) if (newspread != null && user.canUseTopic(src, BE_CLOSE)) newspread = round(newspread) - unit_spread = CLAMP(newspread, 5, 100) + unit_spread = clamp(newspread, 5, 100) to_chat(user, "You set the time release to [unit_spread] units per detonation.") if (newspread != unit_spread) to_chat(user, "The new value is out of bounds. Minimum spread is 5 units, maximum is 100 units.") diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index 4e35987cdd3..a7ae03bd125 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -89,12 +89,12 @@ obj/item/grenade/firecracker/wirecutter_act(mob/living/user, obj/item/I) return if(det_time) det_time -= 10 - to_chat(user, "You shorten the fuse of [src] with [I].") + to_chat(user, "You shorten the fuse of [src] with [I].") playsound(src, 'sound/items/wirecutter.ogg', 20, TRUE) icon_state = initial(icon_state) + "_[det_time]" update_icon() else - to_chat(user, "You've already removed all of the fuse!") + to_chat(user, "You've already removed all of the fuse!") obj/item/grenade/firecracker/preprime(mob/user, delayoverride, msg = TRUE, volume = 80) var/turf/T = get_turf(src) diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 1295fe56f32..eb7e79a1104 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -45,7 +45,7 @@ /obj/item/grenade/iedcasing/attack_self(mob/user) // if(!active) - if(clown_check(user)) + if(!botch_check(user)) to_chat(user, "You light the [name]!") cut_overlay("improvised_grenade_filled") preprime(user, null, FALSE) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 4871a90f1ee..4d4277aef9a 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -17,6 +17,7 @@ var/det_time = 50 var/display_timer = 1 var/clumsy_check = GRENADE_CLUMSY_FUMBLE + var/sticky = FALSE /obj/item/grenade/suicide_act(mob/living/carbon/user) user.visible_message("[user] primes [src], then eats it! It looks like [user.p_theyre()] trying to commit suicide!") @@ -32,19 +33,20 @@ if(!QDELETED(src)) qdel(src) -/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user) +/obj/item/grenade/proc/botch_check(mob/living/carbon/human/user) var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY) if(clumsy && (clumsy_check == GRENADE_CLUMSY_FUMBLE)) if(prob(50)) to_chat(user, "Huh? How does this thing work?") preprime(user, 5, FALSE) - return FALSE + return TRUE else if(!clumsy && (clumsy_check == GRENADE_NONCLUMSY_FUMBLE)) to_chat(user, "You pull the pin on [src]. Attached to it is a pink ribbon that says, \"HONK\"") preprime(user, 5, FALSE) - return FALSE - return TRUE - + return TRUE + else if(sticky && prob(50)) // to add risk to sticky tape grenade cheese, no return cause we still prime as normal after + to_chat(user, "What the... [src] is stuck to your hand!") + ADD_TRAIT(src, TRAIT_NODROP, STICKY_NODROP) /obj/item/grenade/examine(mob/user) . = ..() @@ -56,8 +58,16 @@ /obj/item/grenade/attack_self(mob/user) + if(HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "You try prying [src] off your hand...") + if(do_after(user, 70, target=src)) + to_chat(user, "You manage to remove [src] from your hand.") + REMOVE_TRAIT(src, TRAIT_NODROP, STICKY_NODROP) + + return + if(!active) - if(clown_check(user)) + if(!botch_check(user)) // if they botch the prime, it'll be handled in botch_check preprime(user) /obj/item/grenade/proc/log_grenade(mob/user, turf/T) @@ -103,7 +113,7 @@ if(time != null) if(time < 3) time = 3 - det_time = round(CLAMP(time * 10, 0, 50)) + det_time = round(clamp(time * 10, 0, 50)) else var/previous_time = det_time switch(det_time) diff --git a/code/game/objects/items/grenades/hypno.dm b/code/game/objects/items/grenades/hypno.dm new file mode 100644 index 00000000000..5d7652bb303 --- /dev/null +++ b/code/game/objects/items/grenades/hypno.dm @@ -0,0 +1,66 @@ +/obj/item/grenade/hypnotic + name = "flashbang" + desc = "A modified flashbang which uses hypnotic flashes and mind-altering soundwaves to induce an instant trance upon detonation." + icon_state = "flashbang" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + var/flashbang_range = 7 + +/obj/item/grenade/hypnotic/prime() + update_mob() + var/flashbang_turf = get_turf(src) + if(!flashbang_turf) + return + do_sparks(rand(5, 9), FALSE, src) + playsound(flashbang_turf, 'sound/effects/screech.ogg', 100, TRUE, 8, 0.9) + new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_PURPLE, (flashbang_range + 2), 4, 2) + for(var/mob/living/M in get_hearers_in_view(flashbang_range, flashbang_turf)) + bang(get_turf(M), M) + qdel(src) + +/obj/item/grenade/hypnotic/proc/bang(turf/T, mob/living/M) + if(M.stat == DEAD) //They're dead! + return + var/distance = max(0,get_dist(get_turf(src),T)) + + //Bang + var/hypno_sound = FALSE + + //Hearing protection check + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/list/reflist = list(1) + SEND_SIGNAL(C, COMSIG_CARBON_SOUNDBANG, reflist) + var/intensity = reflist[1] + var/ear_safety = C.get_ear_protection() + var/effect_amount = intensity - ear_safety + if(effect_amount > 0) + hypno_sound = TRUE + + if(!distance || loc == M || loc == M.loc) + M.Paralyze(10) + M.Knockdown(100) + to_chat(M, "The sound echoes in your brain...") + M.hallucination += 50 + else + if(distance <= 1) + M.Paralyze(5) + M.Knockdown(30) + if(hypno_sound) + to_chat(M, "The sound echoes in your brain...") + M.hallucination += 50 + + //Flash + if(M.flash_act(affect_silicon = 1)) + M.Paralyze(max(10/max(1,distance), 5)) + M.Knockdown(max(100/max(1,distance), 40)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.hypnosis_vulnerable()) //The sound causes the necessary conditions unless the target has mindshield or hearing protection + C.apply_status_effect(/datum/status_effect/trance, 100, TRUE) + else + to_chat(C, "The light is so pretty...") + C.confused += min(C.confused + 10, 20) + C.dizziness += min(C.dizziness + 10, 20) + C.drowsyness += min(C.drowsyness + 10, 20) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 2830f08755d..b0e3d45c9cb 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -72,7 +72,7 @@ return if(user.get_active_held_item() == src) - newtime = CLAMP(newtime, 10, 60000) + newtime = clamp(newtime, 10, 60000) det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") @@ -100,7 +100,9 @@ var/obj/item/I = AM I.throw_speed = max(1, (I.throw_speed - 3)) I.throw_range = max(1, (I.throw_range - 3)) - I.embedding = I.embedding.setRating(embed_chance = 0) + if(I.embedding) + I.embedding["embed_chance"] = 0 + I.AddElement(/datum/element/embed, I.embedding) else if(istype(AM, /mob/living)) plastic_overlay.layer = FLOAT_LAYER diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 57339451237..802efc2fcf5 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -196,9 +196,9 @@ /obj/item/his_grace/proc/adjust_bloodthirst(amt) prev_bloodthirst = bloodthirst if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER && !ascended) - bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) + bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) else if(!ascended) - bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) + bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) update_stats() /obj/item/his_grace/proc/update_stats() 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/hot_potato.dm b/code/game/objects/items/hot_potato.dm index aa7a20480d8..50ca27defc3 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -77,7 +77,7 @@ L.SetImmobilized(0) L.SetParalyzed(0) L.SetUnconscious(0) - L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, CLAMP(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck! + L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, clamp(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck! colorize(L) /obj/item/hot_potato/examine(mob/user) 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/kitchen.dm b/code/game/objects/items/kitchen.dm index 0e32c922568..a160be95f41 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -157,7 +157,7 @@ name = "combat knife" icon_state = "buckknife" desc = "A military combat utility survival knife." - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 65, "embedded_fall_chance" = 10, "embedded_ignore_throwspeed_threshold" = TRUE) + embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) force = 20 throwforce = 20 attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") @@ -166,7 +166,7 @@ /obj/item/kitchen/knife/combat/survival name = "survival knife" icon_state = "survivalknife" - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 35, "embedded_fall_chance" = 10) + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) desc = "A hunting grade survival knife." force = 15 throwforce = 15 @@ -179,7 +179,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A sharpened bone. The bare minimum in survival." - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 35, "embedded_fall_chance" = 10) + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) force = 15 throwforce = 15 custom_materials = null diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 74e524ff041..7f178e43b98 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -99,7 +99,7 @@ throw_speed = 3 throw_range = 5 sharpness = IS_SHARP - embedding = list("embed_chance" = 75, "embedded_impact_pain_multiplier" = 10) + embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) armour_penetration = 35 block_chance = 50 diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 578d6d398f6..0bf164d81ea 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -22,6 +22,8 @@ else if(attack_verb_off.len) attack_verb = attack_verb_off + if(embedding) + RemoveElement(/datum/element/embed, embedding) if(sharpness) AddComponent(/datum/component/butchering, 50, 100, 0, hitsound) @@ -53,6 +55,8 @@ attack_verb = attack_verb_on icon_state = icon_state_on w_class = w_class_on + if(embedding) + AddElement(/datum/element/embed, embedding) else force = initial(force) throwforce = initial(throwforce) @@ -62,6 +66,9 @@ attack_verb = attack_verb_off icon_state = initial(icon_state) w_class = initial(w_class) + if(embedding) + RemoveElement(/datum/element/embed, embedding) + transform_messages(user, supress_message_text) add_fingerprint(user) return TRUE diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 77521788db6..1dbd87d1733 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -14,7 +14,7 @@ /obj/item/choice_beacon name = "choice beacon" - desc = "Hey, why are you viewing this?!! Please let Centcom know about this odd occurance." + desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence." icon = 'icons/obj/device.dmi' icon_state = "gangtool-blue" item_state = "radio" @@ -157,7 +157,7 @@ ///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) @@ -179,7 +179,8 @@ return to_chat(joe, "As you burn the picture, a nickname comes to mind...") - var/nickname = input(joe, "Pick a nickname", "Mafioso Nicknames") as text|null + 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 @@ -194,6 +195,8 @@ 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) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index a9bcae025ae..3774bb79bfd 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -174,7 +174,7 @@ fire_items(T, user) if(pressureSetting >= 3 && iscarbon(user)) var/mob/living/carbon/C = user - C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") + C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") C.Paralyze(60) /obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user) @@ -212,8 +212,8 @@ return target var/x_o = (target.x - starting.x) var/y_o = (target.y - starting.y) - var/new_x = CLAMP((starting.x + (x_o * range_multiplier)), 0, world.maxx) - var/new_y = CLAMP((starting.y + (y_o * range_multiplier)), 0, world.maxy) + var/new_x = clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) + var/new_y = clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget 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/religion.dm b/code/game/objects/items/religion.dm index eee6bc44679..b07b76833df 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -227,7 +227,7 @@ desc = "A banner with the logo of the blue deity." /obj/item/storage/backpack/bannerpack - name = "nanotrasen banner backpack" + name = "\improper Nanotrasen banner backpack" desc = "It's a backpack with lots of extra room. A banner with Nanotrasen's logo is attached, that can't be removed." icon_state = "bannerpack" diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index a546f68dc01..6987b5093de 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -390,7 +390,7 @@ var/obj/item/reagent_containers/food/snacks/L switch(mode) if(DISPENSE_LOLLIPOP_MODE) - L = new /obj/item/reagent_containers/food/snacks/lollipop(T) + L = new /obj/item/reagent_containers/food/snacks/chewable/lollipop(T) if(DISPENSE_ICECREAM_MODE) L = new /obj/item/reagent_containers/food/snacks/icecream(T) var/obj/item/reagent_containers/food/snacks/icecream/I = L @@ -517,13 +517,13 @@ name = "lollipop" desc = "Oh noes! A fast-moving lollipop!" icon_state = "lollipop_1" - ammo_type = /obj/item/reagent_containers/food/snacks/lollipop/cyborg + ammo_type = /obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg var/color2 = rgb(0, 0, 0) nodamage = TRUE /obj/projectile/bullet/reusable/lollipop/Initialize() . = ..() - var/obj/item/reagent_containers/food/snacks/lollipop/S = new ammo_type(src) + var/obj/item/reagent_containers/food/snacks/chewable/lollipop/S = new ammo_type(src) color2 = S.headcolor var/mutable_appearance/head = mutable_appearance('icons/obj/projectiles.dmi', "lollipop_2") head.color = color2 @@ -532,7 +532,7 @@ /obj/projectile/bullet/reusable/lollipop/handle_drop() if(!dropped) var/turf/T = get_turf(src) - var/obj/item/reagent_containers/food/snacks/lollipop/S = new ammo_type(T) + var/obj/item/reagent_containers/food/snacks/chewable/lollipop/S = new ammo_type(T) S.change_head_color(color2) dropped = TRUE @@ -653,7 +653,7 @@ continue usage += projectile_tick_speed_ecost usage += (tracked[I] * projectile_damage_tick_ecost_coefficient) - energy = CLAMP(energy - usage, 0, maxenergy) + energy = clamp(energy - usage, 0, maxenergy) if(energy <= 0) deactivate_field() visible_message("[src] blinks \"ENERGY DEPLETED\".") @@ -663,7 +663,7 @@ if(iscyborg(host.loc)) host = host.loc else - energy = CLAMP(energy + energy_recharge, 0, maxenergy) + energy = clamp(energy + energy_recharge, 0, maxenergy) return if(host.cell && (host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy)) host.cell.use(energy_recharge*energy_recharge_cyborg_drain_coefficient) diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index e93d6502a74..da4ce62437c 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -35,15 +35,15 @@ if(TH.force_wielded > initial(TH.force_wielded)) to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return - TH.force_wielded = CLAMP(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay + TH.force_wielded = clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") playsound(src, 'sound/items/unsheath.ogg', 25, TRUE) I.sharpness = IS_SHARP_ACCURATE - I.force = CLAMP(I.force + increment, 0, max) - I.throwforce = CLAMP(I.throwforce + increment, 0, max) + I.force = clamp(I.force + increment, 0, max) + I.throwforce = clamp(I.throwforce + increment, 0, max) I.name = "[prefix] [I.name]" name = "worn out [name]" desc = "[desc] At least, it used to." 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/rods.dm b/code/game/objects/items/stacks/rods.dm index 32a21c2a1f5..0e8ec6c2bc5 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -21,6 +21,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/gun/general/grenade_launch.ogg' + embedding = list() novariants = TRUE /obj/item/stack/rods/suicide_act(mob/living/carbon/user) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index ac96eb1ce58..eee5d7243b6 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -253,6 +253,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( sharpness = IS_SHARP var/icon_prefix var/obj/item/stack/sheet/weld_material = /obj/item/stack/sheet/glass + embedding = list("embed_chance" = 65) /obj/item/shard/suicide_act(mob/user) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ed3e9d2eeab..cc92934b671 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -193,6 +193,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 8, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index aa21eb24460..92f8c6a691d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -77,9 +77,9 @@ /obj/item/stack/proc/update_weight() if(amount <= (max_amount * (1/3))) - w_class = CLAMP(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) + w_class = clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) else if (amount <= (max_amount * (2/3))) - w_class = CLAMP(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) + w_class = clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) else w_class = full_w_class diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm new file mode 100644 index 00000000000..ec5a1e2d98f --- /dev/null +++ b/code/game/objects/items/stacks/tape.dm @@ -0,0 +1,62 @@ + + +/obj/item/stack/sticky_tape + name = "sticky tape" + singular_name = "sticky tape" + desc = "Used for sticking to things for sticking said things to people." + icon = 'icons/obj/tapes.dmi' + icon_state = "tape_w" + var/prefix = "sticky" + item_flags = NOBLUDGEON + amount = 5 + max_amount = 5 + resistance_flags = FLAMMABLE + grind_results = list(/datum/reagent/cellulose = 5) + + var/list/conferred_embed = EMBED_HARMLESS + var/overwrite_existing = FALSE + +/obj/item/stack/sticky_tape/afterattack(obj/item/I, mob/living/user) + if(!istype(I)) + return + + if(I.embedding && I.embedding == conferred_embed) + to_chat(user, "[I] is already coated in [src]!") + return + + user.visible_message("[user] begins wrapping [I] with [src].", "You begin wrapping [I] with [src].") + + if(do_after(user, 30, target=I)) + I.embedding = conferred_embed + I.AddElement(/datum/element/embed, I.embedding) + to_chat(user, "You finish wrapping [I] with [src].") + use(1) + I.name = "[prefix] [I.name]" + + if(istype(I, /obj/item/grenade)) + var/obj/item/grenade/sticky_bomb = I + sticky_bomb.sticky = TRUE + +/obj/item/stack/sticky_tape/super + name = "super sticky tape" + singular_name = "super sticky tape" + desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution." + icon_state = "tape_y" + prefix = "super sticky" + conferred_embed = EMBED_HARMLESS_SUPERIOR + +/obj/item/stack/sticky_tape/pointy + name = "pointy tape" + singular_name = "pointy tape" + desc = "Used for sticking to things for sticking said things inside people." + icon_state = "tape_evil" + prefix = "pointy" + conferred_embed = EMBED_POINTY + +/obj/item/stack/sticky_tape/pointy/super + name = "super pointy tape" + singular_name = "super pointy tape" + desc = "You didn't know tape could look so sinister. Welcome to Space Station 13." + icon_state = "tape_spikes" + prefix = "super pointy" + conferred_embed = EMBED_POINTY_SUPERIOR diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 4e5248ac445..10720e3290f 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -20,6 +20,9 @@ if(QDELETED(src) && !transfer) new /obj/item/c_tube(T) +/obj/item/stack/wrapping_paper/small + desc = "Wrap packages with this festive paper to make gifts. This roll looks a bit skimpy." + amount = 10 /* * Package Wrap @@ -121,6 +124,11 @@ if(QDELETED(src) && !transfer) new /obj/item/c_tube(T) +/obj/item/stack/packageWrap/small + desc = "You can use this to wrap items in. This roll looks a bit skimpy." + w_class = WEIGHT_CLASS_SMALL + amount = 5 + /obj/item/c_tube name = "cardboard tube" desc = "A tube... of cardboard." diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3c90fbf930f..543ba33bcf0 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -186,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) @@ -538,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() @@ -563,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..659fd936bd6 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 @@ -1266,3 +1270,62 @@ /obj/item/storage/box/sparklers/PopulateContents() for(var/i in 1 to 7) new/obj/item/sparkler(src) + +/obj/item/storage/box/gum + name = "bubblegum packet" + desc = "The packaging is entirely in japanese, apparently. You can't make out a single word of it." + icon_state = "bubblegum_generic" + illustration = null + foldable = null + custom_price = 120 + +/obj/item/storage/box/gum/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.set_holdable(list(/obj/item/storage/box/gum)) + STR.max_items = 4 + +/obj/item/storage/box/gum/PopulateContents() + for(var/i in 1 to 4) + new/obj/item/reagent_containers/food/snacks/chewable/bubblegum(src) + +/obj/item/storage/box/gum/nicotine + name = "nicotine gum packet" + desc = "Designed to help with nicotine addiction and oral fixation all at once without destroying your lungs in the process. Mint flavored!" + icon_state = "bubblegum_nicotine" + custom_premium_price = 275 + +/obj/item/storage/box/gum/nicotine/PopulateContents() + for(var/i in 1 to 4) + new/obj/item/reagent_containers/food/snacks/chewable/bubblegum/nicotine(src) + +/obj/item/storage/box/gum/happiness + name = "HP+ gum packet" + desc = "A seemingly homemade packaging with an odd smell. It has a weird drawing of a smiling face sticking out its tongue." + icon_state = "bubblegum_happiness" + custom_price = 300 + custom_premium_price = 300 + +/obj/item/storage/box/gum/happiness/Initialize() + . = ..() + if (prob(25)) + desc += "You can faintly make out the word 'Hemopagopril' was once scribbled on it." + +/obj/item/storage/box/gum/happiness/PopulateContents() + for(var/i in 1 to 4) + new/obj/item/reagent_containers/food/snacks/chewable/bubblegum/happiness(src) + +/obj/item/storage/box/shipping + name = "box of shipping supplies" + desc = "Contains several scanners and labelers for shipping things. Wrapping Paper not included." + illustration = "shipping" + +/obj/item/storage/box/shipping/PopulateContents() + var/static/items_inside = list( + /obj/item/destTagger=1,\ + /obj/item/sales_tagger=1,\ + /obj/item/export_scanner=1,\ + /obj/item/stack/packageWrap/small=2,\ + /obj/item/stack/wrapping_paper/small=1 + ) + generate_items_inside(items_inside,src) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 88968a6f78a..2ab68658da2 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -146,7 +146,7 @@ return var/static/items_inside = list( /obj/item/reagent_containers/pill/patch/aiuri = 3, - /obj/item/reagent_containers/spray/rhigoxane = 1, + /obj/item/reagent_containers/spray/hercuri = 1, /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, /obj/item/reagent_containers/hypospray/medipen = 1) generate_items_inside(items_inside,src) @@ -222,7 +222,7 @@ var/static/items_inside = list( /obj/item/reagent_containers/pill/patch/libital = 3, /obj/item/stack/medical/gauze = 1, - /obj/item/storage/pill_bottle/trophazole = 1, + /obj/item/storage/pill_bottle/C2/probital = 1, /obj/item/reagent_containers/hypospray/medipen/salacid = 1) generate_items_inside(items_inside,src) @@ -354,13 +354,13 @@ for(var/i in 1 to 3) new /obj/item/reagent_containers/pill/potassiodide(src) -/obj/item/storage/pill_bottle/trophazole - name = "bottle of trophazole pills" - desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting'." +/obj/item/storage/pill_bottle/C2/probital + name = "bottle of probital pills" + desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting, may cause fatigue'." -/obj/item/storage/pill_bottle/trophazole/PopulateContents() +/obj/item/storage/pill_bottle/C2/probital/PopulateContents() for(var/i in 1 to 4) - new /obj/item/reagent_containers/pill/trophazole(src) + new /obj/item/reagent_containers/pill/C2/probital(src) /obj/item/storage/pill_bottle/iron name = "bottle of iron pills" @@ -435,14 +435,6 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/psicodine(src) -/obj/item/storage/pill_bottle/happiness - name = "happiness pill bottle" - desc = "The label is long gone, in its place an 'H' written with a marker." - -/obj/item/storage/pill_bottle/happiness/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/pill/happiness(src) - /obj/item/storage/pill_bottle/penacid name = "bottle of pentetic acid pills" desc = "Contains pills to expunge radiation and toxins." 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/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 9105c7ec258..16283852de7 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -190,7 +190,7 @@ pressure = text2num(pressure) . = TRUE if(.) - distribute_pressure = CLAMP(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) + distribute_pressure = clamp(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) /obj/item/tank/remove_air(amount) return air_contents.remove(amount) @@ -212,7 +212,7 @@ return null var/tank_pressure = air_contents.return_pressure() - var/actual_distribute_pressure = CLAMP(tank_pressure, 0, distribute_pressure) + var/actual_distribute_pressure = clamp(tank_pressure, 0, distribute_pressure) var/moles_needed = actual_distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) 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/twohanded.dm b/code/game/objects/items/twohanded.dm index a3267218453..f03ea924ba0 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -448,7 +448,7 @@ force_wielded = 18 throwforce = 20 throw_speed = 4 - embedding = list("embedded_impact_pain_multiplier" = 3) + embedding = list("impact_pain_mult" = 3) armour_penetration = 10 custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' @@ -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..529526dbd7f 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) @@ -280,12 +280,28 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 2 throwforce = 20 //20 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 28 damage on hit due to guaranteed embedding throw_speed = 4 - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0) + embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0) + + w_class = WEIGHT_CLASS_SMALL sharpness = IS_SHARP custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) resistance_flags = FIRE_PROOF +/obj/item/throwing_star/stamina + name = "shock throwing star" + desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm." + throwforce = 5 + embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3) + +/obj/item/throwing_star/toy + name = "toy throwing star" + desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security." + sharpness = IS_BLUNT + force = 0 + throwforce = 0 + embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) + /obj/item/throwing_star/magspear name = "magnetic spear" desc = "A reusable spear that is typically loaded into kinetic spearguns." @@ -295,7 +311,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 10 throw_range = 0 //throwing these invalidates the speargun attack_verb = list("stabbed", "ripped", "gored", "impaled") - embedding = list("embedded_pain_multiplier" = 8, "embed_chance" = 100, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 15) //55 damage+embed on hit + embedding = list("pain_mult" = 8, "embed_chance" = 100, "fall_chance" = 0, "impact_pain_mult" = 15) //55 damage+embed on hit /obj/item/switchblade name = "switchblade" @@ -475,7 +491,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 +649,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/obj_defense.dm b/code/game/objects/obj_defense.dm index eebcb395b61..e5a093a35d8 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -33,7 +33,7 @@ if(damage_flag) armor_protection = armor.getRating(damage_flag) if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor. - armor_protection = CLAMP(armor_protection - armour_penetration, min(armor_protection, 0), 100) + armor_protection = clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100) return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION) ///the sound played when the obj is damaged. @@ -206,7 +206,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(T.intact && level == 1) //fire can't damage things hidden below the floor. return if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) - take_damage(CLAMP(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) + take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF)) resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src @@ -229,12 +229,10 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e ///Called when the obj is hit by a tesla bolt. /obj/proc/zap_act(power, zap_flags, shocked_targets) if(QDELETED(src)) - return + return 0 obj_flags |= BEING_SHOCKED - if(zap_flags & ZAP_IS_TESLA) - var/power_bounced = power / 2 - tesla_zap(src, 3, power_bounced, zap_flags, shocked_targets) addtimer(CALLBACK(src, .proc/reset_shocked), 10) + return power / 2 //The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health ///Only tesla coils, vehicles, and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later. @@ -242,7 +240,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - buckled_mob.electrocute_act((CLAMP(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) + buckled_mob.electrocute_act((clamp(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) /obj/proc/reset_shocked() obj_flags &= ~BEING_SHOCKED diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 246e4234e10..facf0d301fb 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -235,7 +235,7 @@ if(brain.force_replace_ai_name) A.fully_replace_character_name(A.name, brain.replacement_ai_name()) SSblackbox.record_feedback("amount", "ais_created", 1) - deadchat_broadcast(" has been brought online at [get_area_name(A, TRUE)].", "[A]", follow_target=A) + deadchat_broadcast(" has been brought online at [get_area_name(A, TRUE)].", "[A]", follow_target=A, message_type=DEADCHAT_ANNOUNCEMENT) qdel(src) else state = AI_READY_CORE diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index ffa9d4d1107..b4d306dbe4a 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -39,21 +39,29 @@ name = "canvas" desc = "Draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' - icon_state = "square" + icon_state = "11x11" resistance_flags = FLAMMABLE var/width = 11 var/height = 11 var/list/grid - var/list/top_colors var/canvas_color = "#ffffff" //empty canvas color var/ui_x = 400 var/ui_y = 400 + var/used = FALSE var/painting_name //Painting name, this is set after framing. - var/framed = FALSE //Blocks edits, set on framing + var/finalized = FALSE //Blocks edits + var/icon_generated = FALSE + var/icon/generated_icon + + // Painting overlay offset when framed + var/framed_offset_x = 11 + var/framed_offset_y = 10 + + pixel_x = 10 + pixel_y = 9 /obj/item/canvas/Initialize() . = ..() - top_colors = list() reset_grid() /obj/item/canvas/proc/reset_grid() @@ -85,6 +93,7 @@ . = ..() .["grid"] = grid .["name"] = painting_name + .["finalized"] = finalized /obj/item/canvas/examine(mob/user) . = ..() @@ -92,7 +101,7 @@ /obj/item/canvas/ui_act(action, params) . = ..() - if(. || framed) + if(. || finalized) return var/mob/user = usr switch(action) @@ -104,34 +113,50 @@ var/x = text2num(params["x"]) var/y = text2num(params["y"]) grid[x][y] = color - top_colors = get_most_common_colors(3) + used = TRUE update_icon() . = TRUE + if("finalize") + . = TRUE + if(!finalized) + finalize(user) + +/obj/item/canvas/proc/finalize(mob/user) + finalized = TRUE + generate_proper_overlay() + try_rename(user) /obj/item/canvas/update_overlays() . = ..() - for(var/i in 2 to top_colors.len) //first is used as base color - var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]_detail_[i-1]") - detail.appearance_flags |= RESET_COLOR - detail.color = top_colors[i] + if(!icon_generated) + if(used) + var/mutable_appearance/detail = mutable_appearance(icon,"[icon_state]wip") + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail + else + var/mutable_appearance/detail = mutable_appearance(generated_icon) + detail.pixel_x = 1 + detail.pixel_y = 1 . += detail -/obj/item/canvas/update_icon_state() - . = ..() - if(top_colors.len) - color = top_colors[1] +/obj/item/canvas/proc/generate_proper_overlay() + if(icon_generated) + return + var/png_filename = "data/paintings/temp_painting.png" + var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string()) + if(result) + CRASH("Error generating painting png : [result]") + generated_icon = new(png_filename) + icon_generated = TRUE + update_icon() -/obj/item/canvas/proc/get_most_common_colors(count) - var/list/tally = list() - for(var/x in 1 to width) - for(var/y in 1 to height) - tally[grid[x][y]] += 1 - sortTim(tally,/proc/cmp_numeric_dsc,associative=TRUE) - . = list() - for(var/result in tally) - . += result - if(length(.) >= count) - break +/obj/item/canvas/proc/get_data_string() + var/list/data = list() + for(var/y in 1 to height) + for(var/x in 1 to width) + data += grid[x][y] + return data.Join("") //Todo make this element ? /obj/item/canvas/proc/get_paint_tool_color(obj/item/I) @@ -153,27 +178,44 @@ else if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag)) return canvas_color +/obj/item/canvas/proc/try_rename(mob/user) + var/new_name = stripped_input(user,"What do you want to name the painting?") + if(!painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) + painting_name = new_name + SStgui.update_uis(src) + /obj/item/canvas/nineteenXnineteen - icon_state = "square" + icon_state = "19x19" width = 19 height = 19 ui_x = 600 ui_y = 600 + pixel_x = 6 + pixel_y = 9 + framed_offset_x = 8 + framed_offset_y = 9 /obj/item/canvas/twentythreeXnineteen - icon_state = "wide" + icon_state = "23x19" width = 23 height = 19 ui_x = 800 ui_y = 600 + pixel_x = 4 + pixel_y = 10 + framed_offset_x = 6 + framed_offset_y = 8 /obj/item/canvas/twentythreeXtwentythree - icon_state = "square" + icon_state = "23x23" width = 23 height = 23 ui_x = 800 ui_y = 800 - + pixel_x = 5 + pixel_y = 9 + framed_offset_x = 5 + framed_offset_y = 6 /obj/item/wallframe/painting name = "painting frame" @@ -191,6 +233,7 @@ icon_state = "frame-empty" buildable_sign = FALSE var/obj/item/canvas/C + var/persistence_id /obj/structure/sign/painting/Initialize(mapload, dir, building) . = ..() @@ -217,7 +260,6 @@ /obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I) . = ..() if(C) - C.framed = FALSE C.forceMove(drop_location()) C = null to_chat(user, "You remove the painting from the frame.") @@ -227,20 +269,98 @@ /obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas) if(user.transferItemToLoc(new_canvas,src)) C = new_canvas - C.framed = TRUE + if(!C.finalized) + C.finalize(user) to_chat(user,"You frame [C].") update_icon() /obj/structure/sign/painting/proc/try_rename(mob/user) - var/new_name = stripped_input(user,"What do you want to name the painting?") - if(C && !C.painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) - C.painting_name = new_name - SStgui.update_uis(C) + if(!C.painting_name) + C.try_rename(user) + +/obj/structure/sign/painting/update_icon_state() + . = ..() + if(C && C.generated_icon) + icon_state = null + else + icon_state = "frame-empty" + /obj/structure/sign/painting/update_overlays() . = ..() - if(C && C.top_colors.len) - var/mutable_appearance/MA = mutable_appearance(icon, "frame-content-overlay") - MA.appearance_flags |= RESET_COLOR - MA.color = C.top_colors[1] + if(C && C.generated_icon) + var/mutable_appearance/MA = mutable_appearance(C.generated_icon) + MA.pixel_x = C.framed_offset_x + MA.pixel_y = C.framed_offset_y . += MA + var/mutable_appearance/frame = mutable_appearance(C.icon,"[C.icon_state]frame") + frame.pixel_x = C.framed_offset_x - 1 + frame.pixel_y = C.framed_offset_y - 1 + . += frame + +/obj/structure/sign/painting/proc/load_persistent() + if(!persistence_id) + return + if(!SSpersistence.paintings || !SSpersistence.paintings[persistence_id] || !length(SSpersistence.paintings[persistence_id])) + return + var/list/chosen = pick(SSpersistence.paintings[persistence_id]) + var/title = chosen["title"] + var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png" + if(!fexists(png)) + stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.") + return + var/icon/I = new(png) + var/obj/item/canvas/new_canvas + var/w = I.Width() + var/h = I.Height() + for(var/T in typesof(/obj/item/canvas)) + new_canvas = T + if(initial(new_canvas.width) == w && initial(new_canvas.height) == h) + new_canvas = new T(src) + break + new_canvas.fill_grid_from_icon(I) + new_canvas.generated_icon = I + new_canvas.icon_generated = TRUE + new_canvas.finalized = TRUE + new_canvas.painting_name = title + C = new_canvas + update_icon() + +/obj/structure/sign/painting/proc/save_persistent() + if(!persistence_id || !C) + return + if(sanitize_filename(persistence_id) != persistence_id) + stack_trace("Invalid persistence_id - [persistence_id]") + return + var/data = C.get_data_string() + var/md5 = md5(data) + var/list/current = SSpersistence.paintings[persistence_id] + if(!current) + current = list() + for(var/list/entry in current) + if(entry["md5"] == md5) + return + var/png_directory = "data/paintings/[persistence_id]/" + var/png_path = png_directory + "[md5].png" + var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data) + if(result) + CRASH("Error saving persistent painting: [result]") + current += list(list("title" = C.painting_name , "md5" = md5)) + SSpersistence.paintings[persistence_id] = current + +/obj/item/canvas/proc/fill_grid_from_icon(icon/I) + var/w = I.Width() + 1 + var/h = I.Height() + 1 + for(var/x in 1 to width) + for(var/y in 1 to height) + grid[x][y] = I.GetPixel(w-x,h-y) + +//Presets for art gallery mapping, for paintings to be shared across stations +/obj/structure/sign/painting/library + persistence_id = "library" + +/obj/structure/sign/painting/library_secure + persistence_id = "library_secure" + +/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least + persistence_id = "library_private" diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 7d07df3703f..366d5489ec8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -218,7 +218,7 @@ LINEN BINS dream_messages = list("a book", "an explosion", "lightning", "a staff", "a skeleton", "a robe", "magic") /obj/item/bedsheet/nanotrasen - name = "nanotrasen bedsheet" + name = "\improper Nanotrasen bedsheet" desc = "It has the Nanotrasen logo on it and has an aura of duty." icon_state = "sheetNT" item_state = "sheetNT" 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/fireplace.dm b/code/game/objects/structures/fireplace.dm index 2803df4c786..e761ae2dbc4 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -129,7 +129,7 @@ if(burn_time_remaining() < MAXIMUM_BURN_TIMER) flame_expiry_timer = world.time + MAXIMUM_BURN_TIMER else - fuel_added = CLAMP(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) + fuel_added = clamp(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) /obj/structure/fireplace/proc/burn_time_remaining() if(lit) 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..60d98cbff6d 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) @@ -261,7 +261,7 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES | ZAP_IS_TESLA) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. + tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() 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 83e368b13a2..aa2bb8b6148 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -125,7 +125,7 @@ else cur_oct[cur_note] = text2num(ni) if(user.dizziness > 0 && prob(user.dizziness / 2)) - cur_note = CLAMP(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7) + cur_note = clamp(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7) if(user.dizziness > 0 && prob(user.dizziness / 5)) if(prob(30)) cur_acc[cur_note] = "#" 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/showcase.dm b/code/game/objects/structures/showcase.dm index 38758b381c3..b36fe764cde 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -69,13 +69,13 @@ icon_state = "firefighter" /obj/structure/showcase/machinery/implanter - name = "Nanotrasen automated mindshield implanter exhibit" + name = "\improper Nanotrasen automated mindshield implanter exhibit" desc = "A flimsy model of a standard Nanotrasen automated mindshield implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!" icon = 'icons/obj/machines/implantchair.dmi' icon_state = "implantchair" /obj/structure/showcase/machinery/microwave - name = "Nanotrasen-brand microwave" + name = "\improper Nanotrasen-brand microwave" desc = "The famous Nanotrasen-brand microwave, the multi-purpose cooking appliance every station needs! This one appears to be drawn onto a cardboard box." icon = 'icons/obj/kitchen.dmi' icon_state = "mw" @@ -91,7 +91,7 @@ desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal." /obj/structure/showcase/machinery/tv - name = "Nanotrasen corporate newsfeed" + name = "\improper Nanotrasen corporate newsfeed" desc = "A slightly battered looking TV. Various Nanotrasen infomercials play on a loop, accompanied by a jaunty tune." icon = 'icons/obj/computer.dmi' icon_state = "television" diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 67298ec9b49..20e48a7efbb 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -98,102 +98,12 @@ wash_atom(AM) /obj/machinery/shower/proc/wash_atom(atom/A) - SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + A.washed(src) reagents.reaction(A, TOUCH, reaction_volume) - if(isobj(A)) - wash_obj(A) - else if(isturf(A)) - wash_turf(A) - else if(isliving(A)) - wash_mob(A) + if(isliving(A)) check_heat(A) - contamination_cleanse(A) - -/obj/machinery/shower/proc/wash_obj(obj/O) - . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) - O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - - -/obj/machinery/shower/proc/wash_turf(turf/tile) - SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) - tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - for(var/obj/effect/E in tile) - if(is_cleanable(E)) - qdel(E) - - -/obj/machinery/shower/proc/wash_mob(mob/living/L) - SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) - L.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) - if(iscarbon(L)) - var/mob/living/carbon/M = L - . = TRUE - - for(var/obj/item/I in M.held_items) - wash_obj(I) - - if(M.back && wash_obj(M.back)) - M.update_inv_back(0) - - var/list/obscured = M.check_obscured_slots() - - if(M.head && wash_obj(M.head)) - M.update_inv_head() - - if(M.glasses && !(ITEM_SLOT_EYES in obscured) && wash_obj(M.glasses)) - M.update_inv_glasses() - - if(M.wear_mask && !(ITEM_SLOT_MASK in obscured) && wash_obj(M.wear_mask)) - M.update_inv_wear_mask() - - if(M.ears && !(HIDEEARS in obscured) && wash_obj(M.ears)) - M.update_inv_ears() - - if(M.wear_neck && !(ITEM_SLOT_NECK in obscured) && wash_obj(M.wear_neck)) - M.update_inv_neck() - - if(M.shoes && !(HIDESHOES in obscured) && wash_obj(M.shoes)) - M.update_inv_shoes() - - var/washgloves = FALSE - if(M.gloves && !(HIDEGLOVES in obscured)) - washgloves = TRUE - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(H.wear_suit && wash_obj(H.wear_suit)) - H.update_inv_wear_suit() - else if(H.w_uniform && wash_obj(H.w_uniform)) - H.update_inv_w_uniform() - - if(washgloves) - SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - - if(!H.is_mouth_covered()) - H.lip_style = null - H.update_body() - - if(H.belt && wash_obj(H.belt)) - H.update_inv_belt() - else - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else - SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - -/obj/machinery/shower/proc/contamination_cleanse(atom/thing) - var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive) - if(!healthy_green_glow || QDELETED(healthy_green_glow)) - return - var/strength = healthy_green_glow.strength - if(strength <= RAD_BACKGROUND_RADIATION) - qdel(healthy_green_glow) - return - healthy_green_glow.strength -= max(0, (healthy_green_glow.strength - (RAD_BACKGROUND_RADIATION * 2)) * 0.2) - /obj/machinery/shower/process() if(on) wash_atom(loc) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 1b14a66b9b3..ed3a506d5fb 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -144,11 +144,11 @@ setDir(turn(dir, 90)) /obj/structure/sign/nanotrasen - name = "\improper Nanotrasen Logo" - desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" + name = "\improper Nanotrasen logo" + desc = "A sign with the Nanotrasen logo on it. Glory to Nanotrasen!" icon_state = "nanotrasen" /obj/structure/sign/logo - name = "nanotrasen logo" + name = "\improper Nanotrasen logo" desc = "The Nanotrasen corporate logo." icon_state = "nanotrasen_sign1" 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 971909151c4..4207dfc413f 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) @@ -182,8 +182,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //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) + 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) AfterPutItemOnTable(I, user) return TRUE else @@ -552,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/change_turf.dm b/code/game/turfs/change_turf.dm index 7561b06746f..0de4b556219 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -257,9 +257,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(depth) var/list/target_baseturfs if(length(copytarget.baseturfs)) - // with default inputs this would be Copy(CLAMP(2, -INFINITY, baseturfs.len)) + // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] - target_baseturfs = copytarget.baseturfs.Copy(CLAMP(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) + target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) else if(!ignore_bottom) target_baseturfs = list(copytarget.baseturfs) if(target_baseturfs) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 49ef6d4e652..01e1403521e 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -158,7 +158,7 @@ . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) - if(isturf(path)) + if(ispath(path, /turf)) var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) T.baseturfs = src.baseturfs diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index abded37b539..af11bc1329e 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -12,7 +12,8 @@ baseturfs = /turf/open/floor/plating - var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through. + ///lower numbers are harder. Used to determine the probability of a hulk smashing through. Also, (hardness - 40) is used as a modifier for objects trying to embed in this (hardness of 30 results in a -10% chance) + var/hardness = 40 var/slicing_duration = 100 //default time taken to slice the wall var/sheet_type = /obj/item/stack/sheet/metal var/sheet_amount = 2 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..2ef3282b99c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -104,8 +104,6 @@ var/turf/B = new world.turf(src) for(var/A in B.contents) qdel(A) - for(var/I in B.vars) - B.vars[I] = null return SSair.remove_from_active(src) visibilityChanged() @@ -424,7 +422,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..a1af55a4fd3 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 @@ -138,6 +138,7 @@ GLOBAL_VAR(restart_counter) GLOB.world_paper_log = "[GLOB.log_directory]/paper.log" GLOB.tgui_log = "[GLOB.log_directory]/tgui.log" GLOB.world_shuttle_log = "[GLOB.log_directory]/shuttle.log" + GLOB.discord_api_log = "[GLOB.log_directory]/discord_api_log.log" #ifdef UNIT_TESTS GLOB.test_log = file("[GLOB.log_directory]/tests.log") @@ -154,6 +155,7 @@ GLOBAL_VAR(restart_counter) start_log(GLOB.world_job_debug_log) start_log(GLOB.tgui_log) start_log(GLOB.world_shuttle_log) + start_log(GLOB.discord_api_log) GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index a13c0d09737..cc293829f1d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -679,7 +679,7 @@ var/path = preparsed[1] var/amount = 1 if(preparsed.len > 1) - amount = CLAMP(text2num(preparsed[2]),1,ADMIN_SPAWN_CAP) + amount = clamp(text2num(preparsed[2]),1,ADMIN_SPAWN_CAP) var/chosen = pick_closest_path(path) if(!chosen) diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 2142a5e57c7..5bd556ed453 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -86,6 +86,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) GLOBAL_PROTECT(AdminProcCallSpamPrevention) +/// Wrapper for proccalls where the datum is flagged as vareditted /proc/WrapAdminProcCall(datum/target, procname, list/arguments) if(target && procname == "Del") to_chat(usr, "Calling Del() is not allowed") diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index 64ce709dfab..b5fb625cbd4 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -93,7 +93,7 @@ var/new_volume = input(user, "Choose a volume.", "Sound Emitter", sound_volume) as null|num if(isnull(new_volume)) return - new_volume = CLAMP(new_volume, 0, 100) + new_volume = clamp(new_volume, 0, 100) sound_volume = new_volume to_chat(user, "Volume set to [sound_volume]%.") if(href_list["edit_mode"]) @@ -116,7 +116,7 @@ var/new_radius = input(user, "Choose a radius.", "Sound Emitter", sound_volume) as null|num if(isnull(new_radius)) return - new_radius = CLAMP(new_radius, 0, 127) + new_radius = clamp(new_radius, 0, 127) play_radius = new_radius to_chat(user, "Audible radius set to [play_radius].") if(href_list["play"]) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index c47328807db..2b8d021ed86 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -393,7 +393,7 @@ var/nsd = CONFIG_GET(number/note_stale_days) var/nfd = CONFIG_GET(number/note_fresh_days) if (agegate && type == "note" && isnum(nsd) && isnum(nfd) && nsd > nfd) - var/alpha = CLAMP(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) + var/alpha = clamp(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) if (alpha < 100) if (alpha <= 15) if (skipped) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 704f720ad9b..c39f568809d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1619,7 +1619,7 @@ return var/list/offset = splittext(href_list["offset"],",") - var/number = CLAMP(text2num(href_list["object_count"]), 1, ADMIN_SPAWN_CAP) + var/number = clamp(text2num(href_list["object_count"]), 1, ADMIN_SPAWN_CAP) var/X = offset.len > 0 ? text2num(offset[1]) : 0 var/Y = offset.len > 1 ? text2num(offset[2]) : 0 var/Z = offset.len > 2 ? text2num(offset[3]) : 0 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/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 520ce8ede8c..47767560936 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -85,7 +85,7 @@ if ("set_charge") var/newcharge = input("New charge (0-[borg.cell.maxcharge]):", borg.name, borg.cell.charge) as num|null if (newcharge) - borg.cell.charge = CLAMP(newcharge, 0, borg.cell.maxcharge) + borg.cell.charge = clamp(newcharge, 0, borg.cell.maxcharge) message_admins("[key_name_admin(user)] set the charge of [ADMIN_LOOKUPFLW(borg)] to [borg.cell.charge].") log_admin("[key_name(user)] set the charge of [key_name(borg)] to [borg.cell.charge].") if ("remove_cell") diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 1fa7be8e9ee..1df7fc62fde 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -8,7 +8,7 @@ var/vol = input(usr, "What volume would you like the sound to play at?",, 100) as null|num if(!vol) return - vol = CLAMP(vol, 1, 100) + vol = clamp(vol, 1, 100) var/sound/admin_sound = new() admin_sound.file = S 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/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 6018b497931..7a0d5de0972 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -373,10 +373,8 @@ /obj/item/firing_pin/abductor name = "alien firing pin" icon_state = "firing_pin_ayy" - desc = "This firing pin is slimy and warm; you can swear you feel it \ - constantly trying to mentally probe you." - fail_message = "\ - Firing error, please contact Command." + desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you." + fail_message = "Firing error, please contact Command." /obj/item/firing_pin/abductor/pin_auth(mob/living/user) . = isabductor(user) @@ -510,7 +508,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 +520,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/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index a52b63ea42b..015b87f47e8 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -22,5 +22,5 @@ addtimer(CALLBACK(src, .proc/zap), rand(30, 100)) /obj/item/organ/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA) + tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 462a73f07ea..93c18c56313 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -42,7 +42,7 @@ /mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) ..() if(exposed_temperature) - adjustFireLoss(CLAMP(0.01 * exposed_temperature, 1, 5)) + adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) else adjustFireLoss(5) 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/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 2e8bd26ad2b..e2567e091cc 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) B.hud_used.blobpwrdisplay.maptext = "
[round(blob_core.obj_integrity)]
" /mob/camera/blob/proc/add_points(points) - blob_points = CLAMP(blob_points + points, 0, max_blob_points) + blob_points = clamp(blob_points + points, 0, max_blob_points) hud_used.blobpwrdisplay.maptext = "
[round(blob_points)]
" /mob/camera/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index da9e2e5b636..794819db9b8 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -326,7 +326,7 @@ set category = "Blob" set name = "Blob Broadcast" set desc = "Speak with your blob spores and blobbernauts as your mouthpieces." - var/speak_text = input(src, "What would you like to say with your minions?", "Blob Broadcast", null) as text|null + var/speak_text = stripped_input(src, "What would you like to say with your minions?", "Blob Broadcast", null) if(!speak_text) return else diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index cc238587560..74c0663aede 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) @@ -208,7 +208,7 @@ new /obj/effect/temp_visual/emp(get_turf(src)) /obj/structure/blob/zap_act(power) - ..() + . = ..() if(overmind) if(overmind.blobstrain.tesla_reaction(src, power)) take_damage(power/400, BURN, "energy") diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 9b358956594..c81ba816ec5 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -21,7 +21,9 @@ var/obj_message = english_list(directives) 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) + deadchat_broadcast(rendered, "[L]", follow_target = L, turf_target = get_turf(L), message_type=DEADCHAT_ANNOUNCEMENT) + 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/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/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm index 3111ae1e87d..d43b11a9665 100644 --- a/code/modules/antagonists/fugitive/fugitive.dm +++ b/code/modules/antagonists/fugitive/fugitive.dm @@ -35,7 +35,7 @@ switch(backstory) if("prisoner") to_chat(owner, "I can't believe we managed to break out of a Nanotrasen superjail! Sadly though, our work is not done. The emergency teleport at the station logs everyone who uses it, and where they went.") - to_chat(owner, "It won't be long until Centcom tracks where we've gone off to. I need to work with my fellow escapees to prepare for the troops Nanotrasen is sending, I'm not going back.") + to_chat(owner, "It won't be long until CentCom tracks where we've gone off to. I need to work with my fellow escapees to prepare for the troops Nanotrasen is sending, I'm not going back.") if("cultist") to_chat(owner, "Blessed be our journey so far, but I fear the worst has come to our doorstep, and only those with the strongest faith will survive.") to_chat(owner, "Our religion has been repeatedly culled by Nanotrasen because it is categorized as an \"Enemy of the Corporation\", whatever that means.") diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 7911ec7ef0d..2b26f7ba0c1 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -362,7 +362,7 @@ if(NUKEUI_AWAIT_TIMER) var/number_value = text2num(numeric_input) if(number_value) - timer_set = CLAMP(number_value, minimum_timer_set, maximum_timer_set) + timer_set = clamp(number_value, minimum_timer_set, maximum_timer_set) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) set_safety() . = TRUE @@ -507,7 +507,7 @@ return CINEMATIC_SELFDESTRUCT_MISS /obj/machinery/nuclearbomb/beer - name = "Nanotrasen-brand nuclear fission explosive" + name = "\improper Nanotrasen-brand nuclear fission explosive" desc = "One of the more successful achievements of the Nanotrasen Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap to produce and devastatingly effective. Signs explain that though this particular device has been decommissioned, every Nanotrasen station is equipped with an equivalent one, just in case. All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back." proper_bomb = FALSE var/obj/structure/reagent_dispensers/beerkeg/keg diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 41a10364898..79da171b3c3 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -16,16 +16,22 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/syndicatebomb/training ))) -//The malf AI action subtype. All malf actions are subtypes of this. +GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module)) + +/// The malf AI action subtype. All malf actions are subtypes of this. /datum/action/innate/ai name = "AI Action" desc = "You aren't entirely sure what this does, but it's very beepy and boopy." background_icon_state = "bg_tech_blue" icon_icon = 'icons/mob/actions/actions_AI.dmi' - var/mob/living/silicon/ai/owner_AI //The owner AI, so we don't have to typecast every time - var/uses //If we have multiple uses of the same power - var/auto_use_uses = TRUE //If we automatically use up uses on each activation - var/cooldown_period //If applicable, the time in deciseconds we have to wait before using any more modules + /// The owner AI, so we don't have to typecast every time + var/mob/living/silicon/ai/owner_AI + /// If we have multiple uses of the same power + var/uses + /// If we automatically use up uses on each activation + var/auto_use_uses = TRUE + /// If applicable, the time in deciseconds we have to wait before using any more modules + var/cooldown_period /datum/action/innate/ai/Grant(mob/living/L) . = ..() @@ -56,12 +62,14 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "[name] has run out of uses!") qdel(src) -//Framework for ranged abilities that can have different effects by left-clicking stuff. +/// Framework for ranged abilities that can have different effects by left-clicking stuff. /datum/action/innate/ai/ranged name = "Ranged AI Action" auto_use_uses = FALSE //This is so we can do the thing and disable/enable freely without having to constantly add uses - var/obj/effect/proc_holder/ranged_ai/linked_ability //The linked proc holder that contains the actual ability code - var/linked_ability_type //The path of our linked ability + /// The linked proc holder that contains the actual ability code + var/obj/effect/proc_holder/ranged_ai/linked_ability + /// The path of our linked ability + var/linked_ability_type /datum/action/innate/ai/ranged/New() if(!linked_ability_type) @@ -90,10 +98,12 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( linked_ability.toggle(owner) return TRUE -//The actual ranged proc holder. +/// The actual ranged proc holder. /obj/effect/proc_holder/ranged_ai - var/enable_text = "Hello World!" //Appears when the user activates the ability - var/disable_text = "Goodbye Cruel World!" //Context clues! + /// Appears when the user activates the ability + var/enable_text = "Hello World!" + /// Appears when the user deactivates the ability + var/disable_text = "Goodbye Cruel World!" var/datum/action/innate/ai/ranged/attached_action /obj/effect/proc_holder/ranged_ai/Destroy() @@ -106,121 +116,42 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( else add_ranged_ability(user, enable_text) - -//The datum and interface for the malf unlock menu, which lets them choose actions to unlock. -/datum/module_picker - var/temp - var/processing_time = 50 - var/list/possible_modules - -/datum/module_picker/New() - possible_modules = list() - for(var/type in typesof(/datum/AI_Module)) - var/datum/AI_Module/AM = new type - if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade) - possible_modules += AM - -/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) //Removes all malfunction-related abilities from the target AI. - for(var/datum/AI_Module/AM in possible_modules) - for(var/datum/action/A in AI.actions) - if(istype(A, initial(AM.power_type))) - qdel(A) - -/datum/module_picker/proc/use(mob/user) - var/list/dat = list() - dat += "Select use of processing time: (currently #[processing_time] left.)
" - dat += "
" - dat += "Install Module:
" - dat += "The number afterwards is the amount of processing time it consumes.
" - for(var/datum/AI_Module/large/module in possible_modules) - dat += "[module.module_name]\[?\] ([module.cost])
" - for(var/datum/AI_Module/small/module in possible_modules) - dat += "[module.module_name]\[?\] ([module.cost])
" - dat += "
" - if(temp) - dat += "[temp]" - var/datum/browser/popup = new(user, "modpicker", "Malf Module Menu") - popup.set_content(dat.Join()) - popup.open() - -/datum/module_picker/Topic(href, href_list) - ..() - - if(!isAI(usr)) - return - var/mob/living/silicon/ai/A = usr - - if(A.stat == DEAD) - to_chat(A, "You are already dead!") - return - - for(var/datum/AI_Module/AM in possible_modules) - if (href_list[AM.mod_pick_name]) - - // Cost check - if(AM.cost > processing_time) - temp = "You cannot afford this module." - break - - var/datum/action/innate/ai/action = locate(AM.power_type) in A.actions - - // Give the power and take away the money. - if(AM.upgrade) //upgrade and upgrade() are separate, be careful! - AM.upgrade(A) - possible_modules -= AM - to_chat(A, AM.unlock_text) - A.playsound_local(A, AM.unlock_sound, 50, 0) - else - if(AM.power_type) - if(!action) //Unlocking for the first time - var/datum/action/AC = new AM.power_type - AC.Grant(A) - A.current_modules += new AM.type - temp = AM.description - if(AM.one_purchase) - possible_modules -= AM - if(AM.unlock_text) - to_chat(A, AM.unlock_text) - if(AM.unlock_sound) - A.playsound_local(A, AM.unlock_sound, 50, 0) - else //Adding uses to an existing module - action.uses += initial(action.uses) - action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." - action.UpdateButtonIcon() - temp = "Additional use[action.uses > 1 ? "s" : ""] added to [action.name]!" - processing_time -= AM.cost - - if(href_list["showdesc"]) - if(AM.mod_pick_name == href_list["showdesc"]) - temp = AM.description - use(usr) - - -//The base module type, which holds info about each ability. +/// The base module type, which holds info about each ability. /datum/AI_Module - var/module_name - var/mod_pick_name - var/description = "" - var/engaged = 0 + var/name = "generic module" + var/category = "generic category" + var/description = "generic description" var/cost = 5 - var/one_purchase = FALSE //If this module can only be purchased once. This always applies to upgrades, even if the variable is set to false. + /// If this module can only be purchased once. This always applies to upgrades, even if the variable is set to false. + var/one_purchase = FALSE + /// If the module gives an active ability, use this. Mutually exclusive with upgrade. + var/power_type = /datum/action/innate/ai + /// If the module gives a passive upgrade, use this. Mutually exclusive with power_type. + var/upgrade = FALSE + /// Text shown when an ability is unlocked + var/unlock_text = "Hello World!" + /// Sound played when an ability is unlocked + var/unlock_sound - var/power_type = /datum/action/innate/ai //If the module gives an active ability, use this. Mutually exclusive with upgrade. - var/upgrade //If the module gives a passive upgrade, use this. Mutually exclusive with power_type. - var/unlock_text = "Hello World!" //Text shown when an ability is unlocked - var/unlock_sound //Sound played when an ability is unlocked - -/datum/AI_Module/proc/upgrade(mob/living/silicon/ai/AI) //Apply upgrades! + /// Applies upgrades +/datum/AI_Module/proc/upgrade(mob/living/silicon/ai/AI) return -/datum/AI_Module/large //Big, powerful stuff that can only be used once. -/datum/AI_Module/small //Weak, usually localized stuff with multiple uses. +/// Modules causing destruction +/datum/AI_Module/destructive + category = "Destructive Modules" +/// Modules with stealthy and utility uses +/datum/AI_Module/utility + category = "Utility Modules" -//Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely. -/datum/AI_Module/large/nuke_station - module_name = "Doomsday Device" - mod_pick_name = "nukestation" +/// Modules that are improving AI abilities and assets +/datum/AI_Module/upgrade + category = "Upgrade Modules" + +/// Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely. +/datum/AI_Module/destructive/nuke_station + name = "Doomsday Device" description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. Can only be used while on the station, will fail if your core is moved off station or destroyed." cost = 130 one_purchase = TRUE @@ -391,28 +322,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(world, "The AI cleansed the station of life with the doomsday device!") SSticker.force_ending = 1 - -//AI Turret Upgrade: Increases the health and damage of all turrets. -/datum/AI_Module/large/upgrade_turrets - module_name = "AI Turret Upgrade" - mod_pick_name = "turret" - description = "Improves the power and health of all AI turrets. This effect is permanent." - cost = 30 - upgrade = TRUE - unlock_text = "You establish a power diversion to your turrets, upgrading their health and damage." - unlock_sound = 'sound/items/rped.ogg' - -/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) - for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) - turret.obj_integrity += 30 - turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. - turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' - - -//Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. -/datum/AI_Module/large/lockdown - module_name = "Hostile Station Lockdown" - mod_pick_name = "lockdown" +/// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. +/datum/AI_Module/destructive/lockdown + name = "Hostile Station Lockdown" description = "Overload the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds, briefly \ opening all doors on the station." cost = 30 @@ -444,11 +356,62 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( "Automatic system reboot complete. Have a secure day.", "Network reset:"), 900) +/// Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. +/datum/AI_Module/destructive/override_machine + name = "Machine Override" + description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses per purchase." + cost = 30 + power_type = /datum/action/innate/ai/ranged/override_machine + unlock_text = "You procure a virus from the Space Dark Web and distribute it to the station's machines." + unlock_sound = 'sound/machines/airlock_alien_prying.ogg' -//Destroy RCDs: Detonates all non-cyborg RCDs on the station. -/datum/AI_Module/large/destroy_rcd - module_name = "Destroy RCDs" - mod_pick_name = "rcd" +/datum/action/innate/ai/ranged/override_machine + name = "Override Machine" + desc = "Animates a targeted machine, causing it to attack anyone nearby." + button_icon_state = "override_machine" + uses = 4 + linked_ability_type = /obj/effect/proc_holder/ranged_ai/override_machine + +/datum/action/innate/ai/ranged/override_machine/New() + ..() + desc = "[desc] It has [uses] use\s remaining." + button.desc = desc + +/datum/action/innate/ai/ranged/override_machine/proc/animate_machine(obj/machinery/M) + if(M && !QDELETED(M)) + new/mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, owner, 1) + +/obj/effect/proc_holder/ranged_ai/override_machine + active = FALSE + ranged_mousepointer = 'icons/effects/override_machine_target.dmi' + enable_text = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." + disable_text = "You release your hold on the powernet." + +/obj/effect/proc_holder/ranged_ai/override_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) + if(..()) + return + if(ranged_ability_user.incapacitated()) + remove_ranged_ability() + return + if(!istype(target)) + to_chat(ranged_ability_user, "You can only animate machines!") + return + if(!target.can_be_overridden() || is_type_in_typecache(target, GLOB.blacklisted_malf_machines)) + to_chat(ranged_ability_user, "That machine can't be overridden!") + return + ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, 0) + attached_action.adjust_uses(-1) + if(attached_action && attached_action.uses) + attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining." + attached_action.UpdateButtonIcon() + target.audible_message("You hear a loud electrical buzzing sound coming from [target]!") + addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/override_machine.proc/animate_machine, target), 50) //kabeep! + remove_ranged_ability("Sending override signal...") + return TRUE + +/// Destroy RCDs: Detonates all non-cyborg RCDs on the station. +/datum/AI_Module/destructive/destroy_rcd + name = "Destroy RCDs" description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station." cost = 25 one_purchase = TRUE @@ -471,80 +434,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "RCD detonation pulse emitted.") owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0) - -//Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right? -/datum/AI_Module/large/mecha_domination - module_name = "Unlock Mech Domination" - mod_pick_name = "mechjack" - description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. Once uploaded to the mech, it is impossible to leave.\ - Do not allow the mech to leave the station's vicinity or allow it to be destroyed." - cost = 30 - upgrade = TRUE - unlock_text = "Virus package compiled. Select a target mech at any time. You must remain on the station at all times. Loss of signal will result in total system lockout." - unlock_sound = 'sound/mecha/nominal.ogg' - -/datum/AI_Module/large/mecha_domination/upgrade(mob/living/silicon/ai/AI) - AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk! - - -//Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. -/datum/AI_Module/large/break_fire_alarms - module_name = "Thermal Sensor Override" - mod_pick_name = "burnpigs" - description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert." - one_purchase = TRUE - cost = 25 - power_type = /datum/action/innate/ai/break_fire_alarms - unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will." - unlock_sound = 'goon/sound/machinery/firealarm.ogg' - -/datum/action/innate/ai/break_fire_alarms - name = "Override Thermal Sensors" - desc = "Disables the automatic temperature sensing on all fire alarms, making them effectively useless." - button_icon_state = "break_fire_alarms" - uses = 1 - -/datum/action/innate/ai/break_fire_alarms/Activate() - for(var/obj/machinery/firealarm/F in GLOB.machines) - if(!is_station_level(F.z)) - continue - F.obj_flags |= EMAGGED - F.update_icon() - to_chat(owner, "All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.") - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) - - -//Air Alarm Safety Override: Unlocks the ability to enable flooding on all air alarms. -/datum/AI_Module/large/break_air_alarms - module_name = "Air Alarm Safety Override" - mod_pick_name = "allow_flooding" - description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, which disables scrubbers as well as pressure checks on vents. \ - Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." - one_purchase = TRUE - cost = 50 - power_type = /datum/action/innate/ai/break_air_alarms - unlock_text = "You remove the safety overrides on all air alarms, but you leave the confirm prompts open. You can hit 'Yes' at any time... you bastard." - unlock_sound = 'sound/effects/space_wind.ogg' - -/datum/action/innate/ai/break_air_alarms - name = "Override Air Alarm Safeties" - desc = "Enables the Flood setting on all air alarms." - button_icon_state = "break_air_alarms" - uses = 1 - -/datum/action/innate/ai/break_air_alarms/Activate() - for(var/obj/machinery/airalarm/AA in GLOB.machines) - if(!is_station_level(AA.z)) - continue - AA.obj_flags |= EMAGGED - to_chat(owner, "All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.") - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) - - -//Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. -/datum/AI_Module/small/overload_machine - module_name = "Machine Overload" - mod_pick_name = "overload" +/// Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. +/datum/AI_Module/destructive/overload_machine + name = "Machine Overload" description = "Overheats an electrical machine, causing a small explosion and destroying it. Two uses per purchase." cost = 20 power_type = /datum/action/innate/ai/ranged/overload_machine @@ -600,66 +492,43 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( remove_ranged_ability("Overcharging machine...") return TRUE +/// Blackout: Overloads a random number of lights across the station. Three uses. +/datum/AI_Module/destructive/blackout + name = "Blackout" + description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses per purchase." + cost = 15 + power_type = /datum/action/innate/ai/blackout + unlock_text = "You hook into the powernet and route bonus power towards the station's lighting." + unlock_sound = "sparks" -//Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. -/datum/AI_Module/small/override_machine - module_name = "Machine Override" - mod_pick_name = "override" - description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses." - cost = 30 - power_type = /datum/action/innate/ai/ranged/override_machine - unlock_text = "You procure a virus from the Space Dark Web and distribute it to the station's machines." - unlock_sound = 'sound/machines/airlock_alien_prying.ogg' +/datum/action/innate/ai/blackout + name = "Blackout" + desc = "Overloads random lights across the station." + button_icon_state = "blackout" + uses = 3 + auto_use_uses = FALSE -/datum/action/innate/ai/ranged/override_machine - name = "Override Machine" - desc = "Animates a targeted machine, causing it to attack anyone nearby." - button_icon_state = "override_machine" - uses = 4 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/override_machine - -/datum/action/innate/ai/ranged/override_machine/New() +/datum/action/innate/ai/blackout/New() ..() desc = "[desc] It has [uses] use\s remaining." button.desc = desc -/datum/action/innate/ai/ranged/override_machine/proc/animate_machine(obj/machinery/M) - if(M && !QDELETED(M)) - new/mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, owner, 1) +/datum/action/innate/ai/blackout/Activate() + for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) + if(prob(30 * apc.overload)) + apc.overload_lighting() + else + apc.overload++ + to_chat(owner, "Overcurrent applied to the powernet.") + owner.playsound_local(owner, "sparks", 50, 0) + adjust_uses(-1) + if(src && uses) //Not sure if not having src here would cause a runtime, so it's here to be safe + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtonIcon() -/obj/effect/proc_holder/ranged_ai/override_machine - active = FALSE - ranged_mousepointer = 'icons/effects/override_machine_target.dmi' - enable_text = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." - disable_text = "You release your hold on the powernet." - -/obj/effect/proc_holder/ranged_ai/override_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return - if(!istype(target)) - to_chat(ranged_ability_user, "You can only animate machines!") - return - if(!target.can_be_overridden() || is_type_in_typecache(target, GLOB.blacklisted_malf_machines)) - to_chat(ranged_ability_user, "That machine can't be overridden!") - return - ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, 0) - attached_action.adjust_uses(-1) - if(attached_action && attached_action.uses) - attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining." - attached_action.UpdateButtonIcon() - target.audible_message("You hear a loud electrical buzzing sound coming from [target]!") - addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/override_machine.proc/animate_machine, target), 50) //kabeep! - remove_ranged_ability("Sending override signal...") - return TRUE - - -//Robotic Factory: Places a large machine that converts humans that go through it into cyborgs. Unlocking this ability removes shunting. -/datum/AI_Module/large/place_cyborg_transformer - module_name = "Robotic Factory (Removes Shunting)" - mod_pick_name = "cyborgtransformer" +/// Robotic Factory: Places a large machine that converts humans that go through it into cyborgs. Unlocking this ability removes shunting. +/datum/AI_Module/utility/place_cyborg_transformer + name = "Robotic Factory (Removes Shunting)" description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." cost = 100 one_purchase = TRUE @@ -731,47 +600,59 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(src, "[alert_msg]") return success +/// Air Alarm Safety Override: Unlocks the ability to enable flooding on all air alarms. +/datum/AI_Module/utility/break_air_alarms + name = "Air Alarm Safety Override" + description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, which disables scrubbers as well as pressure checks on vents. \ + Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." + one_purchase = TRUE + cost = 50 + power_type = /datum/action/innate/ai/break_air_alarms + unlock_text = "You remove the safety overrides on all air alarms, but you leave the confirm prompts open. You can hit 'Yes' at any time... you bastard." + unlock_sound = 'sound/effects/space_wind.ogg' -//Blackout: Overloads a random number of lights across the station. Three uses. -/datum/AI_Module/small/blackout - module_name = "Blackout" - mod_pick_name = "blackout" - description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses." - cost = 15 - power_type = /datum/action/innate/ai/blackout - unlock_text = "You hook into the powernet and route bonus power towards the station's lighting." - unlock_sound = "sparks" +/datum/action/innate/ai/break_air_alarms + name = "Override Air Alarm Safeties" + desc = "Enables the Flood setting on all air alarms." + button_icon_state = "break_air_alarms" + uses = 1 -/datum/action/innate/ai/blackout - name = "Blackout" - desc = "Overloads random lights across the station." - button_icon_state = "blackout" - uses = 3 - auto_use_uses = FALSE +/datum/action/innate/ai/break_air_alarms/Activate() + for(var/obj/machinery/airalarm/AA in GLOB.machines) + if(!is_station_level(AA.z)) + continue + AA.obj_flags |= EMAGGED + to_chat(owner, "All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.") + owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) -/datum/action/innate/ai/blackout/New() - ..() - desc = "[desc] It has [uses] use\s remaining." - button.desc = desc +/// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. +/datum/AI_Module/utility/break_fire_alarms + name = "Thermal Sensor Override" + description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert." + one_purchase = TRUE + cost = 25 + power_type = /datum/action/innate/ai/break_fire_alarms + unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will." + unlock_sound = 'goon/sound/machinery/firealarm.ogg' -/datum/action/innate/ai/blackout/Activate() - for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) - if(prob(30 * apc.overload)) - apc.overload_lighting() - else - apc.overload++ - to_chat(owner, "Overcurrent applied to the powernet.") - owner.playsound_local(owner, "sparks", 50, 0) - adjust_uses(-1) - if(src && uses) //Not sure if not having src here would cause a runtime, so it's here to be safe - desc = "[initial(desc)] It has [uses] use\s remaining." - UpdateButtonIcon() +/datum/action/innate/ai/break_fire_alarms + name = "Override Thermal Sensors" + desc = "Disables the automatic temperature sensing on all fire alarms, making them effectively useless." + button_icon_state = "break_fire_alarms" + uses = 1 +/datum/action/innate/ai/break_fire_alarms/Activate() + for(var/obj/machinery/firealarm/F in GLOB.machines) + if(!is_station_level(F.z)) + continue + F.obj_flags |= EMAGGED + F.update_icon() + to_chat(owner, "All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.") + owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) -//Disable Emergency Lights -/datum/AI_Module/small/emergency_lights - module_name = "Disable Emergency Lights" - mod_pick_name = "disable_emergency_lights" +/// Disable Emergency Lights +/datum/AI_Module/utility/emergency_lights + name = "Disable Emergency Lights" description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, they will not attempt to fall back on emergency power reserves." cost = 10 one_purchase = TRUE @@ -794,11 +675,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "Emergency light connections severed.") owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE) - -//Reactivate Camera Network: Reactivates up to 30 cameras across the station. -/datum/AI_Module/small/reactivate_cameras - module_name = "Reactivate Camera Network" - mod_pick_name = "recam" +/// Reactivate Camera Network: Reactivates up to 30 cameras across the station. +/datum/AI_Module/utility/reactivate_cameras + name = "Reactivate Camera Network" description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. Can be used to repair up to 30 cameras." cost = 10 one_purchase = TRUE @@ -837,19 +716,17 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( desc = "[initial(desc)] It has [uses] use\s remaining." UpdateButtonIcon() -//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. -/datum/AI_Module/large/upgrade_cameras - module_name = "Upgrade Camera Network" - mod_pick_name = "upgradecam" - description = "Install broad-spectrum scanning and electrical redundancy firmware to the camera network, enabling EMP-proofing and light-amplified X-ray vision." //I <3 pointless technobabble +/// Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. +/datum/AI_Module/upgrade/upgrade_cameras + name = "Upgrade Camera Network" + description = "Install broad-spectrum scanning and electrical redundancy firmware to the camera network, enabling EMP-proofing and light-amplified X-ray vision. Upgrade is done immediately upon purchase." //I <3 pointless technobabble //This used to have motion sensing as well, but testing quickly revealed that giving it to the whole cameranet is PURE HORROR. - one_purchase = TRUE cost = 35 //Decent price for omniscience! upgrade = TRUE unlock_text = "OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online." unlock_sound = 'sound/items/rped.ogg' -/datum/AI_Module/large/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) +/datum/AI_Module/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) AI.see_override = SEE_INVISIBLE_MINIMUM //Night-vision, without which X-ray would be very limited in power. AI.update_sight() @@ -874,19 +751,46 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "[upgraded_cameras]") //This works, since unlock text is called after upgrade() -/datum/AI_Module/large/eavesdrop - module_name = "Enhanced Surveillance" - mod_pick_name = "eavesdrop" - description = "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations." +/// AI Turret Upgrade: Increases the health and damage of all turrets. +/datum/AI_Module/upgrade/upgrade_turrets + name = "AI Turret Upgrade" + description = "Improves the power and health of all AI turrets. This effect is permanent. Upgrade is done immediately upon purchase." + cost = 30 + upgrade = TRUE + unlock_text = "You establish a power diversion to your turrets, upgrading their health and damage." + unlock_sound = 'sound/items/rped.ogg' + +/datum/AI_Module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) + for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) + turret.obj_integrity += 30 + turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. + turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' + +/// Enhanced Surveillance: Enables AI to hear conversations going on near its active vision. +/datum/AI_Module/upgrade/eavesdrop + name = "Enhanced Surveillance" + description = "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations. Upgrade is done immediately upon purchase." cost = 30 - one_purchase = TRUE upgrade = TRUE unlock_text = "OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online." unlock_sound = 'sound/items/rped.ogg' -/datum/AI_Module/large/eavesdrop/upgrade(mob/living/silicon/ai/AI) +/datum/AI_Module/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) if(AI.eyeobj) AI.eyeobj.relay_speech = TRUE +/// Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right? +/datum/AI_Module/upgrade/mecha_domination + name = "Unlock Mech Domination" + description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. Once uploaded to the mech, it is impossible to leave.\ + Do not allow the mech to leave the station's vicinity or allow it to be destroyed. Upgrade is done immediately upon purchase." + cost = 30 + upgrade = TRUE + unlock_text = "Virus package compiled. Select a target mech at any time. You must remain on the station at all times. Loss of signal will result in total system lockout." + unlock_sound = 'sound/mecha/nominal.ogg' + +/datum/AI_Module/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) + AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk! + #undef DEFAULT_DOOMSDAY_TIMER #undef DOOMSDAY_ANNOUNCE_INTERVAL diff --git a/code/modules/antagonists/traitor/equipment/module_picker.dm b/code/modules/antagonists/traitor/equipment/module_picker.dm new file mode 100644 index 00000000000..e1fb352af38 --- /dev/null +++ b/code/modules/antagonists/traitor/equipment/module_picker.dm @@ -0,0 +1,132 @@ +/// The datum and interface for the malf unlock menu, which lets them choose actions to unlock. +/datum/module_picker + var/name = "Malfunction Modules Menu" + var/ui_x = 620 + var/ui_y = 525 + var/selected_cat + var/compact_mode = FALSE + var/processing_time = 50 + var/list/possible_modules + +/datum/module_picker/New() + possible_modules = get_malf_modules() + +/// Removes all malfunction-related abilities from the target AI. +/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) + for(var/datum/AI_Module/AM in possible_modules) + for(var/datum/action/A in AI.actions) + if(istype(A, initial(AM.power_type))) + qdel(A) + +/proc/cmp_malfmodules_priority(datum/AI_Module/A, datum/AI_Module/B) + return B.cost - A.cost + +/proc/get_malf_modules() + var/list/filtered_modules = list() + + for(var/path in GLOB.malf_modules) + var/datum/AI_Module/AM = new path + if((AM.power_type == /datum/action/innate/ai) && !AM.upgrade) + continue + if(!filtered_modules[AM.category]) + filtered_modules[AM.category] = list() + filtered_modules[AM.category][AM] = AM + + for(var/category in filtered_modules) + filtered_modules[category] = sortTim(filtered_modules[category], /proc/cmp_malfmodules_priority) + + return filtered_modules + +/datum/module_picker/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "malfunction_module_picker", name, ui_x, ui_y, master_ui, state) + ui.open() + +/datum/module_picker/ui_data(mob/user) + var/list/data = list() + data["processing_time"] = processing_time + data["compact_mode"] = compact_mode + return data + +/datum/module_picker/ui_static_data(mob/user) + var/list/data = list() + + data["categories"] = list() + for(var/category in possible_modules) + var/list/cat = list( + "name" = category, + "items" = (category == selected_cat ? list() : null)) + for(var/module in possible_modules[category]) + var/datum/AI_Module/AM = possible_modules[category][module] + cat["items"] += list(list( + "name" = AM.name, + "cost" = AM.cost, + "desc" = AM.description, + "ref" = REF(AM), + )) + data["categories"] += list(cat) + + return data + +/datum/module_picker/ui_act(action, list/params) + if(..()) + return + if(!isAI(usr)) + return + + switch(action) + if("buy") + var/list/buyable_modules = list() + for(var/category in possible_modules) + buyable_modules += possible_modules[category] + var/module = locate(params["ref"]) in buyable_modules + if(!module || !(module in buyable_modules)) + return + var/datum/AI_Module/AM = module + purchase_module(usr, AM) + . = TRUE + if("select") + selected_cat = params["category"] + . = TRUE + if("compact_toggle") + compact_mode = !compact_mode + . = TRUE + +/datum/module_picker/proc/purchase_module(mob/living/silicon/ai/AI, datum/AI_Module/AM) + if(!istype(AM)) + return + if(!AI || AI.stat == DEAD) + return + if(AM.cost > processing_time) + return + + var/datum/action/innate/ai/action = locate(AM.power_type) in AI.actions + // Give the power and take away the money. + if(AM.upgrade) //upgrade and upgrade() are separate, be careful! + AM.upgrade(AI) + possible_modules[AM.category] -= AM + if(AM.unlock_text) + to_chat(AI, AM.unlock_text) + if(AM.unlock_sound) + AI.playsound_local(AI, AM.unlock_sound, 50, 0) + update_static_data(AI) + else + if(AM.power_type) + if(!action) //Unlocking for the first time + var/datum/action/AC = new AM.power_type + AC.Grant(AI) + AI.current_modules += new AM.type + if(AM.one_purchase) + possible_modules[AM.category] -= AM + update_static_data(AI) + if(AM.unlock_text) + to_chat(AI, AM.unlock_text) + if(AM.unlock_sound) + AI.playsound_local(AI, AM.unlock_sound, 50, 0) + else //Adding uses to an existing module + action.uses += initial(action.uses) + action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." + action.UpdateButtonIcon() + processing_time -= AM.cost diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 4e0c5a92eb2..7fb5a7fefe4 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -16,7 +16,8 @@ throwforce = 2 throw_speed = 3 throw_range = 7 - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' var/is_position_sensitive = FALSE //set to true if the device has different icons for each position. //This will prevent things such as visible lasers from facing the incorrect direction when transformed by assembly_holder's update_icon() var/secured = TRUE @@ -25,24 +26,23 @@ var/wire_type = WIRE_RECEIVE | WIRE_PULSE var/attachable = FALSE // can this be attached to wires var/datum/wires/connected = null - var/next_activate = 0 //When we're next allowed to activate - for spam control - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' /obj/item/assembly/get_part_rating() return 1 /obj/item/assembly/proc/on_attach() -/obj/item/assembly/proc/on_detach() //call this when detaching it from a device. handles any special functions that need to be updated ex post facto +//Call this when detaching it from a device. handles any special functions that need to be updated ex post facto +/obj/item/assembly/proc/on_detach() if(!holder) return FALSE forceMove(holder.drop_location()) holder = null return TRUE -/obj/item/assembly/proc/holder_movement() //Called when the holder is moved +//Called when the holder is moved +/obj/item/assembly/proc/holder_movement() if(!holder) return FALSE setDir(holder.dir) @@ -54,7 +54,6 @@ return FALSE return TRUE - //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs /obj/item/assembly/proc/pulsed(radio = FALSE) if(wire_type & WIRE_RECEIVE) @@ -63,7 +62,6 @@ INVOKE_ASYNC(src, .proc/activate) return TRUE - //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct /obj/item/assembly/proc/pulse(radio = FALSE) if(connected && wire_type) @@ -75,7 +73,6 @@ holder.process_activation(src, 0, 1) return TRUE - // What the device does when turned on /obj/item/assembly/proc/activate() if(QDELETED(src) || !secured || (next_activate > world.time)) @@ -83,13 +80,11 @@ next_activate = world.time + 30 return TRUE - /obj/item/assembly/proc/toggle_secure() secured = !secured update_icon() return secured - /obj/item/assembly/attackby(obj/item/W, mob/user, params) if(isassembly(W)) var/obj/item/assembly/A = W @@ -116,7 +111,6 @@ . = ..() . += "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."]" - /obj/item/assembly/attack_self(mob/user) if(!user) return FALSE @@ -126,3 +120,8 @@ /obj/item/assembly/interact(mob/user) return ui_interact(user) + +/obj/item/assembly/ui_host(mob/user) + if(holder) + return holder + return src diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 5478fb639f7..7ccd70cf18d 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -23,7 +23,7 @@ if(burnt_out) user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but it's burnt out!") return SHAME - else if(user.eye_blind) + else if(user.is_blind()) user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but [user.p_theyre()] blind!") return SHAME user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it! It looks like [user.p_theyre()] trying to commit suicide!") @@ -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!") @@ -276,7 +278,7 @@ user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!") if(!hypnosis) - to_chat(M, "The light makes you feel oddly relaxed...") + to_chat(M, "The light makes you feel oddly relaxed...") M.confused += min(M.confused + 10, 20) M.dizziness += min(M.dizziness + 10, 20) M.drowsyness += min(M.drowsyness + 10, 20) 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/igniter.dm b/code/modules/assembly/igniter.dm index e5ca43d4c46..55f5d50f2e1 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -39,7 +39,6 @@ add_fingerprint(user) /obj/item/assembly/igniter/ignition_effect(atom/A, mob/user) - . = "[user] fiddles with [src], and manages to \ - light [A]." + . = "[user] fiddles with [src], and manages to light [A]." activate() add_fingerprint(user) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 9e7fc5b556e..8099d18fb93 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -23,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() diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 648a015d168..b9684f73fd5 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -124,9 +124,8 @@ /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["seconds"] = round(time % 60) + data["minutes"] = round((time - data["seconds"]) / 60) data["timing"] = timing data["scanning"] = scanning data["sensitivity"] = sensitivity @@ -152,6 +151,6 @@ if("input") var/value = text2num(params["adjust"]) if(value) - var/newtime = round(time+value) - time = CLAMP(newtime, 0, 600) + value = round(time + value) + time = clamp(value, 0, 600) . = TRUE diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 41f229b49ec..d67c8a85bf9 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -8,7 +8,10 @@ custom_materials = list(/datum/material/iron=400, /datum/material/glass=120) wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE attachable = TRUE - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + var/ui_x = 280 + var/ui_y = 132 var/code = DEFAULT_SIGNALER_CODE var/frequency = FREQ_SIGNALER var/datum/radio_frequency/radio_connection @@ -17,8 +20,6 @@ ///Holds a reference string to the mob, decides how much of a gamer you are. var/suicide_mob var/hearing_range = 1 - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' /obj/item/assembly/signaler/suicide_act(mob/living/carbon/user) user.visible_message("[user] eats \the [src]! If it is signaled, [user.p_they()] will die!") @@ -47,7 +48,6 @@ . = ..() set_frequency(frequency) - /obj/item/assembly/signaler/Destroy() SSradio.remove_object(src,frequency) suicider = null @@ -64,14 +64,16 @@ holder.update_icon() return -/obj/item/assembly/signaler/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - if(!is_secured(user)) - return +/obj/item/assembly/signaler/ui_status(mob/user) + if(is_secured(user)) + return ..() + return UI_CLOSE + +/obj/item/assembly/signaler/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) - var/ui_width = 280 - var/ui_height = 132 - ui = new(user, src, ui_key, "signaler", name, ui_width, ui_height, master_ui, state) + ui = new(user, src, ui_key, "signaler", name, ui_x, ui_y, master_ui, state) ui.open() /obj/item/assembly/signaler/ui_data(mob/user) @@ -80,7 +82,6 @@ data["code"] = code data["minFrequency"] = MIN_FREE_FREQ data["maxFrequency"] = MAX_FREE_FREQ - return data /obj/item/assembly/signaler/ui_act(action, params) @@ -109,7 +110,6 @@ update_icon() - /obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W @@ -131,9 +131,6 @@ if(usr) GLOB.lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") - - return - /obj/item/assembly/signaler/receive_signal(datum/signal/signal) . = FALSE if(!signal) @@ -153,7 +150,6 @@ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) return TRUE - /obj/item/assembly/signaler/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency @@ -182,7 +178,6 @@ return return ..(signal) - // Embedded signaller used in anomalies. /obj/item/assembly/signaler/anomaly name = "anomaly core" @@ -216,6 +211,37 @@ to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].") ..() +//Anomaly cores +/obj/item/assembly/signaler/anomaly/pyro + name = "\improper pyroclastic anomaly core" + desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research." + icon_state = "pyro core" + anomaly_type = /obj/effect/anomaly/pyro + +/obj/item/assembly/signaler/anomaly/grav + name = "\improper gravitational anomaly core" + desc = "The neutralized core of a gravitational anomaly. It feels much heavier than it looks. It'd probably be valuable for research." + icon_state = "grav core" + anomaly_type = /obj/effect/anomaly/grav + +/obj/item/assembly/signaler/anomaly/flux + name = "\improper flux anomaly core" + desc = "The neutralized core of a flux anomaly. Touching it makes your skin tingle. It'd probably be valuable for research." + icon_state = "flux core" + anomaly_type = /obj/effect/anomaly/flux + +/obj/item/assembly/signaler/anomaly/bluespace + name = "\improper bluespace anomaly core" + desc = "The neutralized core of a bluespace anomaly. It keeps phasing in and out of view. It'd probably be valuable for research." + icon_state = "anomaly core" + anomaly_type = /obj/effect/anomaly/bluespace + +/obj/item/assembly/signaler/anomaly/vortex + name = "\improper vortex anomaly core" + desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research." + icon_state = "vortex core" + anomaly_type = /obj/effect/anomaly/bhole + /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index b6a761b4b34..c43fb260aad 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -99,9 +99,8 @@ /obj/item/assembly/timer/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["seconds"] = round(time % 60) + data["minutes"] = round((time - data["seconds"]) / 60) data["timing"] = timing data["loop"] = loop return data @@ -123,6 +122,7 @@ if("input") var/value = text2num(params["adjust"]) if(value) - time = min(max(round(time+value), 1), 600) + value = round(time + value) + time = clamp(value, 1, 600) saved_time = time . = TRUE diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 185bddc9524..e33ae714172 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -321,7 +321,7 @@ var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY && (air.temperature <= FUSION_MAXIMUM_TEMPERATURE || reaction_energy <= 0)) //If above FUSION_MAXIMUM_TEMPERATURE, will only adjust temperature for endothermic reactions. - air.temperature = CLAMP(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY) + air.temperature = clamp(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY) return REACTING /datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst. @@ -521,5 +521,5 @@ if(energy_released) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = CLAMP((air.temperature*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY) + air.temperature = clamp((air.temperature*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY) return REACTING diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 1dd9b52cf68..c670c07798f 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -301,7 +301,7 @@ if(target_move.can_crawl_through()) if(is_type_in_typecache(target_move, GLOB.ventcrawl_machinery)) user.forceMove(target_move.loc) //handle entering and so on. - user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.") + user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.") else var/list/pipenetdiff = returnPipenets() ^ target_move.returnPipenets() if(pipenetdiff.len) @@ -313,7 +313,7 @@ playsound(src, 'sound/machines/ventcrawl.ogg', 50, TRUE, -3) else if(is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent user.forceMove(loc) - user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.") + user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.") //PLACEHOLDER COMMENT FOR ME TO READD THE 1 (?) DS DELAY THAT WAS IMPLEMENTED WITH A... TIMER? diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 97eba613358..4bba6e94c04 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -159,13 +159,13 @@ pump_direction = 1 if("set_input_pressure" in signal.data) - input_pressure_min = CLAMP(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) + input_pressure_min = clamp(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) if("set_output_pressure" in signal.data) - output_pressure_max = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + output_pressure_max = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) addtimer(CALLBACK(src, .proc/broadcast_status), 2) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index a421bad9415..cb994fb40c9 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -125,7 +125,7 @@ Passive gate is similar to the regular pump except: pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -147,7 +147,7 @@ Passive gate is similar to the regular pump except: on = !on if("set_output_pressure" in signal.data) - target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index c4985ae7d05..cb9bc3e03c9 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -131,7 +131,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -153,7 +153,7 @@ on = !on if("set_output_pressure" in signal.data) - target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index f5046d9ed2c..fa44af56d49 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -149,7 +149,7 @@ rate = text2num(rate) . = TRUE if(.) - transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -167,7 +167,7 @@ if("set_transfer_rate" in signal.data) var/datum/gas_mixture/air1 = airs[1] - transfer_rate = CLAMP(text2num(signal.data["set_transfer_rate"]),0,air1.volume) + transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 0bfbe53ea1a..b5d4614e9af 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -161,7 +161,7 @@ rate = text2num(rate) . = TRUE if(.) - transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) if("filter") filter_type = null diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 7927c697ee1..8e3f647d88d 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -162,7 +162,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("node1") var/value = text2num(params["concentration"]) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 530ea2a18a5..76f3f999c9e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -122,7 +122,7 @@ if("set_volume_rate" in signal.data) var/number = text2num(signal.data["set_volume_rate"]) var/datum/gas_mixture/air_contents = airs[1] - volume_rate = CLAMP(number, 0, air_contents.volume) + volume_rate = clamp(number, 0, air_contents.volume) addtimer(CALLBACK(src, .proc/broadcast_status), 2) @@ -166,7 +166,7 @@ rate = text2num(rate) . = TRUE if(.) - volume_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + volume_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() broadcast_status() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 35470b47bde..4a48f490d9c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -166,7 +166,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = CLAMP(target, min_temperature, max_temperature) + target_temperature = clamp(target, min_temperature, max_temperature) investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 3605c5f4120..ec64bd45fd7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -212,13 +212,13 @@ if("set_internal_pressure" in signal.data) var/old_pressure = internal_pressure_bound - internal_pressure_bound = CLAMP(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = clamp(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) if(old_pressure != internal_pressure_bound) investigate_log(" internal pressure was set to [internal_pressure_bound] by [key_name(signal_sender)]",INVESTIGATE_ATMOS) if("set_external_pressure" in signal.data) var/old_pressure = external_pressure_bound - external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) if(old_pressure != external_pressure_bound) investigate_log(" external pressure was set to [external_pressure_bound] by [key_name(signal_sender)]",INVESTIGATE_ATMOS) @@ -229,10 +229,10 @@ internal_pressure_bound = 0 if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = CLAMP(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = clamp(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) if("adjust_external_pressure" in signal.data) - external_pressure_bound = CLAMP(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) if("init" in signal.data) name = signal.data["init"] diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 6ed67319840..1d1f7ccac3b 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -128,9 +128,9 @@ if(initialize_directions & dir) return ..() if((NORTH|EAST) & dir) - user.ventcrawl_layer = CLAMP(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if((SOUTH|WEST) & dir) - user.ventcrawl_layer = CLAMP(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") /obj/machinery/atmospherics/pipe/layer_manifold/visible diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 74cc37dc5ac..91a3a8987dc 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -403,7 +403,7 @@ pressure = text2num(pressure) . = TRUE if(.) - release_pressure = CLAMP(round(pressure), can_min_release_pressure, can_max_release_pressure) + release_pressure = clamp(round(pressure), can_min_release_pressure, can_max_release_pressure) investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("valve") var/logmsg @@ -447,7 +447,7 @@ var/N = text2num(user_input) if(!N) return - timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) + timer_set = clamp(N,minimum_timer_set,maximum_timer_set) log_admin("[key_name(usr)] has activated a prototype valve timer") . = TRUE if("toggle_timer") diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 062a1199147..438101a2b76 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -151,7 +151,7 @@ pressure = text2num(pressure) . = TRUE if(.) - pump.target_pressure = CLAMP(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) + pump.target_pressure = clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("eject") if(holding) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 5c684e7b1c3..50fd857b58b 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -462,7 +462,7 @@ outfit = /datum/outfit/nanotrasencommandercorpse /datum/outfit/nanotrasencommandercorpse - name = "Nanotrasen Private Security Commander" + name = "\improper Nanotrasen Private Security Commander" uniform = /obj/item/clothing/under/rank/centcom/commander suit = /obj/item/clothing/suit/armor/bulletproof ears = /obj/item/radio/headset/heads/captain @@ -476,7 +476,7 @@ /obj/effect/mob_spawn/human/nanotrasensoldier - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" id_job = "Private Security Force" id_access_list = list(ACCESS_CENT_CAPTAIN, ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_STORAGE, ACCESS_SECURITY, ACCESS_MECH_SECURITY) outfit = /datum/outfit/nanotrasensoldiercorpse @@ -496,7 +496,7 @@ /obj/effect/mob_spawn/human/commander/alive death = FALSE roundstart = FALSE - mob_name = "Nanotrasen Commander" + mob_name = "\improper Nanotrasen Commander" name = "sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index a477a223b2d..11d99108a5f 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -6,7 +6,7 @@ requires_power = FALSE /area/awaymission/spacebattle/cruiser - name = "Nanotrasen Cruiser" + name = "\improper Nanotrasen Cruiser" icon_state = "awaycontent2" /area/awaymission/spacebattle/syndicate1 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/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm index 659065ead96..8fe4c8fb5e2 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm @@ -13,7 +13,7 @@ /datum/blackmarket_item/clothing/durathread_vest name = "Durathread Vest" - desc = "Dont let them tell you this stuff is \"Like asbestos\" or \"Pulled from the market for safety concerns\". It could be the difference between a robusting and a retaliation." + desc = "Don't let them tell you this stuff is \"Like asbestos\" or \"Pulled from the market for safety concerns\". It could be the difference between a robusting and a retaliation." item = /obj/item/clothing/suit/armor/vest/durathread price_min = 200 @@ -32,7 +32,7 @@ availability_prob = 50 /datum/blackmarket_item/clothing/full_spacesuit_set - name = "Nanotrasen Branded Spacesuit Box" + name = "\improper Nanotrasen Branded Spacesuit Box" desc = "A few boxes of \"Old Style\" space suits fell off the back of a space truck." item = /obj/item/storage/box diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 11a166548a3..e0058b74b3f 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -238,8 +238,8 @@ /datum/reagent/medicine/atropine,\ /datum/reagent/medicine/cryoxadone,\ /datum/reagent/medicine/salbutamol,\ - /datum/reagent/medicine/rhigoxane,\ - /datum/reagent/medicine/trophazole,\ + /datum/reagent/medicine/C2/hercuri,\ + /datum/reagent/medicine/C2/probital,\ /datum/reagent/drug/methamphetamine,\ /datum/reagent/drug/crank,\ /datum/reagent/nitrous_oxide,\ diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index cbbf36c6710..af61a6698e4 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -28,7 +28,7 @@ /datum/bounty/item/trash name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash Centcom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." + description = "Recently a group of janitors have run out of trash to clean up, without any trash CentCom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." reward = 1000 required_count = 10 wanted_types = list(/obj/item/trash) diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 95437036bf1..eed5ae2cf8e 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -3,7 +3,7 @@ /obj/machinery/computer/bounty - name = "Nanotrasen bounty console" + name = "\improper Nanotrasen bounty console" desc = "Used to check and claim bounties offered by Nanotrasen" icon_screen = "bounty" circuit = /obj/item/circuitboard/computer/bounty diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index b560aa8e13b..c557a207b99 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -11,7 +11,7 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" - set desc = "Configure and launch a Centcom supplypod full of whatever your heart desires!" + set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" set category = "Admin - Events" var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum plaunch.ui_interact(usr)//datum has a tgui component, here we open the window @@ -476,7 +476,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm else return //if target is null and we don't have a specific target, cancel if (effectAnnounce) - deadchat_broadcast("A special package is being launched at the station!", turf_target = target) + deadchat_broadcast("A special package is being launched at the station!", turf_target = target, message_type=DEADCHAT_ANNOUNCEMENT) var/list/bouttaDie = list() for (var/mob/living/M in target) bouttaDie.Add(M) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 547e536e7da..e9bde3d46e4 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -31,9 +31,12 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(!GLOB.exports_list.len) setupExports() + var/profit_ratio = 1 //Percentage that gets sent to the seller, rest goes to cargo. + var/list/contents = AM.GetAllContents() var/datum/export_report/report = external_report + if(!report) //If we don't have any longer transaction going on report = new @@ -43,11 +46,12 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/sold = FALSE if(QDELETED(thing)) continue + for(var/datum/export/E in GLOB.exports_list) if(!E) continue if(E.applies_to(thing, allowed_categories, apply_elastic)) - sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) + sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic, profit_ratio) report.exported_atoms += " [thing.name]" if(!QDELETED(thing)) report.exported_atoms_ref += thing @@ -127,10 +131,16 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they /datum/export/proc/sell_object(obj/O, datum/export_report/report, dry_run = TRUE, allowed_categories = EXPORT_CARGO , apply_elastic = TRUE) var/the_cost = get_cost(O, allowed_categories , apply_elastic) var/amount = get_amount(O) - + var/profit_ratio = 0 if(amount <=0 || the_cost <=0) return FALSE - + if(dry_run == FALSE) + if(SEND_SIGNAL(O, COMSIG_ITEM_SOLD, item_value = get_cost(O, allowed_categories , apply_elastic)) & COMSIG_ITEM_SPLIT_VALUE) + profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT) + the_cost = the_cost*((100-profit_ratio)/100) + else + profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT) + the_cost = the_cost*((100-profit_ratio)/100) report.total_value[src] += the_cost if(istype(O, /datum/export/material)) diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm new file mode 100644 index 00000000000..1f6e4d43789 --- /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 d17c25947d4..ba37113296b 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -187,7 +187,9 @@ /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/clothing/head/helmet/space/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman) + /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/clothing/gloves/color/plasmaman, + /obj/item/clothing/gloves/color/plasmaman) crate_name = "plasmaman supply kit" /datum/supply_pack/emergency/radiation @@ -1452,12 +1454,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, @@ -2279,7 +2282,7 @@ if(prob(50)) the_toy = pickweight(GLOB.arcade_prize_pool) else - the_toy = pick(subtypesof(/obj/item/toy/plush)) + the_toy = pick(subtypesof(/obj/item/toy/plush) - typesof(/obj/item/toy/plush/goatplushie/angry/kinggoat)) new the_toy(.) /datum/supply_pack/costumes_toys/wizard diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 68911fa5af3..01affdc3e9a 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 @@ -620,6 +614,7 @@ GLOBAL_LIST_EMPTY(asset_datums) "clownking" = 'icons/UI_Icons/Achievements/Misc/clownking.png', "clownthanks" = 'icons/UI_Icons/Achievements/Misc/clownthanks.png', "rule8" = 'icons/UI_Icons/Achievements/Misc/rule8.png', + "snail" = 'icons/UI_Icons/Achievements/Misc/snail.png', "mining" = 'icons/UI_Icons/Achievements/Skills/mining.png', ) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1e363479a64..c0dbc6e9933 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -878,8 +878,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) var/viewscale = getviewsize(view) var/x = viewscale[1] var/y = viewscale[2] - x = CLAMP(x+change, min, max) - y = CLAMP(y+change, min,max) + x = clamp(x+change, min, max) + y = clamp(y+change, min,max) change_view("[x]x[y]") /client/proc/update_movement_keys(datum/preferences/direct_prefs) 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 1c7a66e3616..16745badb17 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -30,12 +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 diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 6becb3f9abe..b400a1ec154 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -46,7 +46,7 @@ if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - if(!(HAS_TRAIT(H, TRAIT_BLIND))) + if(!H.is_blind()) if(H.glasses == src) to_chat(H, "[src] overloads and blinds you!") H.flash_act(visual = 1) 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/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index b7dd648f58c..21068814cb7 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -65,3 +65,72 @@ /obj/item/clothing/gloves/rapid/ComponentInitialize() . = ..() AddComponent(/datum/component/wearertargeting/punchcooldown) + + +/obj/item/clothing/gloves/color/plasmaman + desc = "Covers up those scandalous boney hands." + name = "plasma envirogloves" + icon_state = "plasmaman" + item_state = "plasmaman" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + +/obj/item/clothing/gloves/color/plasmaman/black + name = "black envirogloves" + icon_state = "blackplasma" + item_state = "blackplasma" + +/obj/item/clothing/gloves/color/plasmaman/white + name = "white envirogloves" + icon_state = "whiteplasma" + item_state = "whiteplasma" + +/obj/item/clothing/gloves/color/plasmaman/robot + name = "roboticist envirogloves" + icon_state = "robotplasma" + item_state = "robotplasma" + +/obj/item/clothing/gloves/color/plasmaman/janny + name = "janitor envirogloves" + icon_state = "jannyplasma" + item_state = "jannyplasma" + +/obj/item/clothing/gloves/color/plasmaman/cargo + name = "cargo envirogloves" + icon_state = "cargoplasma" + item_state = "cargoplasma" + +/obj/item/clothing/gloves/color/plasmaman/engineer + name = "engineering envirogloves" + icon_state = "engieplasma" + item_state = "engieplasma" + +/obj/item/clothing/gloves/color/plasmaman/atmos + name = "atmos envirogloves" + icon_state = "atmosplasma" + item_state = "atmosplasma" + +/obj/item/clothing/gloves/color/plasmaman/explorer + name = "explorer envirogloves" + icon_state = "explorerplasma" + item_state = "explorerplasma" + +/obj/item/clothing/gloves/color/botanic_leather/plasmaman + name = "botany envirogloves" + desc = "Covers up those scandalous boney hands." + icon_state = "botanyplasma" + item_state = "botanyplasma" + +/obj/item/clothing/gloves/color/plasmaman/prototype + name = "prototype envirogloves" + icon_state = "protoplasma" + item_state = "protoplasma" + +/obj/item/clothing/gloves/color/plasmaman/clown + name = "clown envirogloves" + icon_state = "clownplasma" + item_state = "clownplasma" + diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2738563313e..4cc32b187d9 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -324,7 +324,7 @@ //LightToggle -/obj/item/clothing/head/helment/ComponentInitialize() +/obj/item/clothing/head/helmet/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index b9a5f32479e..52bb2904252 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -33,7 +33,6 @@ /obj/item/clothing/head/welding/attack_self(mob/user) weldingvisortoggle(user) - /* * Cakehat */ @@ -179,7 +178,6 @@ /obj/item/clothing/head/kitty/genuine desc = "A pair of kitty ears. A tag on the inside says \"Hand made from real cats.\"" - /obj/item/clothing/head/hardhat/reindeer name = "novelty reindeer hat" desc = "Some fake antlers and a very fake red nose." @@ -216,8 +214,6 @@ ..() user.remove_alt_appearance("standard_borg_disguise") - - /obj/item/clothing/head/wig name = "wig" desc = "A bunch of hair without a head attached." @@ -255,18 +251,19 @@ /obj/item/clothing/head/wig/attack_self(mob/user) var/new_style = input(user, "Select a hairstyle", "Wig Styling") as null|anything in (GLOB.hairstyles_list - "Bald") + var/newcolor = adjustablecolor ? input(usr,"","Choose Color",color) as color|null : null if(!user.canUseTopic(src, BE_CLOSE)) return if(new_style && new_style != hairstyle) hairstyle = new_style user.visible_message("[user] changes \the [src]'s hairstyle to [new_style].", "You change \the [src]'s hairstyle to [new_style].") - if(adjustablecolor) - color = input(usr,"","Choose Color",color) as color|null + if(newcolor && newcolor != color) // only update if necessary + add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) update_icon() /obj/item/clothing/head/wig/random/Initialize(mapload) hairstyle = pick(GLOB.hairstyles_list - "Bald") //Don't want invisible wig - color = "#[random_short_color()]" + add_atom_colour("#[random_short_color()]", FIXED_COLOUR_PRIORITY) . = ..() /obj/item/clothing/head/wig/natural @@ -283,8 +280,9 @@ /obj/item/clothing/head/wig/natural/equipped(mob/living/carbon/human/user, slot) . = ..() if(ishuman(user) && slot == ITEM_SLOT_HEAD) - color = "#[user.hair_color]" - update_icon() + if (color != "#[user.hair_color]") // only update if necessary + add_atom_colour("#[user.hair_color]", FIXED_COLOUR_PRIORITY) + update_icon() user.update_inv_head() /obj/item/clothing/head/bronze @@ -325,7 +323,6 @@ user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") - /obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) //God Im sorry if(!warped && iscarbon(usr)) diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index 1016f0675e8..4385734456a 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -3,42 +3,49 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/enviroslacks + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/chef name = "Chef Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/chef + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/botany name = "Botany Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/botany uniform = /obj/item/clothing/under/plasmaman/botany + gloves = /obj/item/clothing/gloves/color/botanic_leather/plasmaman /datum/outfit/plasmaman/curator name = "Curator Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/curator uniform = /obj/item/clothing/under/plasmaman/curator + gloves = /obj/item/clothing/gloves/color/plasmaman/prototype /datum/outfit/plasmaman/chaplain name = "Chaplain Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain uniform = /obj/item/clothing/under/plasmaman/chaplain + gloves = /obj/item/clothing/gloves/color/plasmaman/black /datum/outfit/plasmaman/janitor name = "Janitor Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/janitor uniform = /obj/item/clothing/under/plasmaman/janitor + gloves = /obj/item/clothing/gloves/color/plasmaman/janny /datum/outfit/plasmaman/security name = "Security Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/security uniform = /obj/item/clothing/under/plasmaman/security + gloves = /obj/item/clothing/gloves/color/plasmaman/black /datum/outfit/plasmaman/detective name = "Detective Plasmaman" @@ -46,84 +53,99 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/enviroslacks ears = /obj/item/radio/headset/headset_sec + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/warden name = "Warden Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden uniform = /obj/item/clothing/under/plasmaman/security/warden + gloves = /obj/item/clothing/gloves/color/plasmaman/black /datum/outfit/plasmaman/prisoner name = "Prisoner Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/prisoner uniform = /obj/item/clothing/under/plasmaman/prisoner + shoes = /obj/item/clothing/shoes/sneakers/black + gloves = /obj/item/clothing/gloves/color/plasmaman/black /datum/outfit/plasmaman/cargo name = "Cargo Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/cargo uniform = /obj/item/clothing/under/plasmaman/cargo + gloves = /obj/item/clothing/gloves/color/plasmaman/cargo /datum/outfit/plasmaman/mining name = "Mining Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/mining uniform = /obj/item/clothing/under/plasmaman/mining + gloves = /obj/item/clothing/gloves/color/plasmaman/explorer /datum/outfit/plasmaman/medical name = "Medical Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/medical uniform = /obj/item/clothing/under/plasmaman/medical + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/paramedic name = "Paramedic Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/paramedic uniform = /obj/item/clothing/under/plasmaman/paramedic + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/viro name = "Virology Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/viro uniform = /obj/item/clothing/under/plasmaman/viro + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/chemist name = "Chemist Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/chemist uniform = /obj/item/clothing/under/plasmaman/chemist + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/genetics name = "Genetics Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/genetics uniform = /obj/item/clothing/under/plasmaman/genetics + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/science name = "Science Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/science uniform = /obj/item/clothing/under/plasmaman/science + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/robotics name = "Robotics Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/robotics uniform = /obj/item/clothing/under/plasmaman/robotics + gloves = /obj/item/clothing/gloves/color/plasmaman/robot /datum/outfit/plasmaman/engineering name = "Engineering Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/engineering uniform = /obj/item/clothing/under/plasmaman/engineering + gloves = /obj/item/clothing/gloves/color/plasmaman/engineer /datum/outfit/plasmaman/atmospherics name = "Atmospherics Plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics uniform = /obj/item/clothing/under/plasmaman/atmospherics + gloves = /obj/item/clothing/gloves/color/plasmaman/atmos /datum/outfit/plasmaman/mime name = "Plasmamime" @@ -131,6 +153,7 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/mime uniform = /obj/item/clothing/under/plasmaman/mime mask = /obj/item/clothing/mask/gas/mime + gloves = /obj/item/clothing/gloves/color/plasmaman/white /datum/outfit/plasmaman/clown name = "Plasmaclown" @@ -138,3 +161,4 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/clown uniform = /obj/item/clothing/under/plasmaman/clown mask = /obj/item/clothing/mask/gas/clown_hat + gloves = /obj/item/clothing/gloves/color/plasmaman/clown diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 8043ec758c9..3fc808a4a7d 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -371,6 +371,8 @@ uniform = /obj/item/clothing/under/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full mask = /obj/item/clothing/mask/breath + gloves = /obj/item/clothing/gloves/color/plasmaman + /datum/outfit/centcom/death_commando name = "Death Commando" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 1dbb155a269..8e9cdd441db 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -75,10 +75,12 @@ 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.charge / cell.maxcharge + var/cell_percent = cell.percent() if(cell_percent > 0.6) user.update_spacesuit_hud_icon("high") else if(cell_percent > 0.20) @@ -90,7 +92,7 @@ if(thermal_on && cell.charge >= THERMAL_REGULATOR_COST) user.adjust_bodytemperature((temperature_setting - user.bodytemperature), use_steps=TRUE, capped=FALSE) - cell.charge -= THERMAL_REGULATOR_COST + cell.use(THERMAL_REGULATOR_COST) // Clean up the cell on destroy /obj/item/clothing/suit/space/Destroy() @@ -116,18 +118,16 @@ // Show the status of the suit and the cell /obj/item/clothing/suit/space/examine(mob/user) . = ..() - if(!in_range(src, user) && !isobserver(user)) - return - - . += "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 meeter shows [cell ? "[round(cell.charge / cell.maxcharge * 100)]%" : "!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." + 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) @@ -159,24 +159,23 @@ /// Open the cell cover when ALT+Click on the suit /obj/item/clothing/suit/space/AltClick(mob/living/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return + 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(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + if(user && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(cell_cover_open && cell) remove_cell(user) return return ..() -// Remove suit when using the suit on its self +// 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 over is open +/// 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]!", \ @@ -191,10 +190,10 @@ 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(mob/user) +/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 - to_chat(user, "You turn [thermal_on ? "on" : "off"] the thermal regulator on \the [src].") + SEND_SIGNAL(src, COMSIG_SUIT_SPACE_TOGGLE) // let emags override the temperature settings /obj/item/clothing/suit/space/emag_act(mob/user) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 37274476003..2c61e9cd5b6 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -760,7 +760,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/process() . = ..() if(recharge_rate && world.time > recharge_cooldown && current_charges < max_charges) - current_charges = CLAMP((current_charges + recharge_rate), 0, 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) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index a227fdd5fe1..06809a06ff3 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -54,8 +54,8 @@ actions_types = list(/datum/action/item_action/toggle_helmet_light) visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES | PEPPERPROOF - visor_flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR + flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF + visor_flags_inv = HIDEEYES|HIDEFACE /obj/item/clothing/head/helmet/space/plasmaman/Initialize() . = ..() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 5e6a471a784..dc394d54bd1 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -12,6 +12,14 @@ body_parts_covered = CHEST|GROIN allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants) +/obj/item/clothing/suit/apron/waders + name = "horticultural waders" + desc = "A pair of heavy duty leather waders, perfect for insulating your soft flesh from spills, soil and thorns." + icon_state = "hort_waders" + item_state = "hort_waders" + body_parts_covered = CHEST|GROIN|LEGS + permeability_coefficient = 0.5 + //Captain /obj/item/clothing/suit/captunic name = "captain's parade tunic" diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index a0e03ffc16b..696852c774c 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -153,7 +153,7 @@ siemens_coefficient = -1 var/zap_power = 25000 var/zap_range = 20 - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE /obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user) ..() diff --git a/code/modules/discord/tgs_commands.dm b/code/modules/discord/tgs_commands.dm index cb2ff65934c..124da4a068f 100644 --- a/code/modules/discord/tgs_commands.dm +++ b/code/modules/discord/tgs_commands.dm @@ -8,7 +8,7 @@ if(member == "[sender.mention]") SSdiscord.notify_members -= "[SSdiscord.id_clean(sender.mention)]" // The list uses strings because BYOND cannot handle a 17 digit integer return "You will no longer be notified when the server restarts" - + // If we got here, they arent in the list. Chuck 'em in! SSdiscord.notify_members += "[SSdiscord.id_clean(sender.mention)]" // The list uses strings because BYOND cannot handle a 17 digit integer return "You will now be notified when the server restarts" @@ -22,7 +22,10 @@ var/lowerparams = replacetext(lowertext(params), " ", "") // Fuck spaces if(SSdiscord.account_link_cache[lowerparams]) // First if they are in the list, then if the ckey matches if(SSdiscord.account_link_cache[lowerparams] == "[SSdiscord.id_clean(sender.mention)]") // If the associated ID is the correct one + // Link the account in the DB table SSdiscord.link_account(lowerparams) + // Role the user + SSdiscord.grant_role(lowerparams) return "Successfully linked accounts" else return "That ckey is not associated to this discord account. If someone has used your ID, please inform an administrator" diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 7efdf73393d..f76f0e50675 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -94,7 +94,7 @@ if(random) log_game("Random Event triggering: [name] ([typepath])") if (alert_observers) - deadchat_broadcast(" has just been[random ? " randomly" : ""] triggered!", "[name]") //STOP ASSUMING IT'S BADMINS! + deadchat_broadcast(" has just been[random ? " randomly" : ""] triggered!", "[name]", message_type=DEADCHAT_ANNOUNCEMENT) //STOP ASSUMING IT'S BADMINS! return E //Special admins setup diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 692e2a186e3..c0350b63b1a 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -22,7 +22,8 @@ /area/engine, /area/solar, /area/holodeck, - /area/shuttle) + /area/shuttle, + /area/maintenance) ) //Subtypes from the above that actually should explode. diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 5d30fe6c1c2..8af1d05ca2c 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/anomaly/anomaly_bluespace max_occurrences = 1 - weight = 5 + weight = 15 /datum/round_event/anomaly/anomaly_bluespace startWhen = 3 diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 756d7876917..f20b6cab74f 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -3,12 +3,24 @@ typepath = /datum/round_event/anomaly/anomaly_grav max_occurrences = 5 - weight = 20 + weight = 25 /datum/round_event/anomaly/anomaly_grav startWhen = 3 announceWhen = 20 anomaly_path = /obj/effect/anomaly/grav +/datum/round_event_control/anomaly/anomaly_grav/high + name = "Anomaly: Gravitational (High Intensity)" + typepath = /datum/round_event/anomaly/anomaly_grav/high + weight = 15 + max_occurrences = 1 + earliest_start = 20 MINUTES + +/datum/round_event/anomaly/anomaly_grav/high + startWhen = 3 + announceWhen = 20 + anomaly_path = /obj/effect/anomaly/grav/high + /datum/round_event/anomaly/anomaly_grav/announce(fake) priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 2a88158f44b..f71139d7ebb 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -4,7 +4,7 @@ min_players = 20 max_occurrences = 2 - weight = 5 + weight = 10 /datum/round_event/anomaly/anomaly_vortex startWhen = 10 diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index 5a2d2ec697f..5d763733235 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -36,7 +36,7 @@ else if(status == NOT_ENOUGH_PLAYERS) message_admins("[role_name] cannot be spawned due to lack of players \ signing up.") - deadchat_broadcast(" did not get enough candidates ([minimum_required]) to spawn.", "[role_name]") + deadchat_broadcast(" did not get enough candidates ([minimum_required]) to spawn.", "[role_name]", message_type=DEADCHAT_ANNOUNCEMENT) else if(status == SUCCESSFUL_SPAWN) message_admins("[role_name] spawned successfully.") if(spawned_mobs.len) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index aad4c7c1b24..f52adb3274d 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -127,8 +127,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 penetrate(clong) else if(istype(clong, type)) var/obj/effect/immovablerod/other = clong - visible_message("[src] collides with [other]!\ - ") + visible_message("[src] collides with [other]!") var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(2, get_turf(src)) smoke.start() 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/embeddies.dm b/code/modules/events/wizard/embeddies.dm new file mode 100644 index 00000000000..087bf68627a --- /dev/null +++ b/code/modules/events/wizard/embeddies.dm @@ -0,0 +1,46 @@ +/datum/round_event_control/wizard/embedpocalypse + name = "Make Everything Embeddable" + weight = 2 + typepath = /datum/round_event/wizard/embedpocalypse + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/wizard/embedpocalypse/start() + for(var/obj/item/I in world) + CHECK_TICK + + if(!(I.flags_1 & INITIALIZED_1)) + continue + + if(!I.embedding || I.embedding == EMBED_HARMLESS) + I.embedding = EMBED_POINTY + I.AddElement(/datum/element/embed, I.embedding) + I.name = "pointy [I.name]" + + GLOB.embedpocalypse = TRUE + GLOB.stickpocalypse = FALSE // embedpocalypse takes precedence over stickpocalypse + +/datum/round_event_control/wizard/embedpocalypse/sticky + name = "Make Everything Sticky" + weight = 6 + typepath = /datum/round_event/wizard/embedpocalypse/sticky + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event_control/wizard/embedpocalypse/sticky/canSpawnEvent(players_amt, gamemode) + if(GLOB.embedpocalypse) + return FALSE + +/datum/round_event/wizard/embedpocalypse/sticky/start() + for(var/obj/item/I in world) + CHECK_TICK + + if(!(I.flags_1 & INITIALIZED_1)) + continue + + if(!I.embedding) + I.embedding = EMBED_HARMLESS + I.AddElement(/datum/element/embed, I.embedding) + I.name = "sticky [I.name]" + + GLOB.stickpocalypse = TRUE diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index f4af7d84489..96a2655b4c2 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -60,10 +60,10 @@ /mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/teleport, + allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) //thanks Lett1 /mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/teleport, + allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) 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..ec162f60e67 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -411,38 +411,26 @@ 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) foodtype = GRAIN | FRUIT | SUGAR -/obj/item/reagent_containers/food/snacks/lollipop - name = "lollipop" - desc = "A delicious lollipop. Makes for a great Valentine's present." - icon = 'icons/obj/lollipop.dmi' - icon_state = "lollipop_stick" - item_state = "lollipop_stick" +/obj/item/reagent_containers/food/snacks/chewable slot_flags = ITEM_SLOT_MASK - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //Honk - var/mutable_appearance/head - var/headcolor = rgb(0, 0, 0) + ///How long it lasts before being deleted var/succ_dur = 180 + ///The delay between each time it will handle reagents var/succ_int = 100 + ///Stores the time set for the next handle_reagents var/next_succ = 0 - tastes = list("candy" = 1) - foodtype = JUNKFOOD | SUGAR -/obj/item/reagent_containers/food/snacks/lollipop/Initialize() - . = ..() - head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") - change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) - - //makes lollipops actually wearable as masks and still edible the old fashioned way. -/obj/item/reagent_containers/food/snacks/lollipop/proc/handle_reagents() + //makes snacks actually wearable as masks and still edible the old fashioned way. +/obj/item/reagent_containers/food/snacks/chewable/proc/handle_reagents() if(reagents.total_volume) if(iscarbon(loc)) var/mob/living/carbon/C = loc @@ -454,7 +442,7 @@ return reagents.remove_any(REAGENTS_METABOLISM) -/obj/item/reagent_containers/food/snacks/lollipop/process() +/obj/item/reagent_containers/food/snacks/chewable/process() if(iscarbon(loc)) if(succ_dur < 1) qdel(src) @@ -464,43 +452,85 @@ handle_reagents() next_succ = world.time + succ_int -/obj/item/reagent_containers/food/snacks/lollipop/equipped(mob/user, slot) +/obj/item/reagent_containers/food/snacks/chewable/equipped(mob/user, slot) . = ..() if(slot == ITEM_SLOT_MASK) START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) -/obj/item/reagent_containers/food/snacks/lollipop/Destroy() +/obj/item/reagent_containers/food/snacks/chewable/Destroy() STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/reagent_containers/food/snacks/lollipop/proc/change_head_color(C) +/obj/item/reagent_containers/food/snacks/chewable/lollipop + name = "lollipop" + desc = "A delicious lollipop. Makes for a great Valentine's present." + icon = 'icons/obj/lollipop.dmi' + icon_state = "lollipop_stick" + item_state = "lollipop_stick" + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //Honk + var/mutable_appearance/head + var/headcolor = rgb(0, 0, 0) + succ_dur = 180 + succ_int = 100 + next_succ = 0 + tastes = list("candy" = 1) + foodtype = JUNKFOOD | SUGAR + +/obj/item/reagent_containers/food/snacks/chewable/lollipop/Initialize() + . = ..() + head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") + change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) + +/obj/item/reagent_containers/food/snacks/chewable/lollipop/proc/change_head_color(C) headcolor = C cut_overlay(head) head.color = C add_overlay(head) -/obj/item/reagent_containers/food/snacks/lollipop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/reagent_containers/food/snacks/chewable/lollipop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..(hit_atom) throw_speed = 1 throwforce = 0 -/obj/item/reagent_containers/food/snacks/lollipop/cyborg +/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg var/spamchecking = TRUE -/obj/item/reagent_containers/food/snacks/lollipop/cyborg/Initialize() +/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg/Initialize() . = ..() addtimer(CALLBACK(src, .proc/spamcheck), 1200) -/obj/item/reagent_containers/food/snacks/lollipop/cyborg/equipped(mob/living/user, slot) +/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg/equipped(mob/living/user, slot) . = ..(user, slot) spamchecking = FALSE -/obj/item/reagent_containers/food/snacks/lollipop/cyborg/proc/spamcheck() +/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg/proc/spamcheck() if(spamchecking) qdel(src) +/obj/item/reagent_containers/food/snacks/chewable/bubblegum + name = "bubblegum" + desc = "A rubbery strip of gum. Not exactly filling, but it keeps you busy." + icon_state = "bubblegum" + item_state = "bubblegum" + color = "#E48AB5" // craftable custom gums someday? + list_reagents = list(/datum/reagent/consumable/sugar = 5) + tastes = list("candy" = 1) + +/obj/item/reagent_containers/food/snacks/chewable/bubblegum/nicotine + name = "nicotine gum" + list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/consumable/menthol = 5) + tastes = list("mint" = 1) + color = "#60A584" + +/obj/item/reagent_containers/food/snacks/chewable/bubblegum/happiness + name = "HP+ gum" + desc = "A rubbery strip of gum. It smells funny." + list_reagents = list(/datum/reagent/drug/happiness = 15) + tastes = list("paint thinner" = 1) + color = "#EE35FF" + /obj/item/reagent_containers/food/snacks/gumball name = "gumball" desc = "A colorful, sugary gumball." diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index fd589a3ffb1..4d0b6971fbb 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -434,14 +434,15 @@ desc = "The classic snack food, now with a heat-activated spicy flair." icon_state = "donkpocketspicy" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/spicy/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/spicy filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "spice" = 1) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/spicy/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/spicy name = "warm Spicy-pocket" desc = "The classic snack food, now maybe a bit too spicy." + icon_state = "donkpocketspicy" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/capsaicin = 3) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/capsaicin = 2) tastes = list("meat" = 2, "dough" = 2, "weird spices" = 2) @@ -452,14 +453,15 @@ desc = "An east-asian take on the classic stationside snack." icon_state = "donkpocketteriyaki" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/soysauce = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/teriyaki/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/teriyaki filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/teriyaki/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/teriyaki name = "warm Teriyaki-pocket" desc = "An east-asian take on the classic stationside snack, now steamy and warm." + icon_state = "donkpocketteriyaki" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/soysauce = 2) tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2) @@ -470,14 +472,15 @@ desc = "Delicious, cheesy and surprisingly filling." icon_state = "donkpocketpizza" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/tomatojuice = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/pizza/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/pizza filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "cheese"= 2) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/pizza/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/pizza name = "warm Pizza-pocket" desc = "Delicious, cheesy, and even better when hot." + icon_state = "donkpocketpizza" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/tomatojuice = 2) tastes = list("meat" = 2, "dough" = 2, "melty cheese"= 2) @@ -488,14 +491,15 @@ desc = "The award-winning donk-pocket that won the hearts of clowns and humans alike." icon_state = "donkpocketbanana" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/honk/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/honk filling_color = "#XXXXXX" tastes = list("banana" = 2, "dough" = 2, "children's antibiotics" = 1) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/honk/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/honk name = "warm Honk-pocket" desc = "The award-winning donk-pocket, now warm and toasty." + icon_state = "donkpocketbanana" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/laughter = 3) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/banana = 4, /datum/reagent/consumable/laughter = 3) tastes = list("dough" = 2, "children's antibiotics" = 1) @@ -506,14 +510,15 @@ desc = "A relentlessly sweet donk-pocket first created for use in Operation Dessert Storm." icon_state = "donkpocketberry" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/berryjuice = 3) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/berry/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry filling_color = "#CD853F" tastes = list("dough" = 2, "jam" = 2) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/berry/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/berry name = "warm Berry-pocket" desc = "A relentlessly sweet donk-pocket, now warm and delicious." + icon_state = "donkpocketberry" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/berryjuice = 3) tastes = list("dough" = 2, "warm jam" = 2) @@ -524,14 +529,15 @@ desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this. icon_state = "donkpocketgondola" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/tranquility = 5) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/gondola/warm + cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/gondola filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/donkpocket/gondola/warm +/obj/item/reagent_containers/food/snacks/donkpocket/warm/gondola name = "warm Gondola-pocket" desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." + icon_state = "donkpocketgondola" bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5) tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1) diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index d91968797c8..c417f472307 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -122,7 +122,7 @@ log_combat(usr, src, "dispensed [O] from", null, "with [stored_food[href_list["dispense"]]] remaining") if(href_list["portion"]) - portion = CLAMP(input("How much drink do you want to dispense per glass?") as num|null, 0, 50) + portion = clamp(input("How much drink do you want to dispense per glass?") as num|null, 0, 50) if (isnull(portion)) return diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 829b79bc02b..ecc75ff9ba6 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -129,7 +129,7 @@ if (isnull(bomb_timer)) return - bomb_timer = CLAMP(CEILING(bomb_timer / 2, 1), BOMB_TIMER_MIN, BOMB_TIMER_MAX) + bomb_timer = clamp(CEILING(bomb_timer / 2, 1), BOMB_TIMER_MIN, BOMB_TIMER_MAX) bomb_defused = FALSE log_bomber(user, "has trapped a", src, "with [bomb] set to [bomb_timer * 2] seconds") 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/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 903a911a21e..95811d30f5a 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -165,7 +165,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico /datum/chatOutput/proc/setMusicVolume(volume = "") if(volume) - adminMusicVolume = CLAMP(text2num(volume), 0, 100) + adminMusicVolume = clamp(text2num(volume), 0, 100) //Sends client connection details to the chat to handle and save /datum/chatOutput/proc/sendClientData() diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 7faf6f22eb2..2f0e032c946 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -102,6 +102,13 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT +//Bunny bag! +/obj/item/storage/backpack/satchel/bunnysatchel + name = "Easter Bunny Satchel" + desc = "Good for your eyes." + icon_state = "satchel_carrot" + item_state = "satchel_carrot" + //Egg prizes and egg spawns! /obj/item/reagent_containers/food/snacks/egg var/containsPrize = FALSE @@ -117,16 +124,33 @@ /obj/item/reagent_containers/food/snacks/egg/proc/dispensePrize(turf/where) var/won = pick(/obj/item/clothing/head/bunnyhead, /obj/item/clothing/suit/bunnysuit, + /obj/item/storage/backpack/satchel/bunnysatchel, /obj/item/reagent_containers/food/snacks/grown/carrot, - /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/toy/balloon, /obj/item/toy/gun, /obj/item/toy/sword, + /obj/item/toy/talking/AI, + /obj/item/toy/talking/owl, + /obj/item/toy/talking/griffin, + /obj/item/toy/minimeteor, + /obj/item/toy/clockwork_watch, + /obj/item/toy/toy_xeno, /obj/item/toy/foamblade, /obj/item/toy/prize/ripley, + /obj/item/toy/prize/fireripley, + /obj/item/toy/prize/deathripley, + /obj/item/toy/prize/gygax, + /obj/item/toy/prize/durand, + /obj/item/toy/prize/marauder, + /obj/item/toy/prize/seraph, + /obj/item/toy/prize/mauler, + /obj/item/toy/prize/odysseus, + /obj/item/toy/prize/phazon, + /obj/item/toy/prize/reticence, /obj/item/toy/prize/honk, /obj/item/toy/plush/carpplushie, /obj/item/toy/redbutton, + /obj/item/toy/windupToolbox, /obj/item/clothing/head/collectable/rabbitears) new won(where) new/obj/item/reagent_containers/food/snacks/chocolateegg(where) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 11d7acdbe71..f71a4fefe10 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -314,7 +314,7 @@ else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) //Can't be outside these (if you change this keep a sane limit) - amount = CLAMP(amount, 1, 10) + amount = clamp(amount, 1, 10) var/id = href_list["create"] if(!stored_research.researched_designs.Find(id)) //naughty naughty diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index f0f3f12ffb6..d46f37d1580 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -74,6 +74,6 @@ /datum/crafting_recipe/fermenting_barrel name = "Wooden Barrel" result = /obj/structure/fermenting_barrel - reqs = list(/obj/item/stack/sheet/mineral/wood = 30) + reqs = list(/obj/item/stack/sheet/mineral/wood = 8) time = 50 category = CAT_PRIMAL diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index cc6995f36f4..a85b7ba05e3 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -202,8 +202,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - W.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) else return ..() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index c902f18f391..2df185c4b84 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -914,26 +914,26 @@ /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// /obj/machinery/hydroponics/proc/adjustNutri(adjustamt) - nutrilevel = CLAMP(nutrilevel + adjustamt, 0, maxnutri) + nutrilevel = clamp(nutrilevel + adjustamt, 0, maxnutri) /obj/machinery/hydroponics/proc/adjustWater(adjustamt) - waterlevel = CLAMP(waterlevel + adjustamt, 0, maxwater) + waterlevel = clamp(waterlevel + adjustamt, 0, maxwater) if(adjustamt>0) adjustToxic(-round(adjustamt/4))//Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. /obj/machinery/hydroponics/proc/adjustHealth(adjustamt) if(myseed && !dead) - plant_health = CLAMP(plant_health + adjustamt, 0, myseed.endurance) + plant_health = clamp(plant_health + adjustamt, 0, myseed.endurance) /obj/machinery/hydroponics/proc/adjustToxic(adjustamt) - toxic = CLAMP(toxic + adjustamt, 0, 100) + toxic = clamp(toxic + adjustamt, 0, 100) /obj/machinery/hydroponics/proc/adjustPests(adjustamt) - pestlevel = CLAMP(pestlevel + adjustamt, 0, 10) + pestlevel = clamp(pestlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/adjustWeeds(adjustamt) - weedlevel = CLAMP(weedlevel + adjustamt, 0, 10) + weedlevel = clamp(weedlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 65a917d8fa7..c4b52acae1a 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -207,7 +207,7 @@ /// Setters procs /// /obj/item/seeds/proc/adjust_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = CLAMP(yield + adjustamt, 0, 10) + yield = clamp(yield + adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -216,39 +216,39 @@ C.value = yield /obj/item/seeds/proc/adjust_lifespan(adjustamt) - lifespan = CLAMP(lifespan + adjustamt, 10, 100) + lifespan = clamp(lifespan + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/adjust_endurance(adjustamt) - endurance = CLAMP(endurance + adjustamt, 10, 100) + endurance = clamp(endurance + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/adjust_production(adjustamt) if(yield != -1) - production = CLAMP(production + adjustamt, 1, 10) + production = clamp(production + adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) - potency = CLAMP(potency + adjustamt, 0, 100) + potency = clamp(potency + adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/adjust_weed_rate(adjustamt) - weed_rate = CLAMP(weed_rate + adjustamt, 0, 10) + weed_rate = clamp(weed_rate + adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/adjust_weed_chance(adjustamt) - weed_chance = CLAMP(weed_chance + adjustamt, 0, 67) + weed_chance = clamp(weed_chance + adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance @@ -257,7 +257,7 @@ /obj/item/seeds/proc/set_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = CLAMP(adjustamt, 0, 10) + yield = clamp(adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -266,39 +266,39 @@ C.value = yield /obj/item/seeds/proc/set_lifespan(adjustamt) - lifespan = CLAMP(adjustamt, 10, 100) + lifespan = clamp(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/set_endurance(adjustamt) - endurance = CLAMP(adjustamt, 10, 100) + endurance = clamp(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/set_production(adjustamt) if(yield != -1) - production = CLAMP(adjustamt, 1, 10) + production = clamp(adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/set_potency(adjustamt) if(potency != -1) - potency = CLAMP(adjustamt, 0, 100) + potency = clamp(adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/set_weed_rate(adjustamt) - weed_rate = CLAMP(adjustamt, 0, 10) + weed_rate = clamp(adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/set_weed_chance(adjustamt) - weed_chance = CLAMP(adjustamt, 0, 67) + weed_chance = clamp(adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index e9368382b5d..7b04dbecdaf 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -13,7 +13,7 @@ outfit = /datum/outfit/job/chemist - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_PHARMACY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_PHARMACY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index d257958989d..8165529bfbc 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -18,10 +18,10 @@ outfit = /datum/outfit/job/cmo - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) paycheck = PAYCHECK_COMMAND diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index e46a74ff814..e68d23849b5 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -13,10 +13,10 @@ outfit = /datum/outfit/job/geneticist - access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) - minimal_access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_SCIENCE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) + minimal_access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_SCIENCE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_MED + paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_GENETICIST @@ -25,7 +25,7 @@ jobtype = /datum/job/geneticist belt = /obj/item/pda/geneticist - ears = /obj/item/radio/headset/headset_medsci + ears = /obj/item/radio/headset/headset_sci uniform = /obj/item/clothing/under/rank/rnd/geneticist shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat/genetics @@ -34,5 +34,4 @@ backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen - duffelbag = /obj/item/storage/backpack/duffelbag/med diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index ebdcdf9e71d..6eaa3c9c19e 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -11,7 +11,7 @@ outfit = /datum/outfit/job/paramedic - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED @@ -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/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index d2da4cce80b..f0d43a7a7cd 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -13,7 +13,7 @@ outfit = /datum/outfit/job/virologist - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_GENETICS, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 15917aef063..ffe88fd4699 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -205,7 +205,7 @@ /obj/item/book/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/pen)) - if(is_blind(user)) + if(user.is_blind()) to_chat(user, "As you are trying to write on the book, you suddenly feel very stupid!") return if(unique) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index c8ec5cbc736..a589d35b344 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -266,7 +266,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums dat += "(Order book by SS13BN)

" dat += "" dat += "" - dat += libcomp_menu[CLAMP(page,1,libcomp_menu.len)] + dat += libcomp_menu[clamp(page,1,libcomp_menu.len)] dat += "" dat += "
AUTHORTITLECATEGORY
<<<< >>>>
" dat += "
(Return to main menu)
" 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/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 3d84a0a81d9..e219f08e159 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -144,6 +144,9 @@ /atom/movable/lighting_object/onTransitZ() return +/atom/movable/lighting_object/washed(var/washer) + return + // Override here to prevent things accidentally moving around overlays. /atom/movable/lighting_object/forceMove(atom/destination, no_tp=FALSE, harderforce = FALSE) if(harderforce) 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/mapping/reader.dm b/code/modules/mapping/reader.dm index 86b501c455d..e7d7fd4898d 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -93,7 +93,7 @@ gridSet.ycrd = text2num(dmmRegex.group[4]) gridSet.zcrd = text2num(dmmRegex.group[5]) - bounds[MAP_MINX] = min(bounds[MAP_MINX], CLAMP(gridSet.xcrd, x_lower, x_upper)) + bounds[MAP_MINX] = min(bounds[MAP_MINX], clamp(gridSet.xcrd, x_lower, x_upper)) bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd) bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd) @@ -113,15 +113,15 @@ if(gridLines.len && gridLines[gridLines.len] == "") gridLines.Cut(gridLines.len) // Remove only one blank line at the end. - bounds[MAP_MINY] = min(bounds[MAP_MINY], CLAMP(gridSet.ycrd, y_lower, y_upper)) + bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(gridSet.ycrd, y_lower, y_upper)) gridSet.ycrd += gridLines.len - 1 // Start at the top and work down - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], CLAMP(gridSet.ycrd, y_lower, y_upper)) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], clamp(gridSet.ycrd, y_lower, y_upper)) var/maxx = gridSet.xcrd if(gridLines.len) //Not an empty map maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1) - bounds[MAP_MAXX] = CLAMP(max(bounds[MAP_MAXX], maxx), x_lower, x_upper) + bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], maxx), x_lower, x_upper) CHECK_TICK // Indicate failure to parse any coordinates by nulling bounds 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/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a30f3ede72f..cd30316fa41 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -448,7 +448,7 @@ denied_type = /obj/item/crusher_trophy/king_goat /obj/item/crusher_trophy/king_goat/effect_desc() - return "you to passivily recharge markers 5x as fast while equipped and do a decent amount of damage at the cost of dulling the blade" + return "you also passively recharge markers 5x as fast while equipped and do a decent amount of damage at the cost of dulling the blade" /obj/item/crusher_trophy/king_goat/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) marker.damage = 10 //in my testing only does damage to simple mobs so should be fine to have it high diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 13b247e121b..9a0bab6a2ea 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -280,7 +280,7 @@ //Signs /obj/structure/sign/mining - name = "nanotrasen mining corps sign" + name = "\improper Nanotrasen mining corps sign" desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "ntpod" diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 67e49a5d516..5b37d8b5265 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 @@ -856,13 +856,13 @@ force = 0 var/ghost_counter = ghost_check() - force = CLAMP((ghost_counter * 4), 0, 75) + force = clamp((ghost_counter * 4), 0, 75) user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") ..() /obj/item/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) var/ghost_counter = ghost_check() - final_block_chance += CLAMP((ghost_counter * 5), 0, 75) + final_block_chance += clamp((ghost_counter * 5), 0, 75) owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") return ..() diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 92aadd3ca04..87c9a769d1d 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 @@ -110,7 +116,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) var/list/logs = GLOB.silo_access_logs[REF(src)] var/len = LAZYLEN(logs) var/num_pages = 1 + round((len - 1) / 30) - var/page = CLAMP(log_page, 1, num_pages) + var/page = clamp(log_page, 1, num_pages) if(num_pages > 1) for(var/i in 1 to num_pages) if(i == page) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 7f64bbbf9e2..ce64b5a5d8e 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -3,7 +3,7 @@ #define MINEDRONE_ATTACK 2 /mob/living/simple_animal/hostile/mining_drone - name = "nanotrasen minebot" + name = "\improper Nanotrasen minebot" desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife." gender = NEUTER icon = 'icons/mob/aibots.dmi' diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index ec684f83560..95a2c3f394b 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -41,7 +41,7 @@ /datum/map_template/shelter/alpha/New() . = ..() - blacklisted_turfs = typecacheof(/turf/open/indestructible) //yogs added indestructible floors to the shelter black list + blacklisted_turfs = typecacheof(/turf/open/indestructible) whitelisted_turfs = typecacheof(/turf/closed/mineral) banned_objects = typecacheof(/obj/structure/stone_tile) @@ -73,6 +73,6 @@ /datum/map_template/shelter/charlie/New() . = ..() - blacklisted_turfs = typecacheof(/turf/open/indestructible) //yogs added indestructible floors to the shelter black list + blacklisted_turfs = typecacheof(/turf/open/indestructible) whitelisted_turfs = typecacheof(/turf/closed/mineral) banned_objects = typecacheof(/obj/structure/stone_tile) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d80ba3effcd..b11cf37f123 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) @@ -504,7 +503,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp views |= i var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views if(new_view) - client.change_view(CLAMP(new_view, 7, max_view)) + client.change_view(clamp(new_view, 7, max_view)) else client.change_view(CONFIG_GET(string/default_view)) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index b130a21eb7f..96b80844205 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,7 +1,7 @@ //These procs handle putting s tuff in your hands //as they handle all relevant stuff like adding it to the player's screen and updating their overlays. -//Returns the thing we're currently holding +///Returns the thing we're currently holding /mob/proc/get_active_held_item() return get_item_for_held_index(active_hand_index) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 4542de9ae0d..948c63fd5eb 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -89,7 +89,9 @@ //We want an accurate reading of .len listclearnulls(BP.embedded_objects) - temp_bleed += 0.5*BP.embedded_objects.len + for(var/obj/item/embeddies in BP.embedded_objects) + if(!embeddies.is_embed_harmless()) + temp_bleed += 0.5 if(brutedamage >= 20) temp_bleed += (brutedamage * 0.013) 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/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 452b162da21..1d0ad8e9d3b 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -1,13 +1,15 @@ - +///alien immune to tox damage /mob/living/carbon/alien/getToxLoss() - return 0 - -/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage return FALSE -//aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) - return +///alien immune to tox damage +/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) + return FALSE +///aliens are immune to stamina damage. +/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) + return FALSE + +///aliens are immune to stamina damage. /mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) - return + return FALSE diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm index 7fd1d318723..0affc187a12 100644 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ b/code/modules/mob/living/carbon/alien/status_procs.dm @@ -17,4 +17,4 @@ /mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0) . = ..() if(!.) - move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10) + move_delay_add = clamp(move_delay_add + round(amount/2), 0, 10) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9a731ef6b9b..a823dee108f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1038,3 +1038,33 @@ if(mood) if(mood.sanity < SANITY_UNSTABLE) return TRUE + +/mob/living/carbon/washed(var/atom/washer) + . = ..() + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) + + for(var/obj/item/I in held_items) + I.washed(washer) + + if(back) + update_inv_back(0) + + var/list/obscured = check_obscured_slots() + + if(head && head.washed(washer)) + update_inv_head() + + if(glasses && !(ITEM_SLOT_EYES in obscured) && glasses.washed(washer)) + update_inv_glasses() + + if(wear_mask && !(ITEM_SLOT_MASK in obscured && wear_mask.washed(washer))) + update_inv_wear_mask() + + if(ears && !(HIDEEARS in obscured) && ears.washed(washer)) + update_inv_ears() + + if(wear_neck && !(ITEM_SLOT_NECK in obscured) && wear_neck.washed(washer)) + update_inv_neck() + + if(shoes && !(HIDESHOES in obscured) && shoes.washed(washer)) + update_inv_shoes() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 5f17532aa62..2d87b2c777b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -342,7 +342,7 @@ become_nearsighted(EYE_DAMAGE) else if(prob(eyes.damage - 25)) - if(!HAS_TRAIT(src, TRAIT_BLIND)) + if(!is_blind()) to_chat(src, "You can't see anything!") eyes.applyOrganDamage(eyes.maxHealth) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 97fd3e1eb4c..6b6bbb22248 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -6,13 +6,13 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) has_limbs = 1 held_items = list(null, null) - var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know. - var/list/internal_organs_slot= list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. - var/silent = FALSE //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. - var/dreaming = 0 //How many dream images we have left to send + var/list/internal_organs = list() ///List of [/obj/item/organ] in the mob. They don't go in the contents for some reason I don't want to know. + var/list/internal_organs_slot= list() ///Same as [above][/mob/living/carbon/var/internal_organs], but stores "slot ID" - "organ" pairs for easy access. + var/silent = 0 ///Can't talk. Value goes down every life proc. NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. + var/dreaming = 0 ///How many dream images we have left to send - var/obj/item/handcuffed = null //Whether or not the mob is handcuffed - var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this. + var/obj/item/handcuffed = null///Whether or not the mob is handcuffed + var/obj/item/legcuffed = null ///Same as handcuffs but for legs. Bear traps use this. var/disgust = 0 @@ -23,15 +23,15 @@ var/obj/item/tank/internal = null var/obj/item/clothing/head = null - var/obj/item/clothing/gloves = null //only used by humans - var/obj/item/clothing/shoes = null //only used by humans. - var/obj/item/clothing/glasses/glasses = null //only used by humans. - var/obj/item/clothing/ears = null //only used by humans. + var/obj/item/clothing/gloves = null ///only used by humans + var/obj/item/clothing/shoes = null ///only used by humans. + var/obj/item/clothing/glasses/glasses = null ///only used by humans. + var/obj/item/clothing/ears = null ///only used by humans. - var/datum/dna/dna = null // Carbon - var/datum/mind/last_mind = null //last mind to control this mob, for blood-based cloning + var/datum/dna/dna = null /// Carbon + var/datum/mind/last_mind = null ///last mind to control this mob, for blood-based cloning - var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. + var/failed_last_breath = 0 ///This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null var/temperature_resistance = T0C+75 @@ -41,13 +41,13 @@ var/rotate_on_lying = 1 - var/tinttotal = 0 // Total level of visualy impairing items + var/tinttotal = 0 /// Total level of visualy impairing items + ///Gets filled up in [create_bodyparts()][/mob/living/carbon/proc/create_bodyparts] var/list/bodyparts = list(/obj/item/bodypart/chest, /obj/item/bodypart/head, /obj/item/bodypart/l_arm, /obj/item/bodypart/r_arm, /obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg) - //Gets filled up in create_bodyparts() - var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems) + var/list/hand_bodyparts = list() ///a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems) var/icon_render_key = "" var/static/list/limb_icon_cache = list() @@ -58,12 +58,12 @@ var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE var/next_hallucination = 0 - var/cpr_time = 1 //CPR cooldown. + var/cpr_time = 1 ///CPR cooldown. var/damageoverlaytemp = 0 - var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects - var/stam_regen_start_time = 0 //used to halt stamina regen temporarily - var/stam_paralyzed = FALSE //knocks you down + var/drunkenness = 0 ///Overall drunkenness + var/stam_regen_start_time = 0 ///used to halt stamina regen temporarily + var/stam_paralyzed = FALSE ///knocks you down /// Protection (insulation) from the heat, Value 0-1 corresponding to the percentage of protection var/heat_protection = 0 // No heat protection diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 2ac4d4e69cc..a329c0c029c 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -113,31 +113,37 @@ return adjustStaminaLoss(diff, updating_health, forced) -/** adjustOrganLoss - * inputs: slot (organ slot, like ORGAN_SLOT_HEART), amount (damage to be done), and maximum (currently an arbitrarily large number, can be set so as to limit damage) - * outputs: - * description: If an organ exists in the slot requested, and we are capable of taking damage (we don't have GODMODE on), call the damage proc on that organ. +/** + * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the damage proc on that organ. + * + * Arguments: + * * slot - organ slot, like [ORGAN_SLOT_HEART] + * * amount - damage to be done + * * maximum - currently an arbitrarily large number, can be set so as to limit damage */ /mob/living/carbon/adjustOrganLoss(slot, amount, maximum) var/obj/item/organ/O = getorganslot(slot) if(O && !(status_flags & GODMODE)) O.applyOrganDamage(amount, maximum) -/** setOrganLoss - * inputs: slot (organ slot, like ORGAN_SLOT_HEART), amount(damage to be set to) - * outputs: - * description: If an organ exists in the slot requested, and we are capable of taking damage (we don't have GODMODE on), call the set damage proc on that organ, which can - * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss. +/** + * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the set damage proc on that organ, which can + * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss. + * + * Arguments: + * * slot - organ slot, like [ORGAN_SLOT_HEART] + * * amount - damage to be set to */ /mob/living/carbon/setOrganLoss(slot, amount) var/obj/item/organ/O = getorganslot(slot) if(O && !(status_flags & GODMODE)) O.setOrganDamage(amount) -/** getOrganLoss - * inputs: slot (organ slot, like ORGAN_SLOT_HEART) - * outputs: organ damage - * description: If an organ exists in the slot requested, return the amount of damage that organ has +/** + * If an organ exists in the slot requested, return the amount of damage that organ has + * + * Arguments: + * * slot - organ slot, like [ORGAN_SLOT_HEART] */ /mob/living/carbon/getOrganLoss(slot) var/obj/item/organ/O = getorganslot(slot) @@ -146,7 +152,7 @@ //////////////////////////////////////////// -//Returns a list of damaged bodyparts +///Returns a list of damaged bodyparts /mob/living/carbon/proc/get_damaged_bodyparts(brute = FALSE, burn = FALSE, stamina = FALSE, status) var/list/obj/item/bodypart/parts = list() for(var/X in bodyparts) @@ -157,7 +163,7 @@ parts += BP return parts -//Returns a list of damageable bodyparts +///Returns a list of damageable bodyparts /mob/living/carbon/proc/get_damageable_bodyparts(status) var/list/obj/item/bodypart/parts = list() for(var/X in bodyparts) @@ -168,9 +174,13 @@ parts += BP return parts -//Heals ONE bodypart randomly selected from damaged ones. -//It automatically updates damage overlays if necessary -//It automatically updates health status +/** + * Heals ONE bodypart randomly selected from damaged ones. + * + * It automatically updates damage overlays if necessary + * + * It automatically updates health status + */ /mob/living/carbon/heal_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute,burn,stamina,required_status) if(!parts.len) @@ -182,9 +192,13 @@ return max(damage_calculator - picked.get_damage(TRUE), 0) -//Damages ONE bodypart randomly selected from damagable ones. -//It automatically updates damage overlays if necessary -//It automatically updates health status +/** + * Damages ONE bodypart randomly selected from damagable ones. + * + * It automatically updates damage overlays if necessary + * + * It automatically updates health status + */ /mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE) var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status) if(!parts.len) @@ -193,7 +207,7 @@ if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE)) update_damage_overlays() -//Heal MANY bodyparts, in random order +///Heal MANY bodyparts, in random order /mob/living/carbon/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_status, updating_health = TRUE) var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, stamina, required_status) @@ -218,7 +232,7 @@ if(update) update_damage_overlays() -// damage MANY bodyparts, in random order +/// damage MANY bodyparts, in random order /mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) if(status_flags & GODMODE) return //godmode diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 6b193c740f4..466747fc075 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -1,5 +1,4 @@ - +/// depending on the species, it will run the corresponding apply_damage code there /mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) - // depending on the species, it will run the corresponding apply_damage code there return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 20f188715b9..baaf4549fee 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -143,7 +143,10 @@ disabled += BP missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) - msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + if(I.is_embed_harmless()) + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" + else + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" for(var/X in disabled) var/obj/item/bodypart/BP = X @@ -277,7 +280,7 @@ if(mood.sanity <= SANITY_DISTURBED) msg += "[t_He] seem[p_s()] distressed.\n" SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) - if (HAS_TRAIT(src, TRAIT_BLIND)) + if (is_blind()) msg += "[t_He] appear[p_s()] to be staring off into space.\n" if (HAS_TRAIT(src, TRAIT_DEAF)) msg += "[t_He] appear[p_s()] to not be responding to noises.\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f9bbab9ad37..7771c380d27 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -213,21 +213,7 @@ var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore return - var/time_taken = I.embedding.embedded_unsafe_removal_time*I.w_class - usr.visible_message("[usr] attempts to remove [I] from [usr.p_their()] [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") - if(do_after(usr, time_taken, needhand = 1, target = src)) - if(!I || !L || I.loc != src || !(I in L.embedded_objects)) - return - L.embedded_objects -= I - L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. - I.forceMove(get_turf(src)) - I.unembedded() - usr.put_in_hands(I) - usr.emote("scream") - usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!", "You successfully remove [I] from your [L.name].") - if(!has_embedded_objects()) - clear_alert("embeddedobject") - SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(src, COMSIG_HUMAN_EMBED_RIP, I, L) return if(href_list["item"]) //canUseTopic check for this is handled by mob/Topic() @@ -1087,6 +1073,24 @@ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING) +/mob/living/carbon/human/washed(var/atom/washer) + . = ..() + if(wear_suit) + update_inv_wear_suit() + else if(w_uniform && w_uniform.washed(washer)) + update_inv_w_uniform() + + if(!is_mouth_covered()) + lip_style = null + update_body() + if(belt && belt.washed(washer)) + update_inv_belt() + + var/list/obscured = check_obscured_slots() + + if(gloves && !(HIDEGLOVES in obscured) && gloves.washed(washer)) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + /mob/living/carbon/human/adjust_nutrition(var/change) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return FALSE diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b4a6139b8a8..df6a887696e 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -101,19 +101,19 @@ for(var/obj/item/I in held_items) if(!istype(I, /obj/item/clothing)) - var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return TRUE if(wear_suit) - var/final_block_chance = wear_suit.block_chance - (CLAMP((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier + var/final_block_chance = wear_suit.block_chance - (clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier if(wear_suit.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return TRUE if(w_uniform) - var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier + var/final_block_chance = w_uniform.block_chance - (clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return TRUE if(wear_neck) - var/final_block_chance = wear_neck.block_chance - (CLAMP((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier + var/final_block_chance = wear_neck.block_chance - (clamp((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return TRUE return FALSE @@ -140,21 +140,6 @@ hitpush = FALSE skipcatch = TRUE blocked = TRUE - else if(I) - if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedding.embedded_ignore_throwspeed_threshold) - if(can_embed(I)) - if(prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) - throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) - var/obj/item/bodypart/L = pick(bodyparts) - L.embedded_objects |= I - I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - I.forceMove(src) - I.embedded(src) - L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) - visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) - hitpush = FALSE - skipcatch = TRUE //can't catch the now embedded item return ..() @@ -746,7 +731,10 @@ to_chat(src, "\t Your [LB.name][isdisabled][self_aware ? " has " : " is "][status].") for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + if(I.is_embed_harmless()) + to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") + else + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") for(var/t in missing) to_chat(src, "Your [parse_zone(t)] is missing!") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 65a15feea84..4d17cc45631 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -39,10 +39,6 @@ handle_heart() handle_liver() - if(stat != DEAD) - //Stuff jammed in your limbs hurts - handle_embedded_objects() - dna.species.spec_life(src) // for mutantraces //Update our name based on whether our face is obscured/disfigured @@ -296,25 +292,6 @@ return TRUE return ..() - -/mob/living/carbon/human/proc/handle_embedded_objects() - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - for(var/obj/item/I in BP.embedded_objects) - if(prob(I.embedding.embedded_pain_chance)) - BP.receive_damage(I.w_class*I.embedding.embedded_pain_multiplier) - to_chat(src, "[I] embedded in your [BP.name] hurts!") - - if(prob(I.embedding.embedded_fall_chance)) - BP.receive_damage(I.w_class*I.embedding.embedded_fall_pain_multiplier) - BP.embedded_objects -= I - I.forceMove(drop_location()) - I.unembedded() - visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") - if(!has_embedded_objects()) - clear_alert("embeddedobject") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") - /mob/living/carbon/human/proc/handle_heart() var/we_breath = !HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 22e0bf0d448..81cca37a37e 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -397,7 +397,7 @@ var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) // redirect the projectile P.firer = H - P.preparePixelProjectile(locate(CLAMP(new_x, 1, world.maxx), CLAMP(new_y, 1, world.maxy), H.z), H) + P.preparePixelProjectile(locate(clamp(new_x, 1, world.maxx), clamp(new_y, 1, world.maxy), H.z), H) return BULLET_ACT_FORCE_PIERCE return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 2ce8275d8c8..9d178c494cd 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -40,7 +40,7 @@ var/obj/item/clothing/CH = H.head if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) atmos_sealed = TRUE - if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed) + if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves)) && !atmos_sealed) if(environment) if(environment.total_moles()) if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index e4dff2269ec..8e9874d0faa 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -113,8 +113,8 @@ to_chat(victim, "[H] is draining your blood!") to_chat(H, "You drain some blood!") playsound(H, 'sound/items/drink.ogg', 30, TRUE, -2) - victim.blood_volume = CLAMP(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - H.blood_volume = CLAMP(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + H.blood_volume = clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) if(!victim.blood_volume) to_chat(H, "You finish off [victim]'s blood supply.") 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 c522874c8ea..2fafbcbcfbe 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -67,7 +67,7 @@ playsound(C, pick(spooks), 50, TRUE, 10) //Congrats you somehow died so hard you stopped being a zombie -/datum/species/zombie/infectious/spec_death(mob/living/carbon/C) +/datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) . = ..() var/obj/item/organ/zombie_infection/infection infection = C.getorganslot(ORGAN_SLOT_ZOMBIE) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 83709a8cc4d..64d05233ae5 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -212,7 +212,7 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_tox_max) * 10 - adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else clear_alert("too_much_tox") @@ -681,7 +681,7 @@ All effects don't start immediately, but rather get worse over time; the rate is 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) + bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp) ///////// diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 43d611e9c87..352b2b86626 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -39,10 +39,10 @@ clear_alert("high") /mob/living/carbon/adjust_disgust(amount) - disgust = CLAMP(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = clamp(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) /mob/living/carbon/set_disgust(amount) - disgust = CLAMP(amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) ////////////////////////////////////////TRAUMAS///////////////////////////////////////// diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 8a8e275e699..65d27edf672 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -1,18 +1,24 @@ -/* - apply_damage(a,b,c) - args - a:damage - How much damage to take - b:damage_type - What type of damage to take, brute, burn - c:def_zone - Where to take the damage if its brute or burn - Returns - standard 0 if fail -*/ +/** + * Applies damage to this mob + * + * Sends [COMSIG_MOB_APPLY_DAMGE] + * + * Arguuments: + * * damage - amount of damage + * * damagetype - one of [BRUTE], [BURN], [TOX], [OXY], [CLONE], [STAMINA] + * * def_zone - zone that is being hit if any + * * blocked - armor value applied + * * forced - bypass hit percentage + * * spread_damage - used in overrides + * + * Returns TRUE if damage applied + */ /mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) - return 0 + return FALSE var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) @@ -27,9 +33,10 @@ adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) adjustStaminaLoss(damage_amount, forced = forced) - return 1 + return TRUE -/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs +///like [apply_damage][/mob/living/proc/apply_damage] except it always uses the damage procs +/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) switch(damagetype) if(BRUTE) return adjustBruteLoss(damage) @@ -44,6 +51,7 @@ if(STAMINA) return adjustStaminaLoss(damage) +/// return the damage amount for the type given /mob/living/proc/get_damage_amount(damagetype = BRUTE) switch(damagetype) if(BRUTE) @@ -59,7 +67,7 @@ if(STAMINA) return getStaminaLoss() - +/// applies multiple damages at once via [/mob/living/proc/apply_damage] /mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0) if(blocked >= 100) return 0 @@ -80,7 +88,7 @@ return 1 - +/// applies various common status effects or common hardcoded mob effects /mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE) var/hit_percent = (100-blocked)/100 if(!effect || (hit_percent <= 0)) @@ -112,7 +120,7 @@ jitteriness = max(jitteriness,(effect * hit_percent)) return 1 - +/// applies multiple effects at once via [/mob/living/proc/apply_effect] /mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, paralyze = 0, immobilize = 0) if(blocked >= 100) return BULLET_ACT_BLOCK @@ -149,7 +157,7 @@ /mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_status) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = CLAMP((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -160,7 +168,7 @@ /mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - oxyloss = CLAMP((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -179,7 +187,7 @@ /mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - toxloss = CLAMP((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -198,7 +206,7 @@ /mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - fireloss = CLAMP((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -209,7 +217,7 @@ /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) return FALSE - cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -240,15 +248,18 @@ /mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return -// heal ONE external organ, organ gets randomly selected from damaged ones. -/// needs to return amount healed in order to calculate things like tend wounds xp gain +/** + * heal ONE external organ, organ gets randomly selected from damaged ones. + * + * needs to return amount healed in order to calculate things like tend wounds xp gain + */ /mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) . = (adjustBruteLoss(-brute, FALSE) + adjustFireLoss(-burn, FALSE) + adjustStaminaLoss(-stamina, FALSE)) //zero as argument for no instant health update if(updating_health) updatehealth() update_stamina() -// damage ONE external organ, organ gets randomly selected from damaged ones. +/// damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE) adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update adjustFireLoss(burn, FALSE) @@ -257,7 +268,7 @@ updatehealth() update_stamina() -// heal MANY bodyparts, in random order +/// heal MANY bodyparts, in random order /mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_status, updating_health = TRUE) adjustBruteLoss(-brute, FALSE) //zero as argument for no instant health update adjustFireLoss(-burn, FALSE) @@ -266,7 +277,7 @@ updatehealth() update_stamina() -// damage MANY bodyparts, in random order +/// damage MANY bodyparts, in random order /mob/living/proc/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status = null) adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update adjustFireLoss(burn, FALSE) @@ -275,7 +286,7 @@ updatehealth() update_stamina() -//heal up to amount damage, in a given order +///heal up to amount damage, in a given order /mob/living/proc/heal_ordered_damage(amount, list/damage_types) . = amount //we'll return the amount of damage healed for(var/i in damage_types) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3d139b23de7..29d38f40df8 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 @@ -1085,7 +1085,7 @@ update_fire() /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = CLAMP(fire_stacks + add_fire_stacks, -20, 20) + fire_stacks = clamp(fire_stacks + add_fire_stacks, -20, 20) if(on_fire && fire_stacks <= 0) ExtinguishMob() @@ -1113,6 +1113,11 @@ //Mobs on Fire end +//Washing +/mob/living/washed(var/atom/washer) + . = ..() + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + // used by secbot and monkeys Crossed /mob/living/proc/knockOver(var/mob/living/carbon/C) if(C.key) //save us from monkey hordes diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ee78a97f0ab..a946e2a3047 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -58,9 +58,9 @@ /obj/item/proc/get_volume_by_throwforce_and_or_w_class() if(throwforce && w_class) - return CLAMP((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 + return clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 else if(w_class) - return CLAMP(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 + return clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 else return 0 @@ -69,7 +69,11 @@ var/obj/item/I = AM var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE - SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, zone) + var/nosell_hit = SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, zone, throwingdatum) // TODO: find a better way to handle hitpush and skipcatch for humans + if(nosell_hit) + skipcatch = TRUE + hitpush = FALSE + dtype = I.damtype if(!blocked) visible_message("[src] is hit by [I]!", \ @@ -402,7 +406,7 @@ /mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) if(HAS_TRAIT(src, TRAIT_NOFLASH)) return FALSE - if(get_eye_protection() < intensity && (override_blindness_check || !(HAS_TRAIT(src, TRAIT_BLIND)))) + if(get_eye_protection() < intensity && (override_blindness_check || !is_blind())) overlay_fullscreen("flash", type) addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25) return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 3e7dbf13cae..935411b3b0b 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -7,92 +7,96 @@ hud_type = /datum/hud/living - var/resize = 1 //Badminnery resize + var/resize = 1 ///Badminnery resize var/lastattacker = null var/lastattackerckey = null //Health and life related vars - var/maxHealth = 100 //Maximum health that should be possible. - var/health = 100 //A mob's health + var/maxHealth = 100 ///Maximum health that should be possible. + var/health = 100 ///A mob's health //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS - var/bruteloss = 0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) - var/oxyloss = 0 //Oxygen depravation damage (no air in lungs) - var/toxloss = 0 //Toxic damage caused by being poisoned or radiated - var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt. - var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims - var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. - var/crit_threshold = HEALTH_THRESHOLD_CRIT // when the mob goes from "normal" to crit + var/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) + var/oxyloss = 0 ///Oxygen depravation damage (no air in lungs) + var/toxloss = 0 ///Toxic damage caused by being poisoned or radiated + var/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt. + var/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims + var/staminaloss = 0 ///Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. + var/crit_threshold = HEALTH_THRESHOLD_CRIT /// when the mob goes from "normal" to crit var/mobility_flags = MOBILITY_FLAGS_DEFAULT var/resting = FALSE - var/lying = 0 //number of degrees. DO NOT USE THIS IN CHECKS. CHECK FOR MOBILITY FLAGS INSTEAD!! - var/lying_prev = 0 //last value of lying on update_mobility + var/lying = 0 ///number of degrees. DO NOT USE THIS IN CHECKS. CHECK FOR MOBILITY FLAGS INSTEAD!! + var/lying_prev = 0 ///last value of lying on update_mobility - var/confused = 0 //Makes the mob move in random directions. + var/confused = 0 ///Makes the mob move in random directions. - var/hallucination = 0 //Directly affects how long a mob will hallucinate for + var/hallucination = 0 ///Directly affects how long a mob will hallucinate for - var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. + var/last_special = 0 ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. var/timeofdeath = 0 - //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. - var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas - //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt + /** + * Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. + * + * FALSE is off, [INCORPOREAL_MOVE_BASIC] is normal, [INCORPOREAL_MOVE_SHADOW] is for ninjas + * and [INCORPOREAL_MOVE_JAUNT] is blocked by holy water/salt + */ + var/incorporeal_move = FALSE var/list/roundstart_quirks = list() - var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. + var/list/surgeries = list() ///a list of surgery datums. generally empty, they're added when the player wants them. - var/now_pushing = null //used by living/Bump() and living/PushAM() to prevent potential infinite loop. + var/now_pushing = null ///used by [living/Bump()][/mob/living/Bump] and [living/PushAM()][/mob/living/PushAM] to prevent potential infinite loop. var/cameraFollow = null - var/tod = null // Time of death + var/tod = null /// Time of death - var/on_fire = 0 //The "Are we on fire?" var - var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 + var/on_fire = 0 ///The "Are we on fire?" var + var/fire_stacks = 0 ///Tracks how many stacks of fire we have on, max is usually 20 - var/bloodcrawl = 0 //0 No blood crawling, BLOODCRAWL for bloodcrawling, BLOODCRAWL_EAT for crawling+mob devour - var/holder = null //The holder for blood crawling - var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always - var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. + var/bloodcrawl = 0 ///0 No blood crawling, [BLOODCRAWL] for bloodcrawling, [BLOODCRAWL_EAT] for crawling+mob devour + var/holder = null ///The holder for blood crawling + var/ventcrawler = 0 ///0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always + var/limb_destroyer = 0 ///1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. var/mob_size = MOB_SIZE_HUMAN var/mob_biotypes = MOB_ORGANIC - var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. - var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head) + var/metabolism_efficiency = 1 ///more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. + var/has_limbs = 0 ///does the mob have distinct limbs?(arms,legs, chest,head) var/list/pipes_shown = list() var/last_played_vent - var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. + var/smoke_delay = 0 ///used to prevent spam with smoke reagent reaction on mob. - var/bubble_icon = "default" //what icon the mob uses for speechbubbles - var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi + var/bubble_icon = "default" ///what icon the mob uses for speechbubbles + var/health_doll_icon ///if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi var/last_bumped = 0 - var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666) - var/numba = 0 //the id a mob gets when it's created + var/unique_name = 0 ///if a mob's name should be appended with an id when created e.g. Mob (666) + var/numba = 0 ///the id a mob gets when it's created - var/list/butcher_results = null //these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness - var/list/guaranteed_butcher_results = null //these will always be yielded from butchering - var/butcher_difficulty = 0 //effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier + var/list/butcher_results = null ///these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness + var/list/guaranteed_butcher_results = null ///these will always be yielded from butchering + var/butcher_difficulty = 0 ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier - var/hellbound = 0 //People who've signed infernal contracts are unrevivable. + var/hellbound = 0 ///People who've signed infernal contracts are unrevivable. var/list/weather_immunities = list() - var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added + var/stun_absorption = null ///converted to a list of stun absorption sources this mob has when one is added - var/blood_volume = 0 //how much blood the mob has - var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + var/blood_volume = 0 ///how much blood the mob has + var/obj/effect/proc_holder/ranged_ability ///Any ranged ability the mob has, as a click override - var/see_override = 0 //0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() + var/see_override = 0 ///0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() - var/list/status_effects //a list of all status effects the mob has + var/list/status_effects ///a list of all status effects the mob has var/druggy = 0 //Speech @@ -105,21 +109,21 @@ var/datum/riding/riding_datum - var/last_words //used for database logging + var/last_words ///used for database logging var/list/obj/effect/proc_holder/abilities = list() - var/can_be_held = FALSE //whether this can be picked up and held. + var/can_be_held = FALSE ///whether this can be picked up and held. - var/radiation = 0 //If the mob is irradiated. + var/radiation = 0 ///If the mob is irradiated. var/ventcrawl_layer = PIPING_LAYER_DEFAULT var/losebreath = 0 //List of active diseases - var/list/diseases = list() // list of all diseases in a mob + var/list/diseases = list() /// list of all diseases in a mob var/list/disease_resistances = list() - var/slowed_by_drag = TRUE //Whether the mob is slowed down when dragging another prone mob + var/slowed_by_drag = TRUE ///Whether the mob is slowed down when dragging another prone mob - var/list/ownedSoullinks //soullinks we are the owner of - var/list/sharedSoullinks //soullinks we are a/the sharer of + var/list/ownedSoullinks ///soullinks we are the owner of + var/list/sharedSoullinks ///soullinks we are a/the sharer of diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 4177109d16c..204cfb90f29 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) @@ -331,7 +328,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/proc/get_key(message) var/key = message[1] - if(key in GLOB.department_radio_prefixes) + if((key in GLOB.department_radio_prefixes) && length(message) > length(key) + 1) return lowertext(message[1 + length(key)]) /mob/living/proc/get_message_language(message) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0260e2ce78a..fef33432611 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -634,7 +634,7 @@ set category = "Malfunction" set name = "Choose Module" - malf_picker.use(src) + malf_picker.ui_interact(src) /mob/living/silicon/ai/proc/ai_statuschange() set category = "AI Commands" @@ -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/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 326f5136299..4e3f5359c11 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,10 +1,16 @@ -/mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone) - if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt. +/mob/living/silicon/ai/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/aiModule)) + var/obj/item/aiModule/MOD = W + if(!mind) //A player mind is required for law procs to run antag checks. + to_chat(user, "[src] is entirely unresponsive!") + return + MOD.install(laws, user) //Proc includes a success mesage so we don't need another one + return + if(W.force && W.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt. spark_system.start() return ..() - /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) if(!SSticker.HasRoundStarted()) to_chat(M, "You cannot attack people before the game has started.") diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 89a627ce9e5..07aa17ea900 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -135,7 +135,7 @@ /mob/living/silicon/pai/proc/process_hack() if(cable && cable.machine && istype(cable.machine, /obj/machinery/door) && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) - hackprogress = CLAMP(hackprogress + 4, 0, 100) + hackprogress = clamp(hackprogress + 4, 0, 100) else temp = "Door Jack: Connection to airlock has been lost. Hack aborted." hackprogress = 0 @@ -283,7 +283,7 @@ update_stat() /mob/living/silicon/pai/process() - emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) + emitterhealth = clamp((emitterhealth + emitterregen), -50, emittermaxhealth) /obj/item/paicard/attackby(obj/item/W, mob/user, params) ..() diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 65d9ff11745..3272173da24 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -74,7 +74,7 @@ return FALSE //No we're not flammable /mob/living/silicon/pai/proc/take_holo_damage(amount) - emitterhealth = CLAMP((emitterhealth - amount), -50, emittermaxhealth) + emitterhealth = clamp((emitterhealth - amount), -50, emittermaxhealth) if(emitterhealth < 0) fold_in(force = TRUE) to_chat(src, "The impact degrades your holochassis!") diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d071d6cf21d..aa148447b39 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -21,7 +21,7 @@ if(cell && cell.charge) if(cell.charge <= 100) uneq_all() - var/amt = CLAMP((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. + var/amt = clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick else uneq_all() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 89d4725e254..ada05cc9cfd 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -77,12 +77,12 @@ var/model = "" //The type of bot it is. var/bot_type = 0 //The type of bot it is, for radio control. var/data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC //The type of data HUD the bot uses. Diagnostic by default. - //This holds text for what the bot is mode doing, reported on the remote bot control interface. + //This holds text for what the bot is mode doing, reported on the remote bot control interface. This is in order of the defines for the mode defines in robots.dm, in order var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \ "Beginning Patrol", "Patrolling", "Summoned by PDA", \ "Cleaning", "Repairing", "Proceeding to work site", "Healing", \ "Proceeding to AI waypoint", "Navigating to Delivery Location", "Navigating to Home", \ - "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination") + "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination", "Chasing filth") var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path() var/path_image_icon = 'icons/mob/aibots.dmi' var/path_image_icon_state = "path_indicator" 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/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index fe24fa7ced8..c89748d6d1f 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -450,3 +450,43 @@ F.name = created_name qdel(I) qdel(src) + +//Get cleaned +/obj/item/bot_assembly/hygienebot + name = "incomplete hygienebot assembly" + desc = "Clear out the swamp once and for all" + icon = 'icons/obj/watercloset.dmi' + icon_state = "drone" + created_name = "Hygienebot" + +/obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, params) + . = ..() + switch(build_step) + if(ASSEMBLY_FIRST_STEP) + if(I.tool_behaviour == TOOL_WELDER) + if(I.use_tool(src, user, 0, volume=40)) + add_overlay("hs_hole") + to_chat(user, "You weld a water hole in [src]!") + build_step++ + + if(ASSEMBLY_SECOND_STEP) + if(!can_finish_build(I, user)) + return + if(istype(I, /obj/item/stack/ducts)) + var/obj/item/stack/ducts/D = I + if(D.get_amount() < 1) + to_chat(user, "You need one fluid duct to finish [src]") + return + to_chat(user, "You start to pipe up [src]...") + if(do_after(user, 40, target = src)) + if(D.get_amount() >= 1) + D.use(1) + to_chat(user, "You pipe up [src].") + build_step++ + else + return + var/mob/living/simple_animal/bot/hygienebot/H = new(drop_location()) + H.name = created_name + qdel(I) + qdel(src) + return TRUE diff --git a/code/modules/mob/living/simple_animal/bot/hygienebot.dm b/code/modules/mob/living/simple_animal/bot/hygienebot.dm new file mode 100644 index 00000000000..321d4828ce6 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm @@ -0,0 +1,254 @@ +//Cleanbot +/mob/living/simple_animal/bot/hygienebot + name = "\improper Hygienebot" + desc = "A flying cleaning robot, he'll chase down people who can't shower properly!" + icon = 'icons/obj/watercloset.dmi' + icon_state = "drone" + density = FALSE + anchored = FALSE + health = 100 + maxHealth = 100 + radio_key = /obj/item/encryptionkey/headset_service + radio_channel = RADIO_CHANNEL_SERVICE //Service + bot_type = HYGIENE_BOT + model = "Cleanbot" + bot_core_type = /obj/machinery/bot_core/hygienebot + window_id = "autoclean" + window_name = "Automatic Crew Cleaner X2" + pass_flags = PASSMOB + path_image_color = "#993299" + allow_pai = FALSE + layer = ABOVE_MOB_LAYER + + var/mob/living/carbon/human/target + var/currentspeed = 5 + var/washing = FALSE + var/mad = FALSE + var/last_found + var/oldtarget_name + + var/mutable_appearance/water_overlay + var/mutable_appearance/fire_overlay + +/mob/living/simple_animal/bot/hygienebot/Initialize() + . = ..() + update_icon() + var/datum/job/janitor/J = new/datum/job/janitor + access_card.access += J.get_access() + prev_access = access_card.access + +/mob/living/simple_animal/bot/hygienebot/explode() + walk_to(src,0) + visible_message("[src] blows apart in a foamy explosion!") + do_sparks(3, TRUE, src) + on = FALSE + new /obj/effect/particle_effect/foam(loc) + + ..() + +/mob/living/simple_animal/bot/hygienebot/Cross(atom/movable/AM) + . = ..() + if(washing) + do_wash(AM) + +/mob/living/simple_animal/bot/hygienebot/Crossed(atom/movable/AM) + . = ..() + if(washing) + do_wash(AM) + +/mob/living/simple_animal/bot/hygienebot/update_icon_state() + . = ..() + if(on) + icon_state = "drone-on" + else + icon_state = "drone" + + +/mob/living/simple_animal/bot/hygienebot/update_overlays() + . = ..() + if(on) + var/mutable_appearance/fire_overlay = mutable_appearance(icon,"flame") + . +=fire_overlay + + + if(washing) + var/mutable_appearance/water_overlay = mutable_appearance(icon, emagged ? "dronefire" : "dronewater") + . += water_overlay + + +/mob/living/simple_animal/bot/hygienebot/turn_off() + ..() + mode = BOT_IDLE + +/mob/living/simple_animal/bot/hygienebot/bot_reset() + ..() + target = null + oldtarget_name = null + walk_to(src,0) + last_found = world.time + + +/mob/living/simple_animal/bot/hygienebot/Crossed(atom/movable/AM) + . = ..() + if(washing) + do_wash(AM) + +/mob/living/simple_animal/bot/hygienebot/Moved() + . = ..() + if(washing && isturf(loc) && !emagged) + var/turf/open/OT = loc + OT.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) + +/mob/living/simple_animal/bot/hygienebot/handle_automated_action() + if(!..()) + return + + if(washing) + do_wash(loc) + for(var/AM in loc) + do_wash(AM) + if(isopenturf(loc) && !emagged) + var/turf/open/tile = loc + tile.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) + + switch(mode) + if(BOT_IDLE) // idle + walk_to(src,0) + look_for_lowhygiene() // see if any disgusting fucks are in range + if(!mode && auto_patrol) // still idle, and set to patrol + mode = BOT_START_PATROL // switch to patrol mode + + if(BOT_HUNT) // hunting for stinkman + // if can't reach stinkman for long enough, don't give up, try harder. + if(emagged) //lol fuck em up + currentspeed = 8 + start_washing() + mad = TRUE + else + switch(frustration) + if(0 to 4) + currentspeed = 5 + stop_washing() + mad = FALSE + if(4 to INFINITY) + currentspeed = 2.5 + start_washing() + mad = TRUE + if(target) + if(target.loc == loc && isturf(target.loc)) //LADIES AND GENTLEMAN WE GOTEM PREPARE TO DUMP + start_washing() + if(mad) + speak("Well about fucking time you degenerate", "Fucking finally", "Thank god, you finally stopped") + playsound(loc, 'sound/effects/hygienebot_angry.ogg', 60, 1) + mad = FALSE + mode = BOT_SHOWERSTANCE + else + var/turf/olddist = get_dist(src, target) + walk_to(src, target,0, currentspeed) + if(mad && prob(60)) + playsound(loc, 'sound/effects/hygienebot_angry.ogg', 60, 1) + speak(pick("Get back here you foul smelling fucker.", "If you don't get back here right now I'm going to give you a fucking vasectomy.", "STOP RUNNING OR I WILL CUT YOUR ARTERIES!", "Just fucking let me clean you you arsehole!", "STOP. RUNNING.", "Either you stop running or I will fucking drag you out of an airlock.", "I just want to fucking clean you you troglodyte.", "If you don't come back here I'll put a green cloud around you cunt.")) + if((get_dist(src, target)) >= (olddist)) + frustration++ + else + frustration = 0 + else + back_to_idle() + + if(BOT_SHOWERSTANCE) + if(check_purity(target)) + speak("Enjoy your clean and tidy day!") + playsound(loc, 'sound/effects/hygienebot_happy.ogg', 60, 1) + back_to_idle() + return + if(!target) + last_found = world.time + if(target.loc != loc && !isturf(target.loc)) + back_to_hunt() + + if(BOT_START_PATROL) + look_for_lowhygiene() + start_patrol() + + if(BOT_PATROL) + look_for_lowhygiene() + bot_patrol() + +/mob/living/simple_animal/bot/hygienebot/proc/back_to_idle() + mode = BOT_IDLE + walk_to(src,0) + target = null + frustration = 0 + last_found = world.time + stop_washing() + INVOKE_ASYNC(src, .proc/handle_automated_action) + +/mob/living/simple_animal/bot/hygienebot/proc/back_to_hunt() + frustration = 0 + mode = BOT_HUNT + stop_washing() + INVOKE_ASYNC(src, .proc/handle_automated_action) + +/mob/living/simple_animal/bot/hygienebot/proc/look_for_lowhygiene() + for (var/mob/living/carbon/human/H in view(7,src)) //Find the NEET + if((H.name == oldtarget_name) && (world.time < last_found + 100)) + continue + if(!check_purity(H)) //Theyre impure + target = H + oldtarget_name = H.name + speak("Unhygienic client found. Please stand still so I can clean you.") + playsound(loc, 'sound/effects/hygienebot_happy.ogg', 60, 1) + visible_message("[src] points at [H.name]!") + mode = BOT_HUNT + INVOKE_ASYNC(src, .proc/handle_automated_action) + break + else + continue + +/mob/living/simple_animal/bot/hygienebot/proc/start_washing() + washing = TRUE + update_icon() + +/mob/living/simple_animal/bot/hygienebot/proc/stop_washing() + washing = FALSE + update_icon() + + + +/mob/living/simple_animal/bot/hygienebot/get_controls(mob/user) + var/list/dat = list() + dat += hack(user) + dat += showpai(user) + dat += {" +Hygienebot X2 controls

+Status: ["[on ? "On" : "Off"]"]
+Behaviour controls are [locked ? "locked" : "unlocked"]
+Maintenance panel is [open ? "opened" : "closed"]"} + + if(!locked || issilicon(user) || IsAdminGhost(user)) + dat += {"
Auto Patrol: ["[auto_patrol ? "On" : "Off"]"]"} + + return dat.Join("") + +/mob/living/simple_animal/bot/hygienebot/proc/check_purity(mob/living/L) + if(emagged && L.stat != DEAD) + return FALSE + + for(var/X in list(ITEM_SLOT_HEAD, ITEM_SLOT_MASK, ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING, ITEM_SLOT_FEET)) + + var/obj/item/I = L.get_item_by_slot(X) + if(I && HAS_BLOOD_DNA(I)) + return FALSE + return TRUE + +/mob/living/simple_animal/bot/hygienebot/proc/do_wash(atom/A) + if(emagged) + A.fire_act() + return //lol pranked no cleaning besides that + else + A.washed(src) + + + +/obj/machinery/bot_core/hygienebot + req_one_access = list(ACCESS_JANITOR, ACCESS_ROBOTICS) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 222f10a9d3b..f8d8d5b882c 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -341,7 +341,7 @@ /mob/living/simple_animal/bot/medbot/examinate(atom/A as mob|obj|turf in view()) ..() - if(!is_blind(src)) + if(!is_blind()) chemscan(src, A) /mob/living/simple_animal/bot/medbot/proc/medicate_patient(mob/living/carbon/C) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index dba9a594849..136e85369a3 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -44,15 +44,17 @@ var/payment_department = ACCOUNT_SEC /mob/living/simple_animal/bot/secbot/beepsky - name = "Officer Beep O'sky" - desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." + name = "Commander Beep O'sky" + desc = "It's Commander Beep O'sky! Officially the superior officer of all bots on station, Beepsky remains as humble and dedicated to the law as the day he was first fabricated." idcheck = FALSE weaponscheck = FALSE auto_patrol = TRUE + commissioned = TRUE /mob/living/simple_animal/bot/secbot/beepsky/jr name = "Officer Pipsqueak" - desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak." + desc = "It's Commander Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak." + commissioned = FALSE /mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize() . = ..() 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/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index ca033eebdff..8a966ae7dec 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -165,7 +165,7 @@ /obj/effect/mob_spawn/human/corpse/nanotrasensoldier - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" id_job = "Private Security Force" id_access = "Security Officer" outfit = /datum/outfit/nanotrasensoldiercorpse2 diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index eda19be7af4..ee9fa2526bc 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -2,7 +2,7 @@ /mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = round(CLAMP(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION) + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION) if(updating_health) updatehealth() return amount 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..32ec8e5f55a 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 @@ -48,6 +49,8 @@ remove_gravity(i) /mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/add_gravity(atom/A, new_gravity = 2) + if(gravito_targets[A]) + return A.AddElement(/datum/element/forced_gravity, new_gravity) gravito_targets[A] = new_gravity RegisterSignal(A, COMSIG_MOVABLE_MOVED, .proc/__distance_check) 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/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 04020f22135..5f810bb1ef1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -159,6 +159,10 @@ beegent.reaction_mob(L, INJECT) L.reagents.add_reagent(beegent.type, rand(1,5)) +/mob/living/simple_animal/hostile/poison/bees/inject_poison(mob/living/L) + if(beegent && istype(L) && L.reagents) + beegent.reaction_mob(L, INJECT) + L.reagents.add_reagent(beegent.type, rand(1,5)) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) if(istype(R)) diff --git a/code/modules/mob/living/simple_animal/hostile/glockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm similarity index 69% rename from code/modules/mob/living/simple_animal/hostile/glockroach.dm rename to code/modules/mob/living/simple_animal/hostile/cockroach.dm index 495c6df2b42..f55fa50b2b5 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,29 +19,56 @@ 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 if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING)) + if(HAS_TRAIT(A, TRAIT_PACIFISM)) + A.visible_message("[A] carefully steps over [src].", "You carefully step over [src] to avoid hurting it.") + return if(prob(squish_chance)) A.visible_message("[A] squashed [src].", "You squashed [src].") adjustBruteLoss(1) //kills a normal cockroach @@ -64,6 +82,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/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 4a556a8197b..d982109feb6 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -10,10 +10,13 @@ /mob/living/simple_animal/hostile/poison/AttackingTarget() . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.reagents) - L.reagents.add_reagent(poison_type, poison_per_bite) + if(.) + inject_poison(target) + +/// Handles injecting the poison after successful attack +/mob/living/simple_animal/hostile/poison/proc/inject_poison(mob/living/L) + if(poison_type && istype(L) && L.reagents) + L.reagents.add_reagent(poison_type, poison_per_bite) //basic spider mob, these generally guard nests /mob/living/simple_animal/hostile/poison/giant_spider diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 674eeb50550..b842bddf20c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -45,7 +45,7 @@ wanted_objects = typecacheof(/obj/mecha/combat, TRUE) /mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" @@ -53,7 +53,7 @@ spawn_mecha_type = /obj/mecha/combat/marauder/loaded /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e09e85c4d51..d5b0495a5eb 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -107,8 +107,8 @@ Difficulty: Hard if(charging) return - anger_modifier = CLAMP(((maxHealth - health)/60),0,20) - enrage_time = initial(enrage_time) * CLAMP(anger_modifier / 20, 0.5, 1) + anger_modifier = clamp(((maxHealth - health)/60),0,20) + enrage_time = initial(enrage_time) * clamp(anger_modifier / 20, 0.5, 1) ranged_cooldown = world.time + 50 if(client) 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..8ea53032b44 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -88,7 +88,7 @@ Difficulty: Very Hard chosen_attack_num = 4 /mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + 120 if(client) @@ -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/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 8ba28edceaa..dca43d39498 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -104,7 +104,7 @@ Difficulty: Medium if(swooping) return - anger_modifier = CLAMP(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time if(client) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 3d029161889..d861184b3c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -485,7 +485,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall - anger_modifier = CLAMP(((maxHealth - health) / 42),0,50) + anger_modifier = clamp(((maxHealth - health) / 42),0,50) burst_range = initial(burst_range) + round(anger_modifier * 0.08) beam_range = initial(beam_range) + round(anger_modifier * 0.12) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm similarity index 94% rename from code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm rename to code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm index 64091a118e8..195363c2ba4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm @@ -56,9 +56,6 @@ Difficulty: Insanely Hard move_to_delay = 3 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 = 0 - - - var/stun_chance = 5 //chance per attack to Weaken target /mob/living/simple_animal/hostile/megafauna/king/ex_act(severity, target) @@ -78,6 +75,8 @@ Difficulty: Insanely Hard icon_state = "king_goat2" icon_living = "king_goat2" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4, /obj/item/clothing/head/goatpelt/king = 1) + achievement_type = /datum/award/achievement/boss/king_goat_kill + crusher_achievement_type = /datum/award/achievement/boss/king_goat_crusher health = 750 maxHealth = 750 armour_penetration = 50 @@ -85,15 +84,15 @@ Difficulty: Insanely Hard melee_damage_upper = 60 environment_smash = ENVIRONMENT_SMASH_RWALLS pixel_y = 5 - - var/spellscast = 0 + crusher_loot = list(/obj/item/crusher_trophy/king_goat) + stun_chance = 7 + var/spellscast = 0 //how many spells king goat can cast pr phase var/phase3 = FALSE var/sound_id = "goat" - var/special_attacks = 0 - var/list/rangers = list() + var/special_attacks = 0 //How many special attacks it can cast before he looses them which are passive attack buffs + var/list/rangers = list() //People in range of epic goat boss music var/current_song = 'sound/ambience/Visager-Battle.ogg' var/current_song_length = 1200 - stun_chance = 7 /mob/living/simple_animal/hostile/megafauna/king/phase2/Initialize() . = ..() @@ -166,7 +165,7 @@ Difficulty: Insanely Hard /mob/living/simple_animal/hostile/megafauna/king/phase2/Retaliate() set waitfor = FALSE ..() - if(spellscast < 10) + if(spellscast < 5) if(prob(5) && move_to_delay >= 3) //speed buff spellscast++ visible_message("\The [src] shimmers and seems to phase in and out of reality itself!") @@ -271,15 +270,15 @@ Difficulty: Insanely Hard continue L.stop_sound_channel(CHANNEL_JUKEBOX) if(move_to_delay < 3) - move_to_delay += 0.1 - if((health <= 150 && !phase3 && spellscast == 10) || (stat == DEAD && !phase3)) //begin phase 3, reset spell limit and heal + move_to_delay += 0.2 + if(!phase3 && ((health <= 150 && spellscast == 5) || stat == DEAD)) //begin phase 3, reset spell limit and heal phase3_transition() if(!.) return FALSE - if(special_attacks >= 10 && melee_damage_type != BRUTE) + if(special_attacks >= 5 && melee_damage_type != BRUTE) visible_message("The energy surrounding \the [src]'s horns dissipates.") melee_damage_type = BRUTE - if(special_attacks >= 10 && melee_damage_lower == 50) + if(special_attacks >= 5 && melee_damage_lower == 50) visible_message("The [src]' horns shrink back down to normal size.") melee_damage_lower = 40 diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index dc27b9c97a5..0827466bed1 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/nanotrasen - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." icon = 'icons/mob/simple_human.dmi' icon_state = "nanotrasen" diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 22e0a06f300..9db177f7107 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -21,20 +21,20 @@ var/phaser = TRUE var/datum/action/innate/creature/teleport/teleport var/is_phased = FALSE - + /mob/living/simple_animal/hostile/netherworld/Initialize() . = ..() if(phaser) teleport = new teleport.Grant(src) - + /datum/action/innate/creature background_icon_state = "bg_default" - + /datum/action/innate/creature/teleport name = "Teleport" desc = "Teleport to wherever you want, as long as you aren't seen." - + /obj/effect/dummy/phased_mob/creature name = "water" icon = 'icons/effects/effects.dmi' @@ -44,7 +44,7 @@ invisibility = 60 resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/canmove = TRUE - + /obj/effect/dummy/phased_mob/creature/relaymove(mob/user, direction) forceMove(get_step(src,direction)) @@ -56,7 +56,7 @@ /obj/effect/dummy/phased_mob/creature/singularity_act() return - + /datum/action/innate/creature/teleport/Activate() var/mob/living/simple_animal/hostile/netherworld/N = owner var/obj/effect/dummy/phased_mob/creature/holder = null @@ -80,7 +80,7 @@ holder = new /obj/effect/dummy/phased_mob/creature(T) N.forceMove(holder) N.is_phased = TRUE - + /mob/living/simple_animal/hostile/netherworld/proc/can_be_seen(turf/location) // Check for darkness if(location && location.lighting_object) @@ -96,14 +96,14 @@ for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) - if(!M.eye_blind) + if(!M.is_blind()) return M for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you if(M.occupant && M.occupant.client) - if(!M.occupant.eye_blind) + if(!M.occupant.is_blind()) return M.occupant return null - + /mob/living/simple_animal/hostile/netherworld/migo name = "mi-go" desc = "A pinkish, fungoid crustacean-like creature with numerous pairs of clawed appendages and a head covered with waving antennae." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm index 283e6959369..e0c2f0ddf60 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -28,7 +28,7 @@ footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" desc = "An officer part of Nanotrasen's private security force." icon = 'icons/mob/simple_human.dmi' icon_state = "nanotrasen" diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 798bd37fbc0..88e221d6224 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -129,11 +129,11 @@ for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) - if(!M.eye_blind) + if(!M.is_blind()) return M for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you if(M.occupant && M.occupant.client) - if(!M.occupant.eye_blind) + if(!M.occupant.is_blind()) return M.occupant return null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index dc674ba56ff..5977bfe68be 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -199,7 +199,7 @@ /mob/living/simple_animal/updatehealth() ..() - health = CLAMP(health, 0, maxHealth) + health = clamp(health, 0, maxHealth) /mob/living/simple_animal/update_stat() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 96619bf5ca0..8ccf1fb6e4f 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -192,7 +192,7 @@ step_away(M,src) M.Friends = Friends.Copy() babies += M - M.mutation_chance = CLAMP(mutation_chance+(rand(5,-5)),0,100) + M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) if(original_nanites) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e28be1677db..abc840fdbf8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -141,7 +141,7 @@ msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & MSG_VISUAL && eye_blind )//Vision related + if(type & MSG_VISUAL && is_blind() )//Vision related if(!alt_msg) return else @@ -154,7 +154,7 @@ else msg = alt_msg type = alt_type - if(type & MSG_VISUAL && eye_blind) + if(type & MSG_VISUAL && is_blind()) return // voice muffling if(stat == UNCONSCIOUS) @@ -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 @@ -411,7 +411,7 @@ // shift-click catcher may issue examinate() calls for out-of-sight turfs return - if(is_blind(src)) + if(is_blind()) to_chat(src, "Something is there but you can't see it!") return @@ -1103,7 +1103,7 @@ ///Can this mob read (is literate and not blind) /mob/proc/can_read(obj/O) - if(is_blind(src)) + if(is_blind()) to_chat(src, "As you are trying to read [O], you suddenly feel very stupid!") return if(!is_literate()) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 81aecc74996..8befdae13a4 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -122,7 +122,7 @@ * NB: contains nulls! * * held_items[active_hand_index] is the actively held item, but please use - * get_active_held_item() instead, because OOP + * [get_active_held_item()][/mob/proc/get_active_held_item] instead, because OOP */ var/list/held_items = list() @@ -195,7 +195,7 @@ var/memory_throttle_time = 0 - var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + var/list/alerts = list() /// contains [/obj/screen/alert only] // On /mob so clientless mobs will throw alerts properly var/list/screens = list() var/list/client_colours = list() var/hud_type = /datum/hud diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e9b6fd55368..85a5b6b3807 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -285,12 +285,9 @@ if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "[a_intent]" -///Checks if passed through item is blind -/proc/is_blind(A) - if(ismob(A)) - var/mob/B = A - return B.eye_blind - return FALSE +///Checks if the mob is able to see or not. eye_blind is temporary blindness, the trait is if they're permanently blind. +/mob/proc/is_blind() + return eye_blind ? TRUE : HAS_TRAIT(src, TRAIT_BLIND) ///Is the mob hallucinating? /mob/proc/hallucinating() diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index a1113001231..4cb0cbe892a 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -102,4 +102,4 @@ ///Adjust the body temperature of a mob, with min/max settings /mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY) if(bodytemperature >= min_temp && bodytemperature <= max_temp) - bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp) + bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index c7d1107f3c3..e5e522af641 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -12,10 +12,11 @@ var/obj/machinery/modular_computer/machinery_computer = null /obj/item/modular_computer/processor/Destroy() - . = ..() if(machinery_computer && (machinery_computer.cpu == src)) machinery_computer.cpu = null + machinery_computer.UnregisterSignal(src, COMSIG_ATOM_UPDATED_ICON) machinery_computer = null + . = ..() /obj/item/modular_computer/processor/New(comp) ..() diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 2bc34b1027c..17db77381a2 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -10,15 +10,19 @@ ui_x = 450 ui_y = 350 - var/game_active = TRUE //Checks to see if a game is in progress. - var/pause_state = FALSE //This disables buttons in order to prevent multiple actions before the opponent's actions. + ///Returns TRUE if the game is being played. + var/game_active = TRUE + ///This disables buttom actions from having any impact if TRUE. Resets to FALSE when the player is allowed to make an action again. + var/pause_state = FALSE var/boss_hp = 45 var/boss_mp = 15 var/player_hp = 30 var/player_mp = 10 var/ticket_count = 0 - var/heads_up = "Nanotrasen says, winners make us money."//Shows the active display text for the app + ///Shows what text is shown on the app, usually showing the log of combat actions taken by the player. + var/heads_up = "Nanotrasen says, winners make us money." var/boss_name = "Cuban Pete's Minion" + ///Determines which boss image to use on the UI. var/boss_id = 1 /datum/computer_file/program/arcade/proc/game_check(mob/user) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 93fa8a8aa66..7ac40123b5a 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -272,7 +272,7 @@ var/list/departments = target_dept if(is_centcom) - departments = list("Centcom" = get_all_centcom_jobs()) + departments = list("CentCom" = get_all_centcom_jobs()) else if(isnull(departments)) departments = list( CARDCON_DEPARTMENT_COMMAND = list("Captain"),//lol diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm index 31ac62d9fc5..ccce6c3af2b 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm @@ -15,4 +15,4 @@ /obj/item/throwing_star/ninja name = "ninja throwing star" throwforce = 30 - embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 100, "embedded_fall_chance" = 0) + embedding = list("pain_mult" = 6, "embed_chance" = 100, "fall_chance" = 0) diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm index b8e18fa465a..376e07aecfc 100644 --- a/code/modules/ninja/suit/ninjaDrainAct.dm +++ b/code/modules/ninja/suit/ninjaDrainAct.dm @@ -115,8 +115,7 @@ They *could* go in their appropriate files, but this is supposed to be modular update_icon() /obj/machinery/proc/AI_notify_hack() - var/turf/location = get_turf(src) - var/alertstr = "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]." + var/alertstr = "Network Alert: Hacking attempt detected[get_area(src)?" in [get_area_name(src, TRUE)]":". Unable to pinpoint location"]." for(var/mob/living/silicon/ai/AI in GLOB.player_list) to_chat(AI, alertstr) diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index bfe738a5bd6..64b211dac3e 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -21,7 +21,7 @@ Contents: resistance_flags = LAVA_PROOF | ACID_PROOF armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) strip_delay = 12 - + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT 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) //Important parts of the suit. @@ -71,7 +71,7 @@ Contents: //Cell Init cell = new/obj/item/stock_parts/cell/high - cell.charge = 60000 // larger as it now heats + cell.charge = 9000 cell.name = "black power cell" cell.icon_state = "bscell" @@ -79,6 +79,13 @@ Contents: /obj/item/clothing/suit/space/space_ninja/toggle_spacesuit_cell(mob/user) return +// Space Suit temperature regulation and power usage +/obj/item/clothing/suit/space/space_ninja/process() + var/mob/living/carbon/human/user = src.loc + if(!user || !ishuman(user) || !(user.wear_suit == src)) + return + user.adjust_bodytemperature(BODYTEMP_NORMAL - user.bodytemperature) + //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/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6f98b5f6036..b96bf4ede56 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -292,7 +292,7 @@ if(resistance_flags & ON_FIRE) return - if(is_blind(user)) + if(user.is_blind()) return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index f7a1aa14463..9de0f6d1f9b 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -27,6 +27,7 @@ var/colour = "black" //what colour the ink is! var/degrees = 0 var/font = PEN_FONT + embedding = list() /obj/item/pen/suicide_act(mob/user) user.visible_message("[user] is scribbling numbers all over [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit sudoku...") @@ -41,6 +42,7 @@ desc = "It's a normal red ink pen." icon_state = "pen_red" colour = "red" + throw_speed = 4 // red ones go faster (in this case, fast enough to embed!) /obj/item/pen/invisible desc = "It's an invisible pen marker." @@ -56,8 +58,10 @@ switch(colour) if("black") colour = "red" + throw_speed++ if("red") colour = "green" + throw_speed = initial(throw_speed) if("green") colour = "blue" else @@ -104,6 +108,7 @@ "Black and Silver" = "pen-fountain-b", "Command Blue" = "pen-fountain-cb" ) + embedding = list("embed_chance" = 75) /obj/item/pen/fountain/captain/Initialize() . = ..() @@ -217,7 +222,7 @@ w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) - embedding = embedding.setRating(embed_chance = EMBED_CHANCE) + embedding = list(embed_chance = EMBED_CHANCE) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE) to_chat(user, "[src] can now be concealed.") @@ -228,10 +233,11 @@ w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = embedding.setRating(embed_chance = 100) //rule of cool + embedding = list(embed_chance = 100) //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE) to_chat(user, "[src] is now active.") + AddElement(/datum/element/embed, embedding) update_icon() /obj/item/pen/edagger/update_icon_state() diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 62ff1f78950..be8005cfc6a 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -55,12 +55,12 @@ return var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num|null - + if (isnull(desired_y)) return - picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) - picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) + picture_size_x = min(clamp(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) + picture_size_y = min(clamp(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) /obj/item/camera/AltClick(mob/user) if(!user.canUseTopic(src, BE_CLOSE)) @@ -165,8 +165,8 @@ if(!isturf(target_turf)) blending = FALSE return FALSE - size_x = CLAMP(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) - size_y = CLAMP(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) + size_x = clamp(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) + size_y = clamp(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.") var/list/mobs_spotted = list() var/list/dead_spotted = list() @@ -186,7 +186,7 @@ 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) 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/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index 09ce731a747..3cd3099a4b9 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -41,9 +41,9 @@ return TRUE /obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - to_chat(user, "You start furiously plunging [name].") + to_chat(user, "You start furiously plunging [name].") if(do_after(user, 30, target = src)) - to_chat(user, "You finish plunging the [name].") + to_chat(user, "You finish plunging the [name].") reagents.reaction(get_turf(src), TOUCH) //splash on the floor reagents.clear_reagents() diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index d2bc505d7d1..0c1c099090d 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -91,15 +91,15 @@ switch(action) if("set_target_temperature") var/target = text2num(params["temperature"]) - target_temperature = CLAMP(target, 0, 1000) + target_temperature = clamp(target, 0, 1000) if("set_allowed_temperature_difference") var/target = text2num(params["temperature"]) - allowed_temperature_difference = CLAMP(target, 0, 1000) + allowed_temperature_difference = clamp(target, 0, 1000) if("toggle_power") enabled = !enabled if("change_volume") var/target = text2num(params["volume"]) - reagents.maximum_volume = CLAMP(round(target), 1, buffer) + reagents.maximum_volume = clamp(round(target), 1, buffer) #undef COOLING #undef HEATING diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 6731f2f3dcf..3cb51379ed1 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -92,9 +92,9 @@ . = TRUE switch(action) if("change_pill_style") - pill_number = CLAMP(text2num(params["id"]), 1 , PILL_STYLE_COUNT) + pill_number = clamp(text2num(params["id"]), 1 , PILL_STYLE_COUNT) if("change_pill_size") - pill_size = CLAMP(text2num(params["volume"]), minimum_pill, maximum_pill) + pill_size = clamp(text2num(params["volume"]), minimum_pill, maximum_pill) if("change_pill_name") var/new_name = html_encode(params["name"]) if(findtext(new_name, "pill")) //names like pillatron and Pilliam are thus valid 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/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm index 825f794a3d8..03bb680116f 100644 --- a/code/modules/plumbing/plumbers/splitters.dm +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -14,7 +14,7 @@ var/transfer_side = 5 //the maximum you can set the transfer to var/max_transfer = 9 - + ui_x = 220 ui_y = 105 @@ -42,7 +42,7 @@ switch(action) if("set_amount") var/direction = params["target"] - var/value = CLAMP(text2num(params["amount"]), 1, max_transfer) + var/value = clamp(text2num(params["amount"]), 1, max_transfer) switch(direction) if("straight") transfer_straight = value diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ccbe8a06461..675769dbd23 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -197,7 +197,7 @@ GLOB.apcs_list -= src if(malfai && operating) - malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE @@ -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") @@ -1374,7 +1374,7 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) - malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) operating = FALSE obj_break() if(occupier) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 67e77ab776f..f080a894523 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -206,7 +206,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/structure/cable/proc/surplus() if(powernet) - return CLAMP(powernet.avail-powernet.load, 0, powernet.avail) + return clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -222,7 +222,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/structure/cable/proc/delayed_surplus() if(powernet) - return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else return 0 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 271942a9906..892b62976e3 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -176,7 +176,7 @@ /obj/item/stock_parts/cell/proc/get_electrocute_damage() if(charge >= 1000) - return CLAMP(20 + round(charge/25000), 20, 195) + rand(-5,5) + return clamp(20 + round(charge/25000), 20, 195) + rand(-5,5) else return 0 @@ -370,7 +370,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - charge = CLAMP((charge-(10000/severity)),0,maxcharge) + charge = clamp((charge-(10000/severity)),0,maxcharge) /obj/item/stock_parts/cell/emergency_light name = "miniature power cell" diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 07cf134589b..34914b1c990 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -336,7 +336,7 @@ . = ..() if(on && status == LIGHT_OK) var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) - glowybit.alpha = CLAMP(light_power*250, 30, 200) + glowybit.alpha = clamp(light_power*250, 30, 200) . += glowybit // update the icon_state and luminosity of the light depending on its state diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4552bdc9346..f4b2208a5cb 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -47,7 +47,7 @@ /obj/machinery/power/proc/surplus() if(powernet) - return CLAMP(powernet.avail-powernet.load, 0, powernet.avail) + return clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -63,7 +63,7 @@ /obj/machinery/power/proc/delayed_surplus() if(powernet) - return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else return 0 @@ -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/powernet.dm b/code/modules/power/powernet.dm index 9660e8359c5..1a6a725e4e7 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -96,6 +96,6 @@ /datum/powernet/proc/get_electrocute_damage() if(avail >= 1000) - return CLAMP(20 + round(avail/25000), 20, 195) + rand(-5,5) + return clamp(20 + round(avail/25000), 20, 195) + rand(-5,5) else return 0 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/smes.dm b/code/modules/power/smes.dm index 3befc9d8271..0ef53491aae 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -229,7 +229,7 @@ /obj/machinery/power/smes/proc/chargedisplay() - return CLAMP(round(5.5*charge/capacity),0,5) + return clamp(round(5.5*charge/capacity),0,5) /obj/machinery/power/smes/process() if(machine_stat & BROKEN) @@ -381,7 +381,7 @@ target = text2num(target) . = TRUE if(.) - input_level = CLAMP(target, 0, input_level_max) + input_level = clamp(target, 0, input_level_max) log_smes(usr) if("output") var/target = params["target"] @@ -403,7 +403,7 @@ target = text2num(target) . = TRUE if(.) - output_level = CLAMP(target, 0, output_level_max) + output_level = clamp(target, 0, output_level_max) log_smes(usr) /obj/machinery/power/smes/proc/log_smes(mob/user) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index f0ef67dd92b..a82e3b946ab 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 @@ -169,7 +164,7 @@ else //dot product of sun and panel -- Lambert's Cosine Law . = cos(azimuth_current - sun_azimuth) - . = CLAMP(round(., 0.01), 0, 1) + . = clamp(round(., 0.01), 0, 1) sunfrac = . /obj/machinery/power/solar/process() @@ -390,7 +385,7 @@ if(adjust) value = azimuth_rate + adjust if(value != null) - azimuth_rate = round(CLAMP(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01) + azimuth_rate = round(clamp(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01) return TRUE return FALSE if(action == "tracking") @@ -468,7 +463,7 @@ ///Rotates the panel to the passed angles /obj/machinery/power/solar_control/proc/set_panels(azimuth) - azimuth = CLAMP(round(azimuth, 0.01), -360, 719.99) + azimuth = clamp(round(azimuth, 0.01), -360, 719.99) if(azimuth >= 360) azimuth -= 360 if(azimuth < 0) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 3f537e4364e..a3f9ad5356e 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 @@ -334,7 +336,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //We vary volume by power, and handle OH FUCK FUSION IN COOLING LOOP noises. if(power) - soundloop.volume = CLAMP((50 + (power / 50)), 50, 100) + soundloop.volume = clamp((50 + (power / 50)), 50, 100) if(damage >= 300) soundloop.mid_sounds = list('sound/machines/sm/loops/delamming.ogg' = 1) else @@ -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()) @@ -374,7 +375,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //((((some value between 0.5 and 1 * temp - ((273.15 + 40) * some values between 1 and 6)) * some number between 0.25 and knock your socks off / 150) * 0.25 //Heat and mols account for each other, a lot of hot mols are more damaging then a few //Mols start to have a positive effect on damage after 350 - damage = max(damage + (max(CLAMP(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) //Power only starts affecting damage when it is above 5000 damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0) //Molar count only starts affecting damage when it is above 1800 @@ -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) @@ -434,12 +436,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Given infinite time, powerloss_dynamic_scaling = co2comp //Some value between 0 and 1 if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && co2comp > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, or more then 20% co2 - powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling + CLAMP(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else - powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling - 0.05,0, 1) + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05,0, 1) //Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) //We take the mol count, and scale it to be our inhibitor - powerloss_inhibitor = CLAMP(1-(powerloss_dynamic_scaling * CLAMP(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) + powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) //Releases stored power into the general pool //We get this by consuming shit or being scalpeled @@ -499,7 +501,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) var/D = sqrt(1 / max(1, get_dist(l, src))) l.hallucination += power * config_hallucination_power * D - l.hallucination = CLAMP(l.hallucination, 0, 200) + l.hallucination = clamp(l.hallucination, 0, 200) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) @@ -513,12 +515,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Handle high power zaps/anomaly generation if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) //If the power is above 5000 or if the damage is above 550 if(removed && removed.temperature) - zap_cutoff = CLAMP(3000 - (power * (env.total_moles()) / 10) / env.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(3000 - (power * (env.total_moles()) / 10) / env.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols else zap_cutoff = 1500 //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details - var/range = CLAMP(power / env.return_pressure() * 10, 2, 8) + var/range = clamp(power / env.return_pressure() * 10, 2, 8) if(power > POWER_PENALTY_THRESHOLD) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) supermatter_zap(src, range, min(power*2, 20000)) @@ -529,7 +531,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) supermatter_zap(src, range, min(power*2, 20000)) else if (damage > damage_penalty_point && prob(20)) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) - supermatter_zap(src, range, CLAMP(power*2, 4000, 20000)) + supermatter_zap(src, range, clamp(power*2, 4000, 20000)) if(prob(15) && power > POWER_PENALTY_THRESHOLD) supermatter_pull(src, power/750) @@ -912,7 +914,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/obj/machinery/power/tesla_coil/coil = target //In the best situation we can expect this to grow up to 540kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN //The formula for power gen is zap_str * 15 / 2 * capacitor rating, between 1 and 4 - zap_str = coil.zap_act(zap_str * 15, ZAP_SUPERMATTER_FLAGS, list()) //Coils should take a lot out of the power of the zap + coil.zap_act(zap_str * 15, ZAP_SUPERMATTER_FLAGS, list()) //Coils should take a lot out of the power of the zap + zap_str /= 3 else if(istype(target, /obj/machinery/power/grounding_rod)) var/obj/machinery/power/grounding_rod/rod = target @@ -937,7 +940,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/turf/T = get_turf(target) var/pressure = max(1,T.return_air().return_pressure()) //We get our range with the strength of the zap and the pressure, the lower the former and the higher the latter the better - var/new_range = CLAMP(zap_str / pressure * 10, 2, 7) + var/new_range = clamp(zap_str / pressure * 10, 2, 7) if(prob(5)) zap_str = zap_str - (zap_str/10) supermatter_zap(target, new_range, zap_str, targets_copy) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 0e725b59d61..6e98ec3ac6b 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -13,7 +13,7 @@ circuit = /obj/item/circuitboard/machine/tesla_coil - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/power_loss = 2 var/input_power_multiplier = 1 var/zap_cooldown = 100 @@ -94,11 +94,9 @@ addtimer(CALLBACK(src, .proc/reset_shocked), 10) zap_buckle_check(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - if(!(zap_flags & ZAP_IS_TESLA)) - return power_produced - tesla_zap(src, 5, power_produced, zap_flags, shocked_targets) + return power_produced else - ..() + . = ..() /obj/machinery/power/tesla_coil/proc/zap() if((last_zap + zap_cooldown) > world.time || !powernet) @@ -134,11 +132,9 @@ addtimer(CALLBACK(src, .proc/reset_shocked), 10) zap_buckle_check(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - if(!(zap_flags & ZAP_IS_TESLA)) - return power_produced - tesla_zap(src, 5, power_produced, zap_flags, shocked_targets) + return power_produced else - ..() + . = ..() /obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) . = ..() @@ -193,5 +189,6 @@ if(anchored && !panel_open) flick("grounding_rodhit", src) zap_buckle_check(power) + return 0 else - ..() + . = ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 2ce2369f5b9..ea9692734b2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -60,12 +60,12 @@ pixel_x = 0 pixel_y = 0 - tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE) + tesla_zap(src, 7, TESLA_DEFAULT_POWER) pixel_x = -32 pixel_y = -32 for (var/ball in orbiting_balls) - var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7)) + var/range = rand(1, clamp(orbiting_balls.len, 3, 7)) tesla_zap(ball, range, TESLA_MINI_POWER/7*range) else energy = 0 // ensure we dont have miniballs of miniballs @@ -169,6 +169,8 @@ C.dust() /proc/tesla_zap(atom/source, zap_range = 3, power, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets) + if(QDELETED(source)) + return . = source.dir if(power < 1000) return @@ -181,7 +183,7 @@ var/obj/vehicle/ridden/bicycle/closest_million_dollar_baby var/obj/machinery/power/tesla_coil/closest_tesla_coil var/obj/machinery/power/grounding_rod/closest_grounding_rod - var/obj/vehicle/ridden/bicycle/closest_rideable + var/obj/vehicle/ridden/closest_rideable var/mob/living/closest_mob var/obj/machinery/closest_machine var/obj/structure/closest_structure @@ -207,7 +209,6 @@ /obj/machinery/gateway, /obj/structure/lattice, /obj/structure/grille, - /obj/machinery/the_singularitygen/tesla, /obj/structure/frame/machine)) for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types)) @@ -312,36 +313,43 @@ . = zapdir //per type stuff: + var/range = 3 if(!QDELETED(closest_million_dollar_baby)) - closest_million_dollar_baby.zap_act(power, zap_flags, shocked_targets) + power = closest_million_dollar_baby.zap_act(power, zap_flags, shocked_targets) else if(!QDELETED(closest_tesla_coil)) - closest_tesla_coil.zap_act(power, zap_flags, shocked_targets) + power = closest_tesla_coil.zap_act(power, zap_flags, shocked_targets) + range = 5 else if(!QDELETED(closest_grounding_rod)) - closest_grounding_rod.zap_act(power, zap_flags, shocked_targets) + power = closest_grounding_rod.zap_act(power, zap_flags, shocked_targets) else if(!QDELETED(closest_rideable)) - closest_rideable.zap_act(power, zap_flags, shocked_targets) + power = closest_rideable.zap_act(power, zap_flags, shocked_targets) else if(!QDELETED(closest_mob)) closest_mob.set_shocked() addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10) - var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0 + var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0 closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob if((zap_flags & ZAP_MOB_STUN) && (zap_flags & ZAP_MOB_DAMAGE)) S.emp_act(EMP_LIGHT) - tesla_zap(S, 7, power / 1.5, zap_flags, shocked_targets) // metallic folks bounce it further + range = 7 // metallic folks bounce it further else - tesla_zap(closest_mob, 5, power / 1.5, zap_flags, shocked_targets) + range = 5 + power /= 1.5 else if(!QDELETED(closest_machine)) - closest_machine.zap_act(power, zap_flags, shocked_targets) + power = closest_machine.zap_act(power, zap_flags, shocked_targets) else if(!QDELETED(closest_blob)) - closest_blob.zap_act(power, zap_flags, shocked_targets) + power = closest_blob.zap_act(power, zap_flags, shocked_targets) else if(!QDELETED(closest_structure)) - closest_structure.zap_act(power, zap_flags, shocked_targets) + power = closest_structure.zap_act(power, zap_flags, shocked_targets) + + tesla_zap(closest_mob, range, power, zap_flags, shocked_targets) + if(prob(20))//I know I know + tesla_zap(closest_mob, range, power / 2, zap_flags, shocked_targets) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 72b3d3264a6..dca92893bb0 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -31,9 +31,6 @@ resistance_flags = FIRE_PROOF CanAtmosPass = ATMOS_PASS_DENSITY circuit = /obj/item/circuitboard/machine/power_compressor - ui_x = 350 - ui_y = 280 - var/obj/machinery/power/turbine/turbine var/datum/gas_mixture/gas_contained var/turf/inturf @@ -59,6 +56,8 @@ resistance_flags = FIRE_PROOF CanAtmosPass = ATMOS_PASS_DENSITY circuit = /obj/item/circuitboard/machine/power_turbine + ui_x = 310 + ui_y = 150 var/opened = 0 var/obj/machinery/power/compressor/compressor var/turf/outturf @@ -82,10 +81,8 @@ if(!turbine) obj_break() - #define COMPFRICTION 5e5 - /obj/machinery/power/compressor/locate_machinery() if(turbine) return @@ -146,7 +143,6 @@ rpm = min(rpm, (COMPFRICTION*efficiency)/2) rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION*efficiency)) - if(starter && !(machine_stat & NOPOWER)) use_power(2800) if(rpm<1000) @@ -155,8 +151,6 @@ if(rpm<1000) rpmtarget = 0 - - if(rpm>50000) add_overlay(mutable_appearance(icon, "comp-o4", FLY_LAYER)) else if(rpm>10000) @@ -237,8 +231,6 @@ if(lastgen > 100) add_overlay(mutable_appearance(icon, "turb-o", FLY_LAYER)) - updateDialog() - /obj/machinery/power/turbine/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) return @@ -257,48 +249,37 @@ default_deconstruction_crowbar(I) -/obj/machinery/power/turbine/ui_interact(mob/user) +/obj/machinery/power/turbine/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, "turbine_computer", name, ui_x, ui_y, master_ui, state) + ui.open() - if(!Adjacent(user) || (machine_stat & (NOPOWER|BROKEN)) && !issilicon(user)) - user.unset_machine(src) - user << browse(null, "window=turbine") - return +/obj/machinery/power/turbine/ui_data(mob/user) + var/list/data = list() + data["compressor"] = compressor ? TRUE : FALSE + data["compressor_broke"] = (!compressor || (compressor.machine_stat & BROKEN)) ? TRUE : FALSE + data["turbine"] = compressor?.turbine ? TRUE : FALSE + data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & BROKEN)) ? TRUE : FALSE + data["online"] = compressor?.starter + data["power"] = DisplayPower(compressor?.turbine?.lastgen) + data["rpm"] = compressor?.rpm + data["temp"] = compressor?.gas_contained.temperature + return data - var/t = "Gas Turbine Generator
"
-
-	t += "Generated power : [DisplayPower(lastgen)]

" - - t += "Turbine: [round(compressor.rpm)] RPM
" - - t += "Starter: [ compressor.starter ? "Off On" : "Off On"]" - - t += "

Close" - - t += "
" - var/datum/browser/popup = new(user, "turbine", name) - popup.set_content(t) - popup.open() - - return - -/obj/machinery/power/turbine/Topic(href, href_list) +/obj/machinery/power/turbine/ui_act(action, params) if(..()) return - if( href_list["close"] ) - usr << browse(null, "window=turbine") - usr.unset_machine(src) - return - - else if( href_list["str"] ) - if(compressor) - compressor.starter = !compressor.starter - - updateDialog() - - - - + switch(action) + if("toggle_power") + if(compressor && compressor.turbine) + compressor.starter = !compressor.starter + . = TRUE + if("reconnect") + locate_machinery() + . = TRUE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -311,12 +292,11 @@ icon_screen = "turbinecomp" icon_keyboard = "tech_key" circuit = /obj/item/circuitboard/computer/turbine_computer + ui_x = 310 + ui_y = 150 var/obj/machinery/power/compressor/compressor var/id = 0 - ui_x = 300 - ui_y = 200 - /obj/machinery/computer/turbine_computer/Initialize() . = ..() return INITIALIZE_HINT_LATELOAD @@ -342,22 +322,20 @@ /obj/machinery/computer/turbine_computer/ui_data(mob/user) var/list/data = list() - data["compressor"] = compressor ? TRUE : FALSE data["compressor_broke"] = (!compressor || (compressor.machine_stat & BROKEN)) ? TRUE : FALSE data["turbine"] = compressor?.turbine ? TRUE : FALSE data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & BROKEN)) ? TRUE : FALSE data["online"] = compressor?.starter - data["power"] = DisplayPower(compressor?.turbine?.lastgen) data["rpm"] = compressor?.rpm data["temp"] = compressor?.gas_contained.temperature - return data /obj/machinery/computer/turbine_computer/ui_act(action, params) if(..()) return + switch(action) if("toggle_power") if(compressor && compressor.turbine) 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/energy.dm b/code/modules/projectiles/guns/energy.dm index 570e7566f8a..15238bfb3e8 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -175,7 +175,7 @@ ///Used by update_icon_state() and update_overlays() /obj/item/gun/energy/proc/get_charge_ratio() - return can_shoot() ? CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed. /obj/item/gun/energy/suicide_act(mob/living/user) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index caab66ade82..d8d45e093c8 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -214,13 +214,31 @@ /obj/item/gun/energy/wormhole_projector name = "bluespace wormhole projector" - desc = "A projector that emits high density quantum-coupled bluespace beams." + desc = "A projector that emits high density quantum-coupled bluespace beams. Requires a bluespace anomaly core to function." ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange) item_state = null icon_state = "wormhole_projector" var/obj/effect/portal/p_blue var/obj/effect/portal/p_orange var/atmos_link = FALSE + var/firing_core = FALSE + +/obj/item/gun/energy/wormhole_projector/attackby(obj/item/C, mob/user) + if(istype(C, /obj/item/assembly/signaler/anomaly/bluespace)) + to_chat(user, "You insert [C] into the wormhole projector and the weapon gently hums to life.") + firing_core = TRUE + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + qdel(C) + return + +/obj/item/gun/energy/wormhole_projector/can_shoot() + if(!firing_core) + return FALSE + return ..() + +/obj/item/gun/energy/wormhole_projector/shoot_with_empty_chamber(mob/living/user) + . = ..() + to_chat(user, "The display says, 'NO CORE INSTALLED'.") /obj/item/gun/energy/wormhole_projector/update_icon_state() icon_state = item_state = "[initial(icon_state)][select]" @@ -338,9 +356,25 @@ return /obj/item/gun/energy/gravity_gun - name = "one-point bluespace-gravitational manipulator" - desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity." + name = "one-point gravitational manipulator" + desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity. Requires a gravitational anomaly core to function." ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos) item_state = "gravity_gun" icon_state = "gravity_gun" var/power = 4 + var/firing_core = FALSE + +/obj/item/gun/energy/gravity_gun/attackby(obj/item/C, mob/user) + if(istype(C, /obj/item/assembly/signaler/anomaly/grav)) + to_chat(user, "You insert [C] into the gravitational manipulator and the weapon gently hums to life.") + firing_core = TRUE + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + qdel(C) + return + return ..() + +/obj/item/gun/energy/gravity_gun/can_shoot() + if(!firing_core) + return FALSE + return ..() + 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..5e5fa7a0c06 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -317,7 +317,7 @@ AC.sync_stats() /obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) - aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) + aiming_time_left = clamp(aiming_time_left + amount, 0, aiming_time) /obj/item/ammo_casing/energy/beam_rifle name = "particle acceleration lens" @@ -368,11 +368,11 @@ HS_BB.stun = projectile_stun HS_BB.impact_structure_damage = impact_structure_damage HS_BB.aoe_mob_damage = aoe_mob_damage - HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock + HS_BB.aoe_mob_range = clamp(aoe_mob_range, 0, 15) //Badmin safety lock HS_BB.aoe_fire_chance = aoe_fire_chance HS_BB.aoe_fire_range = aoe_fire_range HS_BB.aoe_structure_damage = aoe_structure_damage - HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock + HS_BB.aoe_structure_range = clamp(aoe_structure_range, 0, 15) //Badmin safety lock HS_BB.wall_devastate = wall_devastate HS_BB.wall_pierce_amount = wall_pierce_amount HS_BB.structure_pierce_amount = structure_piercing @@ -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.dm b/code/modules/projectiles/projectile.dm index 3155af49079..0d3d71bafe1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -136,6 +136,7 @@ /obj/projectile/proc/prehit(atom/target) return TRUE +/// Called when the projectile hits something /obj/projectile/proc/on_hit(atom/target, blocked = FALSE) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle) @@ -210,7 +211,7 @@ /obj/projectile/proc/vol_by_damage() if(src.damage) - return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 + return clamp((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume @@ -240,7 +241,7 @@ def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. if(isturf(A) && hitsound_wall) - var/volume = CLAMP(vol_by_damage() + 20, 0, 100) + var/volume = clamp(vol_by_damage() + 20, 0, 100) if(suppressed) volume = 5 playsound(loc, hitsound_wall, volume, TRUE, -1) @@ -379,7 +380,7 @@ stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") qdel(src) return - var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z) + var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) setAngle(Get_Angle(src, target)) original_angle = Angle if(!nondirectional_sprite) @@ -509,10 +510,10 @@ if(!homing_target) return FALSE var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) - PT.x += CLAMP(homing_offset_x, 1, world.maxx) - PT.y += CLAMP(homing_offset_y, 1, world.maxy) + PT.x += clamp(homing_offset_x, 1, world.maxx) + PT.y += clamp(homing_offset_y, 1, world.maxy) var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT)) - setAngle(Angle + CLAMP(angle, -homing_turn_speed, homing_turn_speed)) + setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed)) /obj/projectile/proc/set_homing_target(atom/A) if(!A || (!isturf(A) && !isturf(A.loc))) 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/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 041ecd21b4b..b858365445b 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -3,7 +3,7 @@ icon_state = "tesla_projectile" impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser var/chain - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/zap_range = 3 var/power = 10000 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index e277d68ba73..58c3ad9aadf 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -630,7 +630,7 @@ var/zap_power = 20000 var/zap_range = 15 - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE var/chain var/mob/living/caster diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index abe386a511e..88cd85f1c29 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) @@ -47,15 +46,25 @@ /////////////////////////////////////////////////////////////////////////////////// +/// Holder for a bunch of [/datum/reagent] /datum/reagents + /// The reagents being held var/list/datum/reagent/reagent_list = new/list() + /// Current volume of all the reagents var/total_volume = 0 + /// Max volume of this holder var/maximum_volume = 100 + /// The atom this holder is attached to var/atom/my_atom = null + /// Current temp of the holder volume var/chem_temp = 150 + /// unused var/last_tick = 1 + /// see [/datum/reagents/proc/metabolize] for usage var/addiction_tick = 1 + /// currently addicted reagents var/list/datum/reagent/addiction_list = new/list() + /// various flags, see code\__DEFINES\reagents.dm var/flags /datum/reagents/New(maximum=100, new_flags=0) @@ -83,8 +92,12 @@ my_atom.reagents = null my_atom = null -// Used in attack logs for reagents in pills and such -// external list is list of reagent types = amounts +/** + * Used in attack logs for reagents in pills and such + * + * Arguments: + * * external_list - list of reagent types = amounts + */ /datum/reagents/proc/log_list(external_list) if((external_list && !length(external_list)) || !length(reagent_list)) return "no reagents" @@ -100,6 +113,7 @@ //Using types because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. return english_list(data) +/// Remove an amount of reagents without caring about what they are /datum/reagents/proc/remove_any(amount = 1) var/list/cached_reagents = reagent_list var/total_transfered = 0 @@ -129,6 +143,7 @@ handle_reactions() return total_transfered //this should be amount unless the loop is prematurely broken, in which case it'll be lower. It shouldn't ever go OVER amount. +/// Removes all reagents from this holder /datum/reagents/proc/remove_all(amount = 1) var/list/cached_reagents = reagent_list if(total_volume > 0) @@ -141,6 +156,7 @@ handle_reactions() return amount +/// Get the name of the reagent there is the most of in this holder /datum/reagents/proc/get_master_reagent_name() var/list/cached_reagents = reagent_list var/name @@ -153,6 +169,7 @@ return name +/// Get the id of the reagent there is the most of in this holder /datum/reagents/proc/get_master_reagent_id() var/list/cached_reagents = reagent_list var/max_type @@ -165,6 +182,7 @@ return max_type +/// Get a reference to the reagent there is the most of in this holder /datum/reagents/proc/get_master_reagent() var/list/cached_reagents = reagent_list var/datum/reagent/master @@ -177,9 +195,22 @@ return master +/** + * Transfer some stuff from this holder to a target object + * + * Arguments: + * * obj/target - Target to attempt transfer to + * * amount - amount of reagent volume to transfer + * * multiplier - multiplies amount of each reagent by this number + * * preserve_data - if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + * * no_react - passed through to [/datum/reagents/proc/add_reagent] + * * mob/transfered_by - used for logging + * * remove_blacklisted - skips transferring of reagents with can_synth = FALSE + * * method - passed through to [/datum/reagents/proc/react_single] and [/datum/reagent/proc/on_transfer] + * * show_message - passed through to [/datum/reagents/proc/react_single] + * * round_robin - if round_robin=TRUE, so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors + */ /datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transfered_by, remove_blacklisted = FALSE, method = null, show_message = TRUE, round_robin = FALSE) - //if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - //if round_robin=TRUE, so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors var/list/cached_reagents = reagent_list if(!target || !total_volume) return @@ -247,6 +278,7 @@ src.handle_reactions() return amount +/// Copies the reagents to the target object /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) var/list/cached_reagents = reagent_list if(!target || !total_volume) @@ -278,6 +310,7 @@ src.handle_reactions() return amount +/// Transfer a specific reagent id to the target object /datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N var/list/cached_reagents = reagent_list if (!target) @@ -306,6 +339,14 @@ R.handle_reactions() return amount +/** + * Triggers metabolizing the reagents in this holder + * + * Arguments: + * * mob/living/carbon/C - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom] + * * can_overdose - Allows overdosing + * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing + */ /datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE) var/list/cached_reagents = reagent_list var/list/cached_addictions = addiction_list @@ -374,13 +415,14 @@ C.update_stamina() update_total() +/// Removes addiction to a specific reagent on [/datum/reagents/var/my_atom] /datum/reagents/proc/remove_addiction(datum/reagent/R) to_chat(my_atom, "You feel like you've gotten over your need for [R.name].") SEND_SIGNAL(my_atom, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") addiction_list.Remove(R) qdel(R) -//Signals that metabolization has stopped, triggering the end of trait-based effects +/// Signals that metabolization has stopped, triggering the end of trait-based effects /datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -395,6 +437,13 @@ R.metabolizing = FALSE R.on_mob_end_metabolize(C) +/** + * Calls [/datum/reagent/proc/on_move] on every reagent in this holder + * + * Arguments: + * * atom/A - passed to on_move + * * Running - passed to on_move + */ /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -402,6 +451,12 @@ R.on_move (A, Running) update_total() +/** + * Calls [/datum/reagent/proc/on_update] on every reagent in this holder + * + * Arguments: + * * atom/A - passed to on_update + */ /datum/reagents/proc/conditional_update(atom/A) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -409,6 +464,7 @@ R.on_update (A) update_total() +/// Handle any reactions possible in this holder /datum/reagents/proc/handle_reactions() if(flags & NO_REACT) return //Yup, no reactions here. No siree. @@ -521,7 +577,6 @@ ME2.name = "used slime extract" ME2.desc = "This extract has been used up." - my_atom?.on_reagent_change(REACT_REAGENTS) selected_reaction.on_reaction(src, multiplier) reaction_occurred = 1 @@ -529,6 +584,7 @@ update_total() return 0 +/// Remove every reagent except this one /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) @@ -537,6 +593,7 @@ del_reagent(R.type) update_total() +/// Fuck this one reagent /datum/reagents/proc/del_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) @@ -557,6 +614,7 @@ my_atom.on_reagent_change(DEL_REAGENT) return 1 +/// Updates [/datum/reagents/var/total_volume] /datum/reagents/proc/update_total() var/list/cached_reagents = reagent_list total_volume = 0 @@ -569,6 +627,7 @@ return 0 +/// Removes all reagents /datum/reagents/proc/clear_reagents() var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -578,6 +637,12 @@ my_atom.on_reagent_change(CLEAR_REAGENTS) return 0 +/** + * Applies the relevant reaction_ proc for every reagent in this holder + * * [/datum/reagent/proc/reaction_mob] + * * [/datum/reagent/proc/reaction_turf] + * * [/datum/reagent/proc/reaction_obj] + */ /datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) var/react_type if(isliving(A)) @@ -606,6 +671,7 @@ if("OBJ") R.reaction_obj(A, R.volume * volume_modifier, show_message) +/// Same as [/datum/reagents/proc/reaction] but only for one reagent /datum/reagents/proc/react_single(datum/reagent/R, atom/A, method = TOUCH, volume_modifier = 1, show_message = TRUE) var/react_type if(isliving(A)) @@ -631,12 +697,13 @@ if("OBJ") R.reaction_obj(A, R.volume * volume_modifier, show_message) +/// Is this holder full or not /datum/reagents/proc/holder_full() if(total_volume >= maximum_volume) return TRUE return FALSE -//Returns the average specific heat for all reagents currently in this holder. +/// Returns the average specific heat for all reagents currently in this holder. /datum/reagents/proc/specific_heat() . = 0 var/cached_amount = total_volume //cache amount @@ -647,8 +714,18 @@ /datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + chem_temp = clamp(chem_temp + (J / (S * total_volume)), 2.7, 1000) +/** + * Adds a reagent to this holder + * + * Arguments: + * * reagent - The reagent id to add + * * amount - Amount to add + * * list/data - Any reagent data for this reagent, used for transferring data with reagents + * * reagtemp - Temperature of this reagent, will be equalized + * * no_react - prevents reactions being triggered by this addition + */ /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount) || !amount) return FALSE @@ -714,11 +791,13 @@ handle_reactions() return TRUE -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) +/// Like add_reagent but you can enter a list. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) for(var/r_id in list_reagents) var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) +/// Remove a specific reagent /datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to if(isnull(amount)) @@ -738,7 +817,7 @@ if (R.type == reagent) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) + amount = clamp(amount, 0, R.volume) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to @@ -749,6 +828,7 @@ return FALSE +/// Check if this holder contains this reagent /datum/reagents/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) @@ -768,6 +848,7 @@ return 0 +/// Get the amount of this reagent /datum/reagents/proc/get_reagent_amount(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) @@ -777,6 +858,7 @@ return 0 +/// Get a comma separated string of every reagent name in this holder /datum/reagents/proc/get_reagents() var/list/names = list() var/list/cached_reagents = reagent_list @@ -786,7 +868,8 @@ return jointext(names, ",") -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. +/// Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) if(!isnum(amount)) return 1 var/list/cached_reagents = reagent_list @@ -809,7 +892,7 @@ return has_removed_reagent -//two helper functions to preserve data across reactions (needed for xenoarch) +/// helper function to preserve data across reactions (needed for xenoarch) /datum/reagents/proc/get_data(reagent_id) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -817,6 +900,7 @@ if(R.type == reagent_id) return R.data +/// helper function to preserve data across reactions (needed for xenoarch) /datum/reagents/proc/set_data(reagent_id, new_data) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -824,6 +908,7 @@ if(R.type == reagent_id) R.data = new_data +/// Shallow copies (deep copy of viruses) data from the provided reagent into our copy of that reagent /datum/reagents/proc/copy_data(datum/reagent/current_reagent) if(!current_reagent || !current_reagent.data) return null @@ -845,12 +930,18 @@ return trans_data +/// Get a reference to the reagent if it exists /datum/reagents/proc/get_reagent(type) var/list/cached_reagents = reagent_list . = locate(type) in cached_reagents +/** + * Returns what this holder's reagents taste like + * + * Arguments: + * * minimum_percent - the lower the minimum percent, the more sensitive the message is. + */ /datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. var/list/out = list() var/list/tastes = list() //descriptor = strength if(minimum_percent <= 100) @@ -894,6 +985,7 @@ return english_list(out, "something indescribable") +/// Applies heat to this holder /datum/reagents/proc/expose_temperature(temperature, coeff=0.02) if(istype(my_atom,/obj/item/reagent_containers)) var/obj/item/reagent_containers/RCs = my_atom @@ -913,8 +1005,13 @@ /////////////////////////////////////////////////////////////////////////////////// -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder +/** + * Convenience proc to create a reagents holder for an atom + * + * Arguments: + * * max_vol - maximum volume of holder + * * flags - flags to pass to the holder + */ /atom/proc/create_reagents(max_vol, flags) if(reagents) qdel(reagents) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 6dde3fa2fdd..408d79e2323 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -135,7 +135,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = CLAMP(target, 0, 1000) + target_temperature = clamp(target, 0, 1000) if("eject") on = FALSE replace_beaker(usr) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index a6fa79938c3..fd993154675 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -246,7 +246,7 @@ amount = text2num(input(usr, "Max 10. Buffer content will be split evenly.", "How many to make?", 1)) - amount = CLAMP(round(amount), 0, 10) + amount = clamp(round(amount), 0, 10) if (amount <= 0) return FALSE // Get units per item @@ -272,7 +272,7 @@ "Maximum [vol_each_max] units per item.", "How many units to fill?", vol_each_max)) - vol_each = CLAMP(vol_each, 0, vol_each_max) + vol_each = clamp(vol_each, 0, vol_each_max) if(vol_each <= 0) return FALSE // Get item name diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index b2f142a2071..59266b0c523 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -14,128 +14,175 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) //Toxin & acid reagents //Hydroponics stuff +/// A single reagent /datum/reagent + /// datums don't have names by default var/name = "Reagent" + /// nor do they have descriptions var/description = "" - var/specific_heat = SPECIFIC_HEAT_DEFAULT //J/(K*mol) + ///J/(K*mol) + var/specific_heat = SPECIFIC_HEAT_DEFAULT + /// used by taste messages var/taste_description = "metaphorical salt" - var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable - var/glass_name = "glass of ...what?" // use for specialty drinks. + ///how this taste compares to others. Higher values means it is more noticable + var/taste_mult = 1 + /// use for specialty drinks. + var/glass_name = "glass of ...what?" + /// desc applied to glasses with this reagent var/glass_desc = "You can't really tell what this is." - var/glass_icon_state = null // Otherwise just sets the icon to a normal glass with the mixture of the reagents in the glass. + /// Otherwise just sets the icon to a normal glass with the mixture of the reagents in the glass. + var/glass_icon_state = null + /// used for shot glasses, mostly for alcohol var/shot_glass_icon_state = null + /// reagent holder this belongs to var/datum/reagents/holder = null + /// LIQUID, SOLID, GAS var/reagent_state = LIQUID + /// special data associated with this like viruses etc var/list/data + /// increments everytime on_mob_life is called var/current_cycle = 0 - var/volume = 0 //pretend this is moles + ///pretend this is moles + var/volume = 0 + /// color it looks in containers etc var/color = "#000000" // rgb: 0, 0, 0 - var/can_synth = TRUE // can this reagent be synthesized? (for example: odysseus syringe gun) - var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob + /// can this reagent be synthesized? (for example: odysseus syringe gun) + var/can_synth = TRUE + ///how fast the reagent is metabolized by the mob + var/metabolization_rate = REAGENTS_METABOLISM + /// appears unused var/overrides_metab = 0 + /// above this overdoses happen var/overdose_threshold = 0 + /// above this amount addictions start var/addiction_threshold = 0 + /// increases as addiction gets worse var/addiction_stage = 0 - var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. + /// You fucked up and this is now triggering its overdose effects, purge that shit quick. + var/overdosed = 0 + ///if false stops metab in liverless mobs var/self_consuming = FALSE - var/reagent_weight = 1 //affects how far it travels when sprayed + ///affects how far it travels when sprayed + var/reagent_weight = 1 + ///is it currently metabolizing var/metabolizing = FALSE - var/harmful = FALSE //is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default. + /// is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default. + var/harmful = FALSE + /// 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 . = ..() holder = null +/// Applies this reagent to a [/mob/living] /datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) return 0 if(method == VAPOR) //smoke, foam, spray if(M.reagents) - var/modifier = CLAMP((1 - touch_protection), 0, 1) + var/modifier = clamp((1 - touch_protection), 0, 1) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) M.reagents.add_reagent(type, amount) return 1 +/// Applies this reagent to an [/obj] /datum/reagent/proc/reaction_obj(obj/O, volume) return +/// Applies this reagent to a [/turf] /datum/reagent/proc/reaction_turf(turf/T, volume) return +/// Called from [/datum/reagents/proc/metabolize] /datum/reagent/proc/on_mob_life(mob/living/carbon/M) current_cycle++ holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return -/datum/reagent/proc/on_transfer(atom/A, method=TOUCH, trans_volume) //Called after a reagent is transfered +///Called after a reagent is transfered +/datum/reagent/proc/on_transfer(atom/A, method=TOUCH, trans_volume) return -// Called when this reagent is first added to a mob +/// Called when this reagent is first added to a mob /datum/reagent/proc/on_mob_add(mob/living/L) return -// Called when this reagent is removed while inside a mob +/// Called when this reagent is removed while inside a mob /datum/reagent/proc/on_mob_delete(mob/living/L) return -// Called when this reagent first starts being metabolized by a liver +/// Called when this reagent first starts being metabolized by a liver /datum/reagent/proc/on_mob_metabolize(mob/living/L) return -// Called when this reagent stops being metabolized by a liver +/// Called when this reagent stops being metabolized by a liver /datum/reagent/proc/on_mob_end_metabolize(mob/living/L) return +/// Called by [/datum/reagents/proc/conditional_update_move] /datum/reagent/proc/on_move(mob/M) return -// Called after add_reagents creates a new reagent. +/// Called after add_reagents creates a new reagent. /datum/reagent/proc/on_new(data) return -// Called when two reagents of the same are mixing. +/// Called when two reagents of the same are mixing. /datum/reagent/proc/on_merge(data) return +/// Called by [/datum/reagents/proc/conditional_update] /datum/reagent/proc/on_update(atom/A) return -//called on expose_temperature +///called on expose_temperature /datum/reagent/proc/on_temp_change() return -// Called when the reagent container is hit by an explosion +/// Called when the reagent container is hit by an explosion /datum/reagent/proc/on_ex_act(severity) return -// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects +/// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects /datum/reagent/proc/overdose_process(mob/living/M) return +/// Called when an overdose starts /datum/reagent/proc/overdose_start(mob/living/M) to_chat(M, "You feel like you took too much of [name]!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) return +/// Called when addiction hits stage1, see [/datum/reagents/proc/metabolize] /datum/reagent/proc/addiction_act_stage1(mob/living/M) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name) if(prob(30)) to_chat(M, "You feel like having some [name] right about now.") return +/// Called when addiction hits stage2, see [/datum/reagents/proc/metabolize] /datum/reagent/proc/addiction_act_stage2(mob/living/M) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name) if(prob(30)) to_chat(M, "You feel like you need [name]. You just can't get enough.") return +/// Called when addiction hits stage3, see [/datum/reagents/proc/metabolize] /datum/reagent/proc/addiction_act_stage3(mob/living/M) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name) if(prob(30)) to_chat(M, "You have an intense craving for [name].") return +/// Called when addiction hits stage4, see [/datum/reagents/proc/metabolize] /datum/reagent/proc/addiction_act_stage4(mob/living/M) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name) if(prob(30)) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index f473bdfd21b..0b93f5f7533 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -233,7 +233,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(prob(5) && iscarbon(M)) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - if(HAS_TRAIT(M, TRAIT_BLIND)) + if(M.is_blind()) if(istype(eyes)) eyes.Remove(M) eyes.forceMove(get_turf(M)) @@ -1085,7 +1085,7 @@ All effects don't start immediately, but rather get worse over time; the rate is var/datum/antagonist/changeling/changeling = M.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) changeling.chem_charges += metabolization_rate - changeling.chem_charges = CLAMP(changeling.chem_charges, 0, changeling.chem_storage) + changeling.chem_charges = clamp(changeling.chem_charges, 0, changeling.chem_storage) return ..() /datum/reagent/consumable/ethanol/irishcarbomb @@ -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 4980c0f2a77..3376d68798b 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -6,32 +6,34 @@ /******BRUTE******/ /*Suffix: -bital*/ -/datum/reagent/medicine/C2/helbital //only REALLY a C2 if you heal the other damages but not being able to outright heal the other guys is close enough to damaging +/datum/reagent/medicine/C2/helbital //kinda a C2 only if you're not in hardcrit. name = "Helbital" - description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Burns, toxins, and asphyxition will increase healing but these damages must be maintained while the drug is being metabolized or the drug will react negatively." + description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." color = "#9400D3" taste_description = "cold and lifeless" overdose_threshold = 35 reagent_state = SOLID var/helbent = FALSE - var/beginning_combo = 0 var/reaping = FALSE -/datum/reagent/medicine/C2/helbital/on_mob_metabolize(mob/living/carbon/M) - beginning_combo = M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() //This DOES mean you can cure Tox/Oxy and then do burn to maintain the brute healing that way. - return ..() - /datum/reagent/medicine/C2/helbital/on_mob_life(mob/living/carbon/M) . = TRUE - var/cccombo = M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() - var/healed_this_iteration = FALSE - if(cccombo >= beginning_combo) - M.adjustBruteLoss(FLOOR(cccombo/-15,0.1)) //every 15 damage adds 1 per tick - healed_this_iteration = TRUE - else - M.adjustToxLoss((beginning_combo-cccombo)*0.1) //If you are just healing instead of converting the damage we'll KINDLY do it for you AND make it the most difficult! + var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss()) + var/thou_shall_heal = 0 + var/good_kind_of_healing = FALSE + switch(M.stat) + if(CONSCIOUS) //bad + thou_shall_heal = death_is_coming/50 + M.adjustOxyLoss(2, TRUE) + if(SOFT_CRIT) //meh convert + thou_shall_heal = round(death_is_coming/47,0.1) + M.adjustOxyLoss(1, TRUE) + else //no convert + thou_shall_heal = round(death_is_coming/45,0.1) + good_kind_of_healing = TRUE + M.adjustBruteLoss(-thou_shall_heal, FALSE) - if(healed_this_iteration && !reaping && prob(0.0001)) //janken with the grim reaper! + if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper! reaping = TRUE var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING)) @@ -89,6 +91,47 @@ ..() return TRUE +/datum/reagent/medicine/C2/probital + name = "Probital" + description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further." + reagent_state = SOLID + color = "#FFFF6B" + overdose_threshold = 20 + +/datum/reagent/medicine/C2/probital/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-2.25*REM, FALSE) + var/ooo_youaregettingsleepy = 3.5 + switch(round(M.getStaminaLoss())) + if(10 to 40) + ooo_youaregettingsleepy = 3 + if(41 to 60) + ooo_youaregettingsleepy = 2.5 + if(61 to 200) //you really can only go to 120 + ooo_youaregettingsleepy = 2 + M.adjustStaminaLoss(ooo_youaregettingsleepy*REM, FALSE) + ..() + . = TRUE + +/datum/reagent/medicine/C2/probital/overdose_process(mob/living/M) + M.adjustStaminaLoss(3*REM, 0) + if(M.getStaminaLoss() >= 80) + M.drowsyness++ + if(M.getStaminaLoss() >= 100) + to_chat(M,"You feel more tired than you usually do, perhaps if you rest your eyes for a bit...") + M.adjustStaminaLoss(-100, TRUE) + M.Sleeping(10 SECONDS) + ..() + . = TRUE + +/datum/reagent/medicine/C2/probital/on_transfer(atom/A, method=INGEST, trans_volume) + if(method != INGEST || !iscarbon(A)) + return + + A.reagents.remove_reagent(/datum/reagent/medicine/C2/probital, trans_volume * 0.05) + A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) + + ..() + /******BURN******/ /*Suffix: -uri*/ /datum/reagent/medicine/C2/lenturi @@ -125,6 +168,41 @@ ..() return TRUE +/datum/reagent/medicine/C2/hercuri + name = "Hercuri" + description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia." + reagent_state = LIQUID + color = "#F7FFA5" + overdose_threshold = 25 + reagent_weight = 0.6 + +/datum/reagent/medicine/C2/hercuri/on_mob_life(mob/living/carbon/M) + if(M.getFireLoss() > 50) + M.adjustFireLoss(-2*REM, FALSE) + else + M.adjustFireLoss(-1.25*REM, FALSE) + M.adjust_bodytemperature(rand(-25,-5)*(TEMPERATURE_DAMAGE_COEFFICIENT*REM), 50) + M.reagents?.chem_temp +=(-10*REM) + M.adjust_fire_stacks(-1) + ..() + . = TRUE + +/datum/reagent/medicine/C2/hercuri/reaction_mob(mob/living/carbon/M, method=VAPOR, reac_volume) + if(method != VAPOR) + return + + M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50) + M.adjust_fire_stacks(-reac_volume / 2) + if(reac_volume >= metabolization_rate) + M.ExtinguishMob() + + ..() + +/datum/reagent/medicine/C2/hercuri/overdose_process(mob/living/carbon/M) + M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly + ..() + + /******OXY******/ /*Suffix: -mol*/ #define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox @@ -344,7 +422,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("With most of the burnt off flesh replaced, [Carbies] looks a lot healthier.") + 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..e20191c3358 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) @@ -369,9 +369,10 @@ name = "Happiness" description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." reagent_state = LIQUID - color = "#FFF378" + color = "#EE35FF" addiction_threshold = 10 overdose_threshold = 20 + taste_description = "paint thinner" /datum/reagent/drug/happiness/on_mob_metabolize(mob/living/L) ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index ca70b354c48..e8d78fdaa69 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -205,7 +205,7 @@ var/mob/living/carbon/patient = M if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < TRESHOLD_UNHUSK) //One carp yields 12u rezadone. patient.cure_husk("burn") - patient.visible_message("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.") + patient.visible_message("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.") /datum/reagent/medicine/spaceacillin name = "Spaceacillin" @@ -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." @@ -1207,32 +1214,6 @@ ..() . = 1 -/datum/reagent/medicine/trophazole - name = "Trophazole" - description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides" - reagent_state = LIQUID - color = "#FFFF6B" - overdose_threshold = 20 - -/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment - ..() - . = 1 - -/datum/reagent/medicine/trophazole/overdose_process(mob/living/M) - M.adjustBruteLoss(3*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume) - if(method != INGEST || !iscarbon(A)) - return - - A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05) - A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) - - ..() - /datum/reagent/medicine/metafactor name = "Mitogen Metabolism Factor" description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." @@ -1249,36 +1230,6 @@ M.vomit() ..() -/datum/reagent/medicine/rhigoxane - name = "Rhigoxane" - description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires." - reagent_state = LIQUID - color = "#F7FFA5" - overdose_threshold = 25 - reagent_weight = 0.6 - -/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0.) - M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) - ..() - . = 1 - -/datum/reagent/medicine/rhigoxane/reaction_mob(mob/living/carbon/M, method=VAPOR, reac_volume) - if(method != VAPOR) - return - - M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 20, 200) - M.adjust_fire_stacks(-reac_volume / 2) - if(reac_volume >= metabolization_rate) - M.ExtinguishMob() - - ..() - -/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M) - M.adjustFireLoss(3*REM, 0.) - M.adjust_bodytemperature(-35 * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - ..() - /datum/reagent/medicine/silibinin name = "Silibinin" description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 3638ddb4d8c..ffffd95e74a 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" @@ -1920,9 +1932,9 @@ /datum/reagent/peaceborg/confuse/on_mob_life(mob/living/carbon/M) if(M.confused < 6) - M.confused = CLAMP(M.confused + 3, 0, 5) + M.confused = clamp(M.confused + 3, 0, 5) if(M.dizziness < 6) - M.dizziness = CLAMP(M.dizziness + 3, 0, 5) + M.dizziness = clamp(M.dizziness + 3, 0, 5) if(prob(20)) to_chat(M, "You feel confused and disoriented.") ..() @@ -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..136cd443c9a 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -3,45 +3,43 @@ /*****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) +/datum/chemical_reaction/probital + results = list(/datum/reagent/medicine/C2/probital = 4) + required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 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) +/datum/chemical_reaction/hercuri + results = list(/datum/reagent/medicine/C2/hercuri = 5) + required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) + required_temp = 47 + is_cold_recipe = TRUE + /*****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 +47,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..ad60d2f6776 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,242 +1,160 @@ /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) @@ -244,6 +162,3 @@ for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/medical/suture/medicated(location) return - - - 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..169caf3a93d 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) @@ -287,23 +244,19 @@ return holder.remove_reagent(/datum/reagent/sorium, created_volume*4) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(created_volume*4), 1, 6) + var/range = clamp(sqrt(created_volume*4), 1, 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 /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(created_volume), 1, 6) + var/range = clamp(sqrt(created_volume), 1, 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) @@ -312,23 +265,19 @@ return holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume*3) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(created_volume*3), 1, 6) + var/range = clamp(sqrt(created_volume*3), 1, 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 /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(created_volume/2), 1, 6) + var/range = clamp(sqrt(created_volume/2), 1, 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,29 +425,23 @@ 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 mix_message = "The teslium starts to spark as electricity arcs away from it!" mix_sound = 'sound/machines/defib_zap.ogg' - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN /datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, created_volume) var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. @@ -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..57b813f086c 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 @@ -168,7 +165,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related /obj/item/paper/secretrecipe name = "old recipe" - var/recipe_id = "secretsauce" + var/recipe_id = /datum/chemical_reaction/randomized/secret_sauce /obj/item/paper/secretrecipe/examine(mob/user) //Extra secret if(isobserver(user)) @@ -186,6 +183,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related var/datum/chemical_reaction/recipe = get_chemical_reaction(recipe_id) if(!recipe) info = "This recipe is illegible." + return var/list/dat = list("
    ") for(var/rid in recipe.required_reagents) var/datum/reagent/R = GLOB.chemical_reagents_list[rid] 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/reagents/reagent_containers/maunamug.dm b/code/modules/reagents/reagent_containers/maunamug.dm index a436b2014d4..39289d71c07 100644 --- a/code/modules/reagents/reagent_containers/maunamug.dm +++ b/code/modules/reagents/reagent_containers/maunamug.dm @@ -19,7 +19,7 @@ . = ..() . += "The status display reads: Current temperature: [reagents.chem_temp]K Current Charge:[cell ? "[cell.charge / cell.maxcharge * 100]%" : "No cell found"]." if(open) - . += "" + . += "The battery case is open." /obj/item/reagent_containers/glass/maunamug/process() ..() diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 13f29c06be2..5d803fe6bc0 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -218,12 +218,6 @@ list_reagents = list(/datum/reagent/drug/aranesp = 10) icon_state = "pill3" -/obj/item/reagent_containers/pill/happiness - name = "happiness pill" - desc = "It has a creepy smiling face on it." - icon_state = "pill_happy" - list_reagents = list(/datum/reagent/drug/happiness = 10) - /obj/item/reagent_containers/pill/floorpill name = "floorpill" desc = "A strange pill found in the depths of maintenance" @@ -246,11 +240,11 @@ list_reagents = list(/datum/reagent/medicine/potass_iodide = 15) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/trophazole - name = "trophazole pill" - desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'." +/obj/item/reagent_containers/pill/C2/probital + name = "Probital pill" + desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'. Causes fatigue and diluted with granibitaluri." icon_state = "pill12" - list_reagents = list(/datum/reagent/medicine/trophazole = 15) + list_reagents = list(/datum/reagent/medicine/C2/probital = 5, /datum/reagent/medicine/granibitaluri = 10) rename_with_volume = TRUE /obj/item/reagent_containers/pill/iron diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 1883878aac9..6867d8d4195 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -152,7 +152,7 @@ if(total_reagent_weight && amount_of_reagents) //don't bother if the container is empty - DIV/0 var/average_reagent_weight = total_reagent_weight / amount_of_reagents - spray_range = CLAMP(round((initial(spray_range) / average_reagent_weight) - ((amount_of_reagents - 1) * 1)), 3, 5) //spray distance between 3 and 5 tiles rounded down; extra reagents lose a tile + spray_range = clamp(round((initial(spray_range) / average_reagent_weight) - ((amount_of_reagents - 1) * 1)), 3, 5) //spray distance between 3 and 5 tiles rounded down; extra reagents lose a tile else spray_range = initial(spray_range) if(stream_mode == 0) @@ -406,8 +406,8 @@ item_state = "sprayer_med_blue" M.update_inv_hands() -/obj/item/reagent_containers/spray/rhigoxane - name = "medical spray (rhigoxane)" - desc = "A medical spray bottle.This one contains rhigoxane, it is used to treat burns and cool down temperature if applied with spray." +/obj/item/reagent_containers/spray/hercuri + name = "medical spray (hercuri)" + desc = "A medical spray bottle.This one contains hercuri, a medicine used to negate the effects of dangerous high-temperature environments. Careful not to freeze the patient!" icon_state = "sprayer_large" - list_reagents = list(/datum/reagent/medicine/rhigoxane = 100) + list_reagents = list(/datum/reagent/medicine/C2/hercuri = 100) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e444d7f2784..63ec7618bed 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -179,7 +179,7 @@ ///Used by update_icon() and update_overlays() /obj/item/reagent_containers/syringe/proc/get_rounded_vol() if(reagents && reagents.total_volume) - return CLAMP(round((reagents.total_volume / volume * 15),5), 1, 15) + return clamp(round((reagents.total_volume / volume * 15),5), 1, 15) else return 0 diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index d8573ee7030..86c3249cfb3 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -8,9 +8,15 @@ var/giftwrapped = FALSE var/sortTag = 0 var/obj/item/paper/note + var/obj/item/barcode/sticker /obj/structure/bigDelivery/interact(mob/user) + to_chat(user, "You start to unwrap the package...") + if(!do_after(user, 15, target = user)) + return playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) /obj/structure/bigDelivery/Destroy() @@ -31,6 +37,8 @@ else . += "There's a [note.name] attached to it..." . += note.examine(user) + if(sticker) + . += "There's a barcode attached to the side." /obj/structure/bigDelivery/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/destTagger)) @@ -78,11 +86,53 @@ overlaystring = copytext(overlaystring, 5) //5 == length("gift") + 1 add_overlay(overlaystring) + else if(istype(W, /obj/item/sales_tagger)) + var/obj/item/sales_tagger/tagger = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(tagger.payments_acc)) + to_chat(user, "Swipe an ID on [tagger] first!") + return + if(tagger.paper_count <= 0) + to_chat(user, "[tagger] is out of paper!") + return + user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].") + tagger.paper_count -= 1 + sticker = new /obj/item/barcode(src) + sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. + sticker.percent_cut = tagger.percent_cut //same, but for the percentage taken. + + var/list/wrap_contents = src.GetAllContents() + for(var/obj/I in wrap_contents) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext(overlaystring, 5) + add_overlay(overlaystring) + else if(istype(W, /obj/item/barcode)) + var/obj/item/barcode/stickerA = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(stickerA.payments_acc)) + to_chat(user, "This barcode seems to be invalid. Guess it's trash now.") + return + if(!user.transferItemToLoc(W, src)) + to_chat(user, "For some reason, you can't attach [W]!") + return + sticker = stickerA + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1 + add_overlay(overlaystring) + + else 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 @@ -93,11 +143,18 @@ to_chat(user, "You successfully removed [O]'s wrapping !") O.forceMove(loc) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. to_chat(user, "You fail to remove [O]'s wrapping!") +/obj/structure/bigDelivery/proc/unwrap_contents() + if(!sticker) + return + for(var/obj/I in src.GetAllContents()) + SEND_SIGNAL(I, COMSIG_STRUCTURE_UNWRAPPED) /obj/item/smallDelivery name = "parcel" @@ -108,17 +165,23 @@ var/giftwrapped = 0 var/sortTag = 0 var/obj/item/paper/note + var/obj/item/barcode/sticker /obj/item/smallDelivery/contents_explosion(severity, target) for(var/atom/movable/AM in contents) AM.ex_act() /obj/item/smallDelivery/attack_self(mob/user) + to_chat(user, "You start to unwrap the package...") + if(!do_after(user, 15, target = user)) + return user.temporarilyRemoveItemFromInventory(src, TRUE) + unwrap_contents() for(var/X in contents) var/atom/movable/AM = X user.put_in_hands(AM) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) qdel(src) /obj/item/smallDelivery/attack_self_tk(mob/user) @@ -133,6 +196,8 @@ var/atom/movable/AM = X AM.forceMove(src.loc) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) /obj/item/smallDelivery/examine(mob/user) @@ -143,6 +208,8 @@ else . += "There's a [note.name] attached to it..." . += note.examine(user) + if(sticker) + . += "There's a barcode attached to the side." /obj/item/smallDelivery/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/destTagger)) @@ -190,6 +257,54 @@ overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1 add_overlay(overlaystring) + else if(istype(W, /obj/item/sales_tagger)) + var/obj/item/sales_tagger/tagger = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(tagger.payments_acc)) + to_chat(user, "Swipe an ID on [tagger] first!") + return + if(tagger.paper_count <= 0) + to_chat(user, "[tagger] is out of paper!") + return + user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].") + tagger.paper_count -= 1 + sticker = new /obj/item/barcode(src) + sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. + sticker.percent_cut = tagger.percent_cut //as above, as before. + + var/list/wrap_contents = src.GetAllContents() + for(var/obj/I in wrap_contents) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext(overlaystring, 5) + add_overlay(overlaystring) + + else if(istype(W, /obj/item/barcode)) + var/obj/item/barcode/stickerA = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(stickerA.payments_acc)) + to_chat(user, "This barcode seems to be invalid. Guess it's trash now.") + return + if(!user.transferItemToLoc(W, src)) + to_chat(user, "For some reason, you can't attach [W]!") + return + sticker = stickerA + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1 + add_overlay(overlaystring) + +/obj/item/smallDelivery/proc/unwrap_contents() + if(!sticker) + return + for(var/obj/I in src.GetAllContents()) + SEND_SIGNAL(I, COMSIG_ITEM_UNWRAPPED) + /obj/item/destTagger name = "destination tagger" desc = "Used to set the destination of properly wrapped packages." @@ -197,7 +312,7 @@ icon_state = "cargotagger" var/currTag = 0 //Destinations are stored in code\globalvars\lists\flavor_misc.dm var/locked_destination = FALSE //if true, users can't open the destination tag window to prevent changing the tagger's current destination - w_class = WEIGHT_CLASS_TINY + w_class = WEIGHT_CLASS_TINY item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' @@ -243,3 +358,90 @@ var/n = text2num(href_list["nextTag"]) currTag = n openwindow(usr) + +/obj/item/sales_tagger + name = "sales tagger" + desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo. Ctrl-Click to clear the registered account." + icon = 'icons/obj/device.dmi' + icon_state = "salestagger" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + slot_flags = ITEM_SLOT_BELT + ///The account which is recieving the split profits. + var/datum/bank_account/payments_acc = null + var/paper_count = 10 + var/max_paper_count = 20 + ///Details the percentage the scanned account recieves off the final sale. + var/percent_cut = 20 + +/obj/item/sales_tagger/examine(mob/user) + . = ..() + . += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper." + . += "Profit split on sale is currently set to [percent_cut]%." + +/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/potential_acc = I + if(potential_acc.registered_account) + payments_acc = potential_acc.registered_account + playsound(src, 'sound/machines/ping.ogg', 40, TRUE) + to_chat(user, "[src] registers the ID card. Tag a wrapped item to create a barcode.") + else if(!potential_acc.registered_account) + to_chat(user, "This ID card has no account registered!") + return + else if(payments_acc != potential_acc.registered_account) + to_chat(user, "ID card already registered.") + if(istype(I, /obj/item/paper)) + if (!(paper_count >= max_paper_count)) + paper_count += 10 + qdel(I) + if (paper_count >= max_paper_count) + paper_count = max_paper_count + to_chat(user, "[src]'s paper supply is now full.") + return + to_chat(user, "You refill [src]'s paper supply, you have [paper_count] left.") + return + else + to_chat(user, "[src]'s paper supply is full.") + return + +/obj/item/sales_tagger/attack_self(mob/user) + . = ..() + if(paper_count <= 0) + to_chat(user, "You're out of paper!'.") + return + if(!payments_acc) + to_chat(user, "You need to swipe [src] with an ID card first.") + return + paper_count -= 1 + playsound(src, 'sound/machines/click.ogg', 40, TRUE) + to_chat(user, "You print a new barcode.") + var/obj/item/barcode/new_barcode = new /obj/item/barcode(src) + new_barcode.payments_acc = payments_acc //The sticker gets the scanner's registered account. + user.put_in_hands(new_barcode) + +/obj/item/sales_tagger/CtrlClick(mob/user) + . = ..() + payments_acc = null + to_chat(user, "You clear the registered account.") + +/obj/item/sales_tagger/AltClick(mob/user) + . = ..() + var/potential_cut = input("How much would you like to payout to the registered card?","Percentage Profit") as num|null + if(!potential_cut) + percent_cut = 50 + percent_cut = clamp(round(potential_cut, 1), 1, 50) + to_chat(user, "[percent_cut]% profit will be recieved if a package with a barcode is sold.") + +/obj/item/barcode + name = "Barcode tag" + desc = "A tiny tag, associated with a crewmember's account. Attach to a wrapped item to give that account a portion of the wrapped item's profit." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "barcode" + w_class = WEIGHT_CLASS_TINY + ///All values inheirited from the sales tagger it came from. + var/datum/bank_account/payments_acc = null + var/percent_cut = 5 diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 6e0b22e0118..79d8a1bfe2f 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) @@ -91,7 +92,7 @@ update_icon_state() say("Attempting to deposit 0 credits. Aborting.") return - deposit_value = CLAMP(round(deposit_value, 1), 1, 15000) + deposit_value = clamp(round(deposit_value, 1), 1, 15000) if(!account) say("Cannot find user account. Please swipe a valid ID.") return diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 9b4f4200bf7..b118c409e24 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -736,14 +736,6 @@ build_path = /obj/item/flamethrower/full category = list("hacked", "Security") -/datum/design/rpd - name = "Rapid Pipe Dispenser (RPD)" - id = "rpd" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500) - build_path = /obj/item/pipe_dispenser - category = list("hacked", "Construction") - /datum/design/electropack name = "Electropack" id = "electropack" @@ -880,6 +872,15 @@ build_path = /obj/item/destTagger category = list("initial", "Electronics") +/datum/design/salestagger + name = "Sales Tagger" + id = "salestagger" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 700, /datum/material/glass = 200) + build_path = /obj/item/sales_tagger + category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE + /datum/design/handlabeler name = "Hand Labeler" id = "handlabel" 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 91e3cf5ecb1..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." diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 3d552d1ca82..81e1ca3f2c4 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -560,3 +560,36 @@ build_path = /obj/item/construction/plumbing category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + + + +///////////////////////////////////////// +/////////////////Tape//////////////////// +///////////////////////////////////////// + +/datum/design/sticky_tape + name = "Sticky Tape" + id = "sticky_tape" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/sticky_tape + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/super_sticky_tape + name = "Super Sticky Tape" + id = "super_sticky_tape" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 3000) + build_path = /obj/item/stack/sticky_tape/super + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/pointy_tape + name = "Pointy Tape" + id = "pointy_tape" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1500, /datum/material/plastic = 1000) + build_path = /obj/item/stack/sticky_tape/pointy + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index f1d83a9e766..bb48b7676fc 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -33,6 +33,14 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/rpd + name = "Rapid Pipe Dispenser (RPD)" + id = "rpd_loaded" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500) + build_path = /obj/item/pipe_dispenser + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO /datum/design/rcd_loaded name = "Rapid Construction Device" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index a441ec0d773..abcb36795bb 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -248,7 +248,7 @@ /datum/design/wormhole_projector name = "Bluespace Wormhole Projector" - desc = "A projector that emits high density quantum-coupled bluespace beams." + desc = "A projector that emits high density quantum-coupled bluespace beams. Requires a bluespace anomaly core to function." id = "wormholeprojector" build_type = PROTOLATHE materials = list(/datum/material/silver = 2000, /datum/material/iron = 5000, /datum/material/diamond = 2000, /datum/material/bluespace = 3000) @@ -315,8 +315,8 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/gravitygun - name = "One-point Bluespace-gravitational Manipulator" - desc = "A multi-mode device that blasts one-point bluespace-gravitational bolts that locally distort gravity." + name = "One-point Gravitational Manipulator" + desc = "A multi-mode device that blasts one-point bluespace-gravitational bolts that locally distort gravity. Requires a gravitational anomaly core to function." id = "gravitygun" build_type = PROTOLATHE materials = list(/datum/material/silver = 8000, /datum/material/uranium = 8000, /datum/material/glass = 12000, /datum/material/iron = 12000, /datum/material/diamond = 3000, /datum/material/bluespace = 3000) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 5ba1e6a707e..295ad11a26c 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -522,10 +522,10 @@ use_power(500000) investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR) if(globalMalf == 99) - visible_message("[src] begins to glow and vibrate. It's going to blow!") + visible_message("[src] begins to glow and vibrate. It's going to blow!") addtimer(CALLBACK(src, .proc/boom), 50) if(globalMalf == 100) - visible_message("[src] begins to glow and vibrate. It's going to blow!") + visible_message("[src] begins to glow and vibrate. It's going to blow!") addtimer(CALLBACK(src, .proc/honk), 50) addtimer(CALLBACK(src, .proc/reset_exp), resetTime) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index be80d0eea38..efc10ae0ba3 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -73,7 +73,7 @@ materials.set_local_size(total_storage) var/total_rating = 1.2 for(var/obj/item/stock_parts/manipulator/M in component_parts) - total_rating = CLAMP(total_rating - (M.rating * 0.1), 0, 1) + total_rating = clamp(total_rating - (M.rating * 0.1), 0, 1) if(total_rating == 0) efficiency_coeff = INFINITY else @@ -136,7 +136,7 @@ say("Mineral access is on hold, please contact the quartermaster.") return FALSE var/power = 1000 - amount = CLAMP(amount, 1, 50) + amount = clamp(amount, 1, 50) for(var/M in D.materials) power += round(D.materials[M] * amount / 35) power = min(3000, power) diff --git a/code/modules/research/nanites/extra_settings/number.dm b/code/modules/research/nanites/extra_settings/number.dm index 6e63ae067ed..75489635f55 100644 --- a/code/modules/research/nanites/extra_settings/number.dm +++ b/code/modules/research/nanites/extra_settings/number.dm @@ -16,7 +16,7 @@ value = text2num(value) if(!value || !isnum(value)) return - src.value = CLAMP(value, min, max) + src.value = clamp(value, min, max) /datum/nanite_extra_setting/number/get_copy() return new /datum/nanite_extra_setting/number(value, min, max, unit) diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm index 69809f80cc0..79ccee7555c 100644 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ b/code/modules/research/nanites/nanite_chamber_computer.dm @@ -72,14 +72,14 @@ if("set_safety") var/threshold = text2num(params["value"]) if(!isnull(threshold)) - chamber.set_safety(CLAMP(round(threshold, 1),0,500)) + chamber.set_safety(clamp(round(threshold, 1),0,500)) playsound(src, "terminal_type", 25, FALSE) chamber.occupant.investigate_log("'s nanites' safety threshold was set to [threshold] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE if("set_cloud") var/cloud_id = text2num(params["value"]) if(!isnull(cloud_id)) - chamber.set_cloud(CLAMP(round(cloud_id, 1),0,100)) + chamber.set_cloud(clamp(round(cloud_id, 1),0,100)) playsound(src, "terminal_type", 25, FALSE) chamber.occupant.investigate_log("'s nanites' cloud id was set to [cloud_id] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 1a11e1ecdfa..0a9f48021cb 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) @@ -174,7 +174,7 @@ var/cloud_id = new_backup_id if(!isnull(cloud_id)) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - cloud_id = CLAMP(round(cloud_id, 1),1,100) + cloud_id = clamp(round(cloud_id, 1),1,100) generate_backup(cloud_id, usr) . = TRUE if("delete_backup") @@ -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_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index f84f8247ee6..68d87bc02e2 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -86,13 +86,13 @@ var/target_code = params["target_code"] switch(target_code) if("activation") - program.activation_code = CLAMP(round(new_code, 1),0,9999) + program.activation_code = clamp(round(new_code, 1),0,9999) if("deactivation") - program.deactivation_code = CLAMP(round(new_code, 1),0,9999) + program.deactivation_code = clamp(round(new_code, 1),0,9999) if("kill") - program.kill_code = CLAMP(round(new_code, 1),0,9999) + program.kill_code = clamp(round(new_code, 1),0,9999) if("trigger") - program.trigger_code = CLAMP(round(new_code, 1),0,9999) + program.trigger_code = clamp(round(new_code, 1),0,9999) . = TRUE if("set_extra_setting") program.set_extra_setting(params["target_setting"], params["value"]) @@ -102,7 +102,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_restart = timer . = TRUE @@ -110,7 +110,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_shutdown = timer . = TRUE @@ -118,7 +118,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_trigger = timer . = TRUE @@ -126,7 +126,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_trigger_delay = timer . = TRUE diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index 69b9411a2a8..16f87bc6bde 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -84,7 +84,7 @@ /datum/nanite_program/explosive/on_trigger(comm_message) host_mob.visible_message("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow...",\ "You start emitting a high-pitched buzzing, and your skin begins to glow...") - addtimer(CALLBACK(src, .proc/boom), CLAMP((nanites.nanite_volume * 0.35), 25, 150)) + addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150)) /datum/nanite_program/explosive/proc/boom() var/nanite_amount = nanites.nanite_volume diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 71aecc8f2cd..0d9361b5348 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -106,7 +106,7 @@ return var/new_code = text2num(params["code"]) if(!isnull(new_code)) - new_code = CLAMP(round(new_code, 1),0,9999) + new_code = clamp(round(new_code, 1),0,9999) code = new_code . = TRUE if("set_relay_code") @@ -114,7 +114,7 @@ return var/new_code = text2num(params["code"]) if(!isnull(new_code)) - new_code = CLAMP(round(new_code, 1),0,9999) + new_code = clamp(round(new_code, 1),0,9999) relay_code = new_code . = TRUE if("update_name") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 2259f92280f..54095e6b354 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -8,7 +8,7 @@ display_name = "Basic Research Technology" description = "NT default research technologies." // Default research tech, prevents bricking - design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap", + design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "salestagger", "handlabel", "packagewrap", "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "bucket", "sec_rshot", "sec_beanbag_slug", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "rglass", "plasteel", "plastitanium", "plasmaglass", "plasmareinforcedglass", "titaniumglass", "plastitaniumglass", "plastic_knife", "plastic_fork", "plastic_spoon") @@ -153,7 +153,7 @@ display_name = "Advanced Engineering" description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "rcd_loaded") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "rcd_loaded", "rpd_loaded") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1132,6 +1132,43 @@ 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 + +/datum/techweb_node/sticky_basic + id = "sticky_basic" + display_name = "Basic Sticky Technology" + description = "The only thing left to do after researching this tech is to start printing out a bunch of 'kick me' signs." + prereq_ids = list("base") + design_ids = list("sticky_tape") + + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + hidden = TRUE + experimental = TRUE + +// Can be researched after getting the basic sticky technology from the BEPIS major reward +/datum/techweb_node/sticky_advanced + id = "sticky_advanced" + display_name = "Advanced Sticky Technology" + description = "Taking a good joke too far? Nonsense!" + prereq_ids = list("sticky_basic") + design_ids = list("super_sticky_tape", "pointy_tape") + + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 2500 + hidden = 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/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 2c265031e13..3853f076cdb 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -11,12 +11,12 @@ throw_speed = 3 throw_range = 6 grind_results = list() - var/Uses = 1 // uses before it goes inert - var/qdel_timer = null // deletion timer, for delayed reactions - var/effectmod - var/list/activate_reagents = list() //Reagents required for activation + var/Uses = 1 ///uses before it goes inert + var/qdel_timer = null ///deletion timer, for delayed reactions + var/effectmod ///Which type of crossbred + var/list/activate_reagents = list() ///Reagents required for activation var/recurring = FALSE - var/research //Research point value + var/research ///Research point value for slime cores. These are defines stored in [/__DEFINES/research] - the actual values are updated there. /obj/item/slime_extract/examine(mob/user) . = ..() @@ -45,12 +45,24 @@ if(Uses) grind_results[/datum/reagent/toxin/slimejelly] = 20 -//Effect when activated by a Luminescent. Separated into a minor and major effect. Returns cooldown in deciseconds. +/** +* Effect when activated by a Luminescent. +* +* This proc is called whenever a Luminescent consumes a slime extract. Each one is separated into major and minor effects depending on the extract. Cooldown is measured in deciseconds. +* +* * arg1 - The mob absorbing the slime extract. +* * arg2 - The valid species for the absorbtion. Should always be a Luminescent unless something very major has changed. +* * arg3 - Whether or not the activation is major or minor. Major activations have large, complex effects, minor are simple. +*/ /obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) to_chat(user, "Nothing happened... This slime extract cannot be activated this way.") return 0 -//Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. +/** +* Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. +* +* By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross. +*/ /obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) return ..() @@ -628,6 +640,16 @@ ////Slime-derived potions/// +/** +* #Slime potions +* +* Feed slimes potions either by hand or using the slime console. +* +* Slime potions either augment the slime's behavior, its extract output, or its intelligence. These all come either from extract effects or cross cores. +* A few of the more powerful ones can modify someone's equipment or gender. +* New ones should probably be accessible only through cross cores as all the normal core types already have uses. Rule of thumb is 'stronger effects go in cross cores'. +*/ + /obj/item/slimepotion name = "slime potion" desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." @@ -827,7 +849,7 @@ return to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = CLAMP(M.mutation_chance-15,0,100) + M.mutation_chance = clamp(M.mutation_chance-15,0,100) qdel(src) /obj/item/slimepotion/slime/mutator @@ -851,7 +873,7 @@ return to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") - M.mutation_chance = CLAMP(M.mutation_chance+12,0,100) + M.mutation_chance = clamp(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) @@ -1001,6 +1023,8 @@ imp.implant(M, user) qdel(src) +///Definitions for slime products that don't have anywhere else to go (Floor tiles, blueprints). + /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" diff --git a/code/modules/ruins/lavalandruin_code/kinggoat.dm b/code/modules/ruins/lavalandruin_code/kinggoat.dm index 72518dff292..3e889a836f4 100644 --- a/code/modules/ruins/lavalandruin_code/kinggoat.dm +++ b/code/modules/ruins/lavalandruin_code/kinggoat.dm @@ -1,5 +1,6 @@ /turf/open/indestructible/gold name = "gold floor" + initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/gold icon_state = "gold" tiled_dirt = FALSE @@ -7,6 +8,7 @@ /turf/open/indestructible/diamond name = "diamond floor" + initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/diamond icon_state = "diamond" tiled_dirt = FALSE @@ -34,7 +36,7 @@ /obj/item/gun/energy/goatgun name = "goat gun" desc = "Whoever you fire this at is gonna be in for a baaaaaaad surprise." //ha ha I am funny man please laugh HAHAHAHAHAHAHAHA - icon_state = "meteor_gun" + icon_state = "goat_gun" item_state = "c20r" w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/goat) diff --git a/code/modules/ruins/spaceruin_code/TheDerelict.dm b/code/modules/ruins/spaceruin_code/TheDerelict.dm index 5d9dd2b25f5..81aa4dcadf8 100644 --- a/code/modules/ruins/spaceruin_code/TheDerelict.dm +++ b/code/modules/ruins/spaceruin_code/TheDerelict.dm @@ -76,7 +76,7 @@ ///Tries to charge from powernet excess, no upper limit except max charge. /obj/machinery/computer/vaultcontroller/proc/attempt_siphon() - var/surpluspower = CLAMP(attached_cable.surplus(), 0, (siphon_max - siphoned_power)) + var/surpluspower = clamp(attached_cable.surplus(), 0, (siphon_max - siphoned_power)) if(surpluspower) attached_cable.add_load(surpluspower) siphoned_power += surpluspower 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/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index a19c932fa42..133f76b4fba 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -44,6 +44,10 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) /obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + var/area/currentArea = get_area(src) + if(currentArea.type == /area/ruin/powered/kinggoat_arena) + to_chat(user, "[src] fizzles uselessly.") + return if(!chosenRoomNumber) return if(chosenRoomNumber > SHORT_REAL_LIMIT) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 31b415e0da6..ee639ab7d92 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -17,7 +17,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF ui_x = 375 ui_y = 125 - + var/datum/callback/ev var/event = "" var/obj/machinery/keycard_auth/event_source @@ -105,10 +105,10 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) message_admins("[ADMIN_LOOKUPFLW(triggerer)] triggered and [ADMIN_LOOKUPFLW(confirmer)] confirmed event [event]") var/area/A1 = get_area(triggerer) - deadchat_broadcast(" triggered [event] at [A1.name].", "[triggerer]", triggerer) + deadchat_broadcast(" triggered [event] at [A1.name].", "[triggerer]", triggerer, message_type=DEADCHAT_ANNOUNCEMENT) var/area/A2 = get_area(confirmer) - deadchat_broadcast(" confirmed [event] at [A2.name].", "[confirmer]", confirmer) + deadchat_broadcast(" confirmed [event] at [A2.name].", "[confirmer]", confirmer, message_type=DEADCHAT_ANNOUNCEMENT) switch(event) if(KEYCARD_RED_ALERT) set_security_level(SEC_LEVEL_RED) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e9bdf785464..f107963ac8a 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" @@ -832,13 +832,13 @@ var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default if(initial_engines > 0) change_per_engine = (1 - ENGINE_COEFF_MIN) / initial_engines // or however many it had - return CLAMP(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return clamp(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) if(new_value < initial_engines) var/delta = initial_engines - new_value var/change_per_engine = 1 //doesn't really matter should not be happening for 0 engine shuttles if(initial_engines > 0) change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay - return CLAMP(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) /obj/docking_port/mobile/proc/in_flight() diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index c8e6d40eed2..07165a2623b 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -101,7 +101,7 @@ action_icon_state = "lightning0" sound = 'sound/magic/lightningbolt.ogg' active = FALSE - projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE | ZAP_IS_TESLA) + projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) active_msg = "You energize your hand with arcane lightning!" deactive_msg = "You let the energy flow out of your hands back into yourself..." projectile_type = /obj/projectile/magic/aoe/lightning diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/curse.dm index 0ac35f8908e..3217fe07a67 100644 --- a/code/modules/spells/spell_types/curse.dm +++ b/code/modules/spells/spell_types/curse.dm @@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE) GLOB.curse_of_madness_triggered = message // So latejoiners are also afflicted. - deadchat_broadcast("A Curse of Madness has stricken the station, shattering their minds with the awful secret: \"[message]\"") + deadchat_broadcast("A Curse of Madness has stricken the station, shattering their minds with the awful secret: \"[message]\"", message_type=DEADCHAT_ANNOUNCEMENT) for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == DEAD) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 6f2513c9050..5cf7e7e1e50 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -4,10 +4,10 @@ var/catchphrase = "High Five!" var/on_use_sound = null var/obj/effect/proc_holder/spell/targeted/touch/attached_spell - icon = 'icons/obj/balloons.dmi' + icon = 'icons/obj/items_and_weapons.dmi' lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi' - icon_state = "syndballoon" + icon_state = "latexballon" item_state = null item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE @@ -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/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm index 5debe7341c6..72b99b45492 100644 --- a/code/modules/spells/spell_types/rod_form.dm +++ b/code/modules/spells/spell_types/rod_form.dm @@ -16,6 +16,9 @@ if(istype(A, /area/wizard_station)) to_chat(user, "You know better than to trash Wizard Federation property. Best wait until you leave to use [src].") return + else if(istype(A, /area/ruin/powered/kinggoat_arena)) + to_chat(user, "Some foul goat based magic is preventing you from using rod form here!. You must beat the king goat or escape the arena somehow before you can use [src].") + return for(var/mob/living/M in targets) var/turf/start = get_turf(M) var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(start, M.dir, (15 + spell_level * 3))) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 29dd3193fca..51cb0faaf35 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -313,7 +313,7 @@ var/mob/living/M = AM M.Paralyze(stun_amt) to_chat(M, "You're thrown back by [user]!") - AM.safe_throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time. + AM.safe_throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time. /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! name = "Tail Sweep" diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 53968e64f8e..e6836c403c9 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -183,7 +183,7 @@ burn_dam += burn //We've dealt the physical damages, if there's room lets apply the stamina damage. - stamina_dam += round(CLAMP(stamina, 0, max_stamina_damage - stamina_dam), DAMAGE_PRECISION) + stamina_dam += round(clamp(stamina, 0, max_stamina_damage - stamina_dam), DAMAGE_PRECISION) if(owner && updating_health) @@ -288,7 +288,7 @@ C = source if(!original_owner) original_owner = source - else + else C = owner if(original_owner && owner != original_owner) //Foreign limb no_update = TRUE diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 4eaeebd7f94..d58499279a6 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -16,7 +16,7 @@ return FALSE var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST) - affecting.receive_damage(CLAMP(brute_dam/2 * affecting.body_damage_coeff, 15, 50), CLAMP(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage + affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 43449b972c0..2837155191e 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -151,12 +151,14 @@ clear_alert("embeddedobject") SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") -/mob/living/carbon/proc/has_embedded_objects() - . = FALSE +/mob/living/carbon/proc/has_embedded_objects(include_harmless=FALSE) + . = 0 for(var/X in bodyparts) var/obj/item/bodypart/L = X for(var/obj/item/I in L.embedded_objects) - return TRUE + if(!include_harmless && I.is_embed_harmless()) + continue + return 1 //Helper for quickly creating a new limb - used by augment code in species.dm spec_attacked_by 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/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 3c51ad92998..e0808c33c44 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -252,7 +252,7 @@ return var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num - set_distance(CLAMP(range, 0, max_light_beam_distance)) + set_distance(clamp(range, 0, max_light_beam_distance)) assume_rgb(C) /obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 57879cd6203..3cd63729c54 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -113,7 +113,7 @@ if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) var/ratio = (breath_gases[/datum/gas/oxygen][MOLES]/safe_oxygen_max) * 10 - H.apply_damage_type(CLAMP(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) else H.clear_alert("too_much_oxy") @@ -141,7 +141,7 @@ if(safe_nitro_max) if(N2_pp > safe_nitro_max) var/ratio = (breath_gases[/datum/gas/nitrogen][MOLES]/safe_nitro_max) * 10 - H.apply_damage_type(CLAMP(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) else H.clear_alert("too_much_nitro") @@ -207,7 +207,7 @@ if(safe_toxins_max) if(Toxins_pp > safe_toxins_max) var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_toxins_max) * 10 - H.apply_damage_type(CLAMP(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) + H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else H.clear_alert("too_much_tox") diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 998acb13a03..3c0c658a572 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -135,7 +135,7 @@ return if(maximum < damage) return - damage = CLAMP(damage + d, 0, maximum) + damage = clamp(damage + d, 0, maximum) var/mess = check_damage_thresholds(owner) prev_damage = damage if(mess && owner) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 5863eedf6bb..6757d141031 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -124,4 +124,4 @@ to_chat(owner, "You absorb some of the shock into your body!") /obj/item/organ/stomach/ethereal/proc/adjust_charge(amount) - crystal_charge = CLAMP(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS) + crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 39f9bcfff54..cac7924c846 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -30,11 +30,7 @@ var/objects = 0 for(var/obj/item/I in L.embedded_objects) objects++ - I.forceMove(get_turf(H)) - L.embedded_objects -= I - if(!H.has_embedded_objects()) - H.clear_alert("embeddedobject") - SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(H, COMSIG_HUMAN_EMBED_REMOVAL, I, L) if(objects > 0) display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].", diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index a53aaa22075..791089924e1 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" @@ -1363,6 +1369,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/assembly/flash/hypnotic cost = 7 +/datum/uplink_item/device_tools/hypnotic_grenade + name = "Hypnotic Grenade" + desc = "A modified flashbang grenade able to hypnotize targets. The sound portion of the flashbang causes hallucinations, and will allow the flash to induce a hypnotic trance to viewers." + item = /obj/item/grenade/hypnotic + cost = 12 + /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \ @@ -1491,7 +1503,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 +1544,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 +1566,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 +1584,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 +1798,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/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/_vending.dm b/code/modules/vending/_vending.dm index 149b3b15659..2c35f6d26e2 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -504,9 +504,11 @@ GLOBAL_LIST_EMPTY(vending_products) crit_rebate = 50 for(var/i = 0, i < num_shards, i++) var/obj/item/shard/shard = new /obj/item/shard(get_turf(C)) - shard.embedding = shard.embedding.setRating(embed_chance = 100, embedded_ignore_throwspeed_threshold = TRUE, embedded_impact_pain_multiplier=1,embedded_pain_chance=5) + shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5) + shard.AddElement(/datum/element/embed, shard.embedding) C.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = shard.embedding.setRating(embed_chance = EMBED_CHANCE, embedded_ignore_throwspeed_threshold = FALSE) + shard.embedding = initial(shard.embedding) + shard.AddElement(/datum/element/embed, shard.embedding) if(4) // paralyze this binch // the new paraplegic gets like 4 lines of losing their legs so skip them visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C)) @@ -546,8 +548,8 @@ GLOBAL_LIST_EMPTY(vending_products) throw_at(get_turf(fatty), 1, 1, spin=FALSE) /obj/machinery/vending/proc/untilt(mob/user) - user.visible_message("[user] rights [src].", \ - "You right [src].") + user.visible_message("[user] rights [src].", \ + "You right [src].") unbuckle_all_mobs(TRUE) @@ -638,7 +640,7 @@ GLOBAL_LIST_EMPTY(vending_products) return if(tilted && !user.buckled && !isAI(user)) - to_chat(user, "You begin righting [src].") + to_chat(user, "You begin righting [src].") if(do_after(user, 50, target=src)) untilt(user) return diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index e47b2d8959f..da517e4ff7f 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -125,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/cigarette.dm b/code/modules/vending/cigarette.dm index b30c5b1340a..a5fbb472efc 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -15,6 +15,7 @@ /obj/item/storage/fancy/rollingpapers = 5) contraband = list(/obj/item/clothing/mask/vape = 5) premium = list(/obj/item/storage/fancy/cigarettes/cigpack_robustgold = 3, + /obj/item/storage/box/gum/nicotine = 2, /obj/item/lighter = 3, /obj/item/storage/fancy/cigarettes/cigars = 1, /obj/item/storage/fancy/cigarettes/cigars/havana = 1, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 7cd36e3388c..504a3572f8c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -126,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/medical.dm b/code/modules/vending/medical.dm index 4b76ce03d1b..00868bf96af 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -28,6 +28,7 @@ contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/multiver = 6, + /obj/item/storage/box/gum/happiness = 3, /obj/item/storage/box/hug/medical = 1) premium = list(/obj/item/reagent_containers/medigel/instabitaluri = 2, /obj/item/storage/pill_bottle/psicodine = 2, @@ -36,7 +37,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/medical_wall.dm b/code/modules/vending/medical_wall.dm index 9de7b20fba6..1f7e5152af8 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -12,7 +12,8 @@ /obj/item/reagent_containers/medigel/aiuri = 2, /obj/item/reagent_containers/medigel/sterilizine = 1) contraband = list(/obj/item/reagent_containers/pill/tox = 2, - /obj/item/reagent_containers/pill/morphine = 2) + /obj/item/reagent_containers/pill/morphine = 2, + /obj/item/storage/box/gum/happiness = 1) 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/wallmed diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 611bf15886c..fefad806b8d 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -11,6 +11,7 @@ /obj/item/reagent_containers/food/snacks/sosjerky = 6, /obj/item/reagent_containers/food/snacks/no_raisin = 6, /obj/item/reagent_containers/food/drinks/dry_ramen = 3, + /obj/item/storage/box/gum = 3, /obj/item/reagent_containers/food/snacks/energybar = 6) contraband = list(/obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/candy/bronx = 1) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e4ef90ff75b..3a5bcdff21c 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -182,6 +182,7 @@ /obj/item/clothing/suit/hooded/wintercoat/hydro = 2, /obj/item/clothing/suit/apron = 2, /obj/item/clothing/suit/apron/overalls = 3, + /obj/item/clothing/suit/apron/waders = 3, /obj/item/clothing/under/rank/civilian/hydroponics = 3, /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 3, /obj/item/clothing/mask/bandana = 3, @@ -283,6 +284,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 d61d9b0f4a6..3e838ade6b0 100644 --- a/config/config.txt +++ b/config/config.txt @@ -500,3 +500,19 @@ DEFAULT_VIEW_SQUARE 15x15 ## Enable automatic profiling - Byond 513.1506 and newer only. #AUTO_PROFILE + +#### DISCORD STUFFS #### +## MAKE SURE ALL SECTIONS OF THIS ARE FILLED OUT BEFORE ENABLING +## Discord IDs can be obtained by following this guide: https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID- + +## Uncomment to enable discord auto-roling when users link their BYOND and Discord accounts +#ENABLE_DISCORD_AUTOROLE + +## Add your discord bot token here. Make sure it has the ability to manage roles +#DISCORD_TOKEN someDiscordToken + +## Add the ID of your guild (server) here +#DISCORD_GUILDID 000000000000000000 + +## Add the ID of the role you want assigning here +#DISCORD_ROLEID 000000000000000000 diff --git a/dependencies.sh b/dependencies.sh index 488504b2887..be5a3204285 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -11,7 +11,7 @@ export BYOND_MINOR=${LIST[1]} unset LIST #rust_g git tag -export RUST_G_VERSION=0.4.2 +export RUST_G_VERSION=0.4.3 #bsql git tag export BSQL_VERSION=v1.4.0.0 @@ -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 2956c411f63..7fe7d16ce82 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,321 @@ -->
    +

    24 February 2020

    +

    AffectedArc07 updated:

    +
      +
    • MetaStation is now no longer internally broken
    • +
    +

    Capsandi updated:

    +
      +
    • Donk Pocket Pizza is back on the menu
    • +
    +

    ExcessiveUseOfCobblestone updated:

    +
      +
    • Helbital now is more simple to use and is based off not crit/softcrit/hardcrit. You want to be in hardcrit for the best brute healing.
    • +
    • Troph has now been converted into a C2 with tweaks, now named Probital. Same recipe. Downside is stamina damage
    • +
    • Rhig has now been converted into a C2 with tweaks, now named Hercuri. Same Recipe. Downside is it can cool to dangerous levels.
    • +
    +

    Krysonism updated:

    +
      +
    • Added the horticultural waders to the hydrobe.
    • +
    • Resprited the hydroponics jumpsuit & jumpskirt
    • +
    +

    TheVekter updated:

    +
      +
    • Each anomaly now produces a specific core depending on what type it is. (Credit to Partheo for the new sprites!)
    • +
    • Enabled a variant of the Gravitational Anomaly that is much stronger. Wear magboots. (This does not replace the current variant.)
    • +
    • Bluespace Wormhole Projector now requires a bluespace anomaly core to function.
    • +
    • One-point gravity manipulator now requires a gravitational anomaly core to function.
    • +
    • The Phazon now specifically requires a bluespace anomaly core - others will not work.
    • +
    • Anomalies can no longer spawn in maintenance.
    • +
    • The chance for most anomalies to spawn has been increased.
    • +
    +

    XDTM updated:

    +
      +
    • Added a hypnotic flashbang to the uplink for 12 TC. It can hypnotize people much like a hypnoflash, and the sound will automatically make victims vulnerable to the trance.
    • +
    +

    Yenwodyah updated:

    +
      +
    • Recycler doesn't delete people in mechs, cardboard boxes, spells, etc. anymore
    • +
    +

    bobbahbrown updated:

    +
      +
    • Fixed unsanitized input on the DNA console allowing for raw HTML injection
    • +
    +

    itseasytosee updated:

    +
      +
    • Admins can now play around with jailbreak & detain objectives. Which means help a target escape out of custody or insure a target escapes in custody respectively.
    • +
    +

    nightred updated:

    +
      +
    • space ninja space suit to warm the wearer now, no more button for that
    • +
    • space ninja cell size is now reverted to original size
    • +
    + +

    21 February 2020

    +

    AffectedArc07 updated:

    +
      +
    • Linking your discord and BYOND accounts will now give you a role in the discord
    • +
    +

    Anonmare updated:

    +
      +
    • AIs can now have their laws manually adjusted
    • +
    • AIs now spark when hit, like they always should've done.
    • +
    +

    ArcaneMusic updated:

    +
      +
    • The boss's health bar on the NTOS Arcade app now properly shows the right value.
    • +
    +

    Arkatos updated:

    +
      +
    • Tank Transfer Valve now uses tgui.
    • +
    • Fixed an issue where TTV assemblies could not be activated. Sorry gamers!
    • +
    • Fixed an issue where remote signaller would not close upon securing.
    • +
    • Added sanity checks to proximity sensor and timer to prevent timers from being modified while assembly is active.
    • +
    +

    Dennok updated:

    +
      +
    • Rapid Pipe Dispenser (RPD) now available only in enginering protolathes.
    • +
    +

    Mickyan updated:

    +
      +
    • Added bubble gum! Available in three- wait, two flavors! Regular, and nicotine flavored. Put it your mask slot to make bubbles!
    • +
    +

    Qustinnus updated:

    +
      +
    • adds a showerbot, it showers people covered in blood, with force if necesary
    • +
    +

    ShizCalev updated:

    +
      +
    • Fixed a typo that was causing helmets to not update icons when worn.
    • +
    +

    XDTM updated:

    +
      +
    • Sixth sense (hearing deadchat while alive) will now only show player chat and not the dead-only announcements.
    • +
    +

    bobbahbrown updated:

    +
      +
    • Cleaned up incomplete span elements
    • +
    +

    trollbreeder updated:

    +
      +
    • Fixes an issue where Smite and Flesh to Stone were invisible in item form.
    • +
    + +

    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:

      @@ -1395,253 +1710,6 @@
      • RCD animations are now anchored
      - -

      22 December 2019

      -

      Arkatos updated:

      -
        -
      • Bank Machine now uses tgui-next UI.
      • -
      • Small UI tweaks for Gravity Generator and Equipment Reclaimer Console.
      • -
      -

      Buggy123 updated:

      -
        -
      • An intern at Nanotrasen noticed that their shift timer was running about 3 minutes fast, misleading employees about how long they had been clocked in. The timer has been fixed, and anyone who clocked out early has had their pay docked.
      • -
      -

      Miningby updated:

      -
        -
      • Mining skill only affects tools like pickaxe/drill, and the skill can only be gained by using such tools
      • -
      • Mining tools have been returned to their previous speed, and mining skill boosts this speed further. Previously mining skill lowered the speed and brought it back to normal after reaching certain levels.
      • -
      -

      Skoglol updated:

      -
        -
      • Santas bag should once again regen gifts. A bit faster than before, too.
      • -
      -

      TetraK1 updated:

      -
        -
      • SM radiation no longer kills you in 12 seconds without rad protection.
      • -
      -

      Thebleh updated:

      -
        -
      • Freezers and Heaters can now connect on multiple layers. Use a multitool on their boards to change layers.
      • -
      • Clown and Mime traitors don't get a pen unless it's their uplink choice
      • -
      -

      actioninja updated:

      -
        -
      • You can rename diseases in the pandemic
      • -
      -

      nightred updated:

      -
        -
      • kitchen counter on meta
      • -
      • replaced donk-pocket boxes in kitchen with new donk-pocket spawner
      • -
      -

      swindly updated:

      -
        -
      • Fixed crafting items using blacklisted subtypes of required items.
      • -
      • Fixed bonfires not returning the logs used to build them when deconstructed
      • -
      • Steel-cap logs can not be used to build bonfires
      • -
      -

      wesoda25 updated:

      -
        -
      • Cargo Item Requisition forms now display what time they were ordered
      • -
      - -

      21 December 2019

      -

      Ty the Smonk updated:

      -
        -
      • #48245 Wizards can no longer input just spaces and have that as their name
      • -
      -

      Ty-the-Smonk updated:

      -
        -
      • #48281 Bees can now vent crawl
      • -
      - -

      20 December 2019

      -

      4dplanner updated:

      -
        -
      • herald cloak now works
      • -
      -

      Angustmeta updated:

      -
        -
      • fixed the sugar sack to stop looking like the rice sack
      • -
      -

      ArcaneMusic updated:

      -
        -
      • Stacks of plumbing duct can now be recycled in the autolathe.
      • -
      -

      Buggy123 updated:

      -
        -
      • Moved the "Observe" verb to ghost tab
      • -
      -

      Bumtickley00 updated:

      -
        -
      • Pills found in medkits now have their own unique colors
      • -
      -

      Coconutwarrior97 updated:

      -
        -
      • Added several new donk pocket types, and boxes, including sprites for each of course. Spicy-Pocket,Teriyaki-Pocket, Pizza-Pocket,Honk-Pocket,Gondola-Pocket and Berry-Pocket. This includes re-organizing them from the OTHER section in snacks_pastry.dm to a donk pocket section. Thanks to Farquaar for the box icons and some of the code! As well as latots for the donk pocket icons.
      • -
      • Added a Donk Pocket Variety crate, for 2000 credits, which includes 3 randomly selected donk pocket box types, excluding Gondola-Pocket.
      • -
      • Added a recipe for each new Donk Pocket type.
      • -
      • Added the new Donk Pocket types to the maint loot table.
      • -
      • Donk Pocket loot spawner object, credit to TheVekter for that, which was then added into the kitchens of all the main maps.
      • -
      • All Donk Pockets now follow the same naming scheme of X-Pocket.
      • -
      • Added craftable Donk Pocket boxes.
      • -
      -

      Ecobbomy updated:

      -
        -
      • Paystands have a few new functions. Examine your paystand with the registered card in hand to view these options!
      • -
      • there is a bling necklace subtype that allows you to sell items for credits, hassle-free (search "merchant" in the spawn menu)! Useful for merchant-based events.
      • -
      -

      Fury McFlurry updated:

      -
        -
      • Adds three new moth wings and markings!
      • -
      • They are named: Oakworm, Witchwing, Jungle.
      • -
      -

      JDHoffmann3 updated:

      -
        -
      • Vampires maintain blood volume when shapeshifting.
      • -
      -

      Jdawg1290 updated:

      -
        -
      • field generator floor shields should stay still now
      • -
      -

      Kerbin-Fiber updated:

      -
        -
      • Plumbing pipes aren't as clunky anymore.
      • -
      -

      LemonInTheDark updated:

      -
        -
      • Documented all of the supermatters's function process_atmos(). Check it out, it's dope
      • -
      • Fixed my 12am comments and a few spelling errors.
      • -
      -

      Mickyan updated:

      -
        -
      • Payouts and vending machine prices have been completely rebalanced
      • -
      -

      MrPerson updated:

      -
        -
      • Solar panels will visually rotate a lot more smoothly instead of being locked to only 8 directions.
      • -
      • Timed solar tracking is in degrees per minute. You're still not gonna use it though.
      • -
      -

      OnlineGirlfriend updated:

      -
        -
      • hot coco glass name and description
      • -
      • hot coco, tea, and coffee are now drink recipes (not food)
      • -
      • hot coco now has 20% chance of healing brute damage
      • -
      -

      PKPenguin321 updated:

      -
        -
      • Surgical drills have a fun new suicide.
      • -
      • Having waaay too much blood now makes you explode. Realistic!
      • -
      • Cleaned some very confusing code in subsystem/job.dm
      • -
      -

      RaveRadbury updated:

      -
        -
      • Space Mountain Wind Snowcones
      • -
      • snow cones do not require water to make
      • -
      • honey snow cones have more of an amber color
      • -
      • the mime snow cone has a grey straw so you can actually see it.
      • -
      • apple snow cones are also amber now
      • -
      • sodawater snow cones are actually Space Cola snow cones.
      • -
      • fruit salad snowcone tastes changed
      • -
      • mixed berry is now just berry
      • -
      • all snow cones can now taste of ice and water
      • -
      • clown snow cones recipe changed to require laughter, output 5u of their reagent like almost all other snow cones.
      • -
      • berry snow cones require and output 5u of berry juice
      • -
      • clown and pwrgame snowcones now contain the appropriate reagents
      • -
      • removed stray pixel on mime snowcone
      • -
      • Misspellings in snowcone titles and descriptions
      • -
      • Baguettes now have an attack verb. Try hitting somebody with one!
      • -
      • Meat donut recipe uses raw meat cutlets instead of raw meat slabs
      • -
      -

      Robotby updated:

      -
        -
      • borgs can now unbuckle users safely by clicking on themselves with help intent and no selected module OR by using the resist verb in the command bar/IC tab.
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • A bunch of new achievements have been added! To name a few, there are achievements for holding up the captain with a rocket launcher as a nuclear operative, dying to inanimate objects, dying in a toilet, and getting watchlisted! Go do some dumb stuff!
      • -
      • AI's are no longer able to right tipped vending machines
      • -
      • Borgies can now attack and be attacked by vending machines! spelling: Untipping vending machines no longer shoes an errant /the
      • -
      -

      Skoglol updated:

      -
        -
      • All human intent suicides now work properly
      • -
      • New disarm intent suicide
      • -
      • Refactored language holders. Fixes a bunch of language related bugs and inconsistencies.
      • -
      • Transforms now apply new languages properly. Monkeys can no longer speak common.
      • -
      • Species changes will now give you the relevant languages.
      • -
      • PDA sorting mode is no longer inverted.
      • -
      • Some dynamic mode threat spending/refunding and threat logging fixes.
      • -
      • Fixed a bug causing some midround antag ghost rolls to fail. Dynamic midround nightmare should now spawn again.
      • -
      • Soul stones can once again be used on catatonics.
      • -
      • AI will now only be notified of new shells once.
      • -
      • Abandoned crates will no longer explode roundstart. Some loot has been fixed.
      • -
      -

      TheChosenEvilOne updated:

      -
        -
      • Arrival deadchat message will no longer colour other text in the deadchat colour.
      • -
      -

      TheVekter updated:

      -
        -
      • The Cult should now actually be able to draw runes in the Library.
      • -
      • Added brass sheets to the Sheet Snatcher's whitelist.
      • -
      • Added Chili con Carnival, a new chili dish that requires the clown's shoes to make! (Sprite by ArcaneMusic)
      • -
      • Apothecary access should now work correctly on all maps.
      • -
      • Fixed the crafting menu.
      • -
      • Due to its age, the E.X.P.E.R.I-Mentor might be prone to exploding in very, very rare scenarios. Please take care in its use.
      • -
      • Increased the amount of research gained for discovering a strange object's true nature.
      • -
      • The E.X.P.E.R.I-Mentor will now produce research notes instead of feeding points directly into the server.
      • -
      • Strange objects have a more informational examine string.
      • -
      • Reduced the overall amount of passive research generation by a small amount.
      • -
      • Adds a cooldown to the Deathgasp emote
      • -
      -

      Yenwodyah updated:

      -
        -
      • Bear traps and bolas apply slowdown correctly again
      • -
      • Blood-red hardsuits now properly update their slowdown when you toggle helmet modes
      • -
      -

      actioninja updated:

      -
        -
      • pandemic now uses tgui-next
      • -
      • tgui-next portable atmos
      • -
      • Nanite damage sensor have extra settings again
      • -
      -

      bobbahbrown updated:

      -
        -
      • Removed some stinky smells from hailer mask code.
      • -
      -

      carshalash updated:

      -
        -
      • Makes Hot Coco actually consumable
      • -
      -

      fludd12 updated:

      -
        -
      • You can now craft something vaguely like a pen out of some wood and ash.
      • -
      -

      nightred updated:

      -
        -
      • Moved the Biogenerator to be shared with the kitchen
      • -
      • Hallway counter to the kitchen
      • -
      • Changed the layout of the kitchen
      • -
      -

      stylemistake updated:

      -
        -
      • Fancy tgui mode now works on IE8 (not perfect. but certainly usable).
      • -
      -

      swindly updated:

      -
        -
      • Assemblies in chemical grenades are removed when wrenched while there are no beakers inside instead of only when there is a beaker inside
      • -
      • Makes encryption keys be put in the hands of the user when able instead of being dropped on the floor when removed from headsets
      • -
      -

      tralezab updated:

      -
        -
      • The Plasma Fist now builds energy up for a new explosive move!
      • -
      • drones are no longer allowed to leave their station, they will die upon doing so
      • -
      • renamed boring ice peppers to chilly peppers
      • -
      -

      zxaber updated:

      -
        -
      • Added logging for when an Exosuit Console is used to EMP a mech.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 67e813a82ae..16424ac2c72 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -37146,3 +37146,247 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 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. +2020-02-21: + AffectedArc07: + - rscadd: Linking your discord and BYOND accounts will now give you a role in the + discord + Anonmare: + - rscadd: AIs can now have their laws manually adjusted + - bugfix: AIs now spark when hit, like they always should've done. + ArcaneMusic: + - bugfix: The boss's health bar on the NTOS Arcade app now properly shows the right + value. + Arkatos: + - rscadd: Tank Transfer Valve now uses tgui. + - bugfix: Fixed an issue where TTV assemblies could not be activated. Sorry gamers! + - bugfix: Fixed an issue where remote signaller would not close upon securing. + - bugfix: Added sanity checks to proximity sensor and timer to prevent timers from + being modified while assembly is active. + Dennok: + - rscadd: Rapid Pipe Dispenser (RPD) now available only in enginering protolathes. + Mickyan: + - rscadd: Added bubble gum! Available in three- wait, two flavors! Regular, and + nicotine flavored. Put it your mask slot to make bubbles! + Qustinnus: + - rscadd: adds a showerbot, it showers people covered in blood, with force if necesary + ShizCalev: + - bugfix: Fixed a typo that was causing helmets to not update icons when worn. + XDTM: + - tweak: Sixth sense (hearing deadchat while alive) will now only show player chat + and not the dead-only announcements. + bobbahbrown: + - code_imp: Cleaned up incomplete span elements + trollbreeder: + - bugfix: Fixes an issue where Smite and Flesh to Stone were invisible in item form. +2020-02-24: + AffectedArc07: + - tweak: MetaStation is now no longer internally broken + Capsandi: + - bugfix: Donk Pocket Pizza is back on the menu + ExcessiveUseOfCobblestone: + - balance: Helbital now is more simple to use and is based off not crit/softcrit/hardcrit. + You want to be in hardcrit for the best brute healing. + - tweak: Troph has now been converted into a C2 with tweaks, now named Probital. + Same recipe. Downside is stamina damage + - tweak: Rhig has now been converted into a C2 with tweaks, now named Hercuri. Same + Recipe. Downside is it can cool to dangerous levels. + Krysonism: + - rscadd: Added the horticultural waders to the hydrobe. + - imageadd: Resprited the hydroponics jumpsuit & jumpskirt + TheVekter: + - rscadd: Each anomaly now produces a specific core depending on what type it is. + (Credit to Partheo for the new sprites!) + - rscadd: Enabled a variant of the Gravitational Anomaly that is much stronger. + Wear magboots. (This does not replace the current variant.) + - tweak: Bluespace Wormhole Projector now requires a bluespace anomaly core to function. + - tweak: One-point gravity manipulator now requires a gravitational anomaly core + to function. + - tweak: The Phazon now specifically requires a bluespace anomaly core - others + will not work. + - tweak: Anomalies can no longer spawn in maintenance. + - tweak: The chance for most anomalies to spawn has been increased. + XDTM: + - rscadd: Added a hypnotic flashbang to the uplink for 12 TC. It can hypnotize people + much like a hypnoflash, and the sound will automatically make victims vulnerable + to the trance. + Yenwodyah: + - bugfix: Recycler doesn't delete people in mechs, cardboard boxes, spells, etc. + anymore + bobbahbrown: + - bugfix: Fixed unsanitized input on the DNA console allowing for raw HTML injection + itseasytosee: + - rscadd: Admins can now play around with jailbreak & detain objectives. Which means + help a target escape out of custody or insure a target escapes in custody respectively. + nightred: + - bugfix: space ninja space suit to warm the wearer now, no more button for that + - bugfix: space ninja cell size is now reverted to original size diff --git a/html/changelogs/AutoChangeLog-pr-48959.yml b/html/changelogs/AutoChangeLog-pr-48959.yml new file mode 100644 index 00000000000..ea18a285c54 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-48959.yml @@ -0,0 +1,7 @@ +author: "Ryll/Shaps" +delete-after: True +changes: + - tweak: "Embeddables have been reworked and given new functionality." + - rscadd: "Adds toy shurikens for pranks and shock shurikens for less lethal takedowns." + - rscadd: "Adds sticky tape that lets you stick random junk to people! How will anyone believe the Captain's cries that he's not actually a boomer when there's a can of Monkey Energy stuck to his head?" + - refactor: "Embedding functionality has been made an element, with new support for dealing a mix of brute and stamina damage, and a separate pain check for on-move." diff --git a/html/changelogs/AutoChangeLog-pr-49028.yml b/html/changelogs/AutoChangeLog-pr-49028.yml deleted file mode 100644 index c110bb54d58..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49028.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "nightred" -delete-after: True -changes: - - 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" diff --git a/html/changelogs/AutoChangeLog-pr-49029.yml b/html/changelogs/AutoChangeLog-pr-49029.yml deleted file mode 100644 index 5c0a7c0e06c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49029.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Krysonism" -delete-after: True -changes: - - 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." diff --git a/html/changelogs/AutoChangeLog-pr-49111.yml b/html/changelogs/AutoChangeLog-pr-49111.yml new file mode 100644 index 00000000000..d14c2825234 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49111.yml @@ -0,0 +1,5 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - rscadd: "The Nanotrasen Deliveries and Handling League (NDHL) have been noticing a decrease in station export profits, and the crate recycling program just isn't cutting it. New Sales Taggers have been deployed in all station cargo setups." + - rscadd: "Wrapped items can be zapped with Sales Taggers in order to give the account holder a portion of the profit on a sale." diff --git a/html/changelogs/AutoChangeLog-pr-49159.yml b/html/changelogs/AutoChangeLog-pr-49159.yml new file mode 100644 index 00000000000..d788feb7dab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49159.yml @@ -0,0 +1,9 @@ +author: "fluffe9911" +delete-after: True +changes: + - rscadd: "King Goat achievements" + - tweak: "King Goat spells per phase lowered from 10 to 5" + - tweak: "King Goat goes back to normal speed after casting super speed spell 2x faster" + - bugfix: "Hiro teleport no longer works in NOTELEPORT areas" + - bugfix: "moved king goat file to proper area" + - tweak: "better goat hoof and goat gun sprite courtesy of Usnavi!" diff --git a/html/changelogs/AutoChangeLog-pr-49196.yml b/html/changelogs/AutoChangeLog-pr-49196.yml deleted file mode 100644 index 7cbe9a359e9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49196.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cobby" -delete-after: True -changes: - - balance: "Buffs Surgery XP values" diff --git a/html/changelogs/AutoChangeLog-pr-49205.yml b/html/changelogs/AutoChangeLog-pr-49205.yml deleted file mode 100644 index bcf7427b025..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49205.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Buggy123" -delete-after: True -changes: - - tweak: "Random mineral turfs no longer cause large amounts of turf changes on initialization." diff --git a/html/changelogs/AutoChangeLog-pr-49253.yml b/html/changelogs/AutoChangeLog-pr-49253.yml deleted file mode 100644 index e2686ebec08..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49253.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nianjiilical" -delete-after: True -changes: - - rscadd: "Some weird shit happened in space, and now Ethereals are appearing in new colors. Scientists are baffled." diff --git a/html/changelogs/AutoChangeLog-pr-49260.yml b/html/changelogs/AutoChangeLog-pr-49260.yml new file mode 100644 index 00000000000..9a60b448b09 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49260.yml @@ -0,0 +1,7 @@ +author: "LemonInTheDark" +delete-after: True +changes: + - rscadd: "Tesla zaps will now turn tesla generators into teslas." + - bugfix: "Explosions might be a little less common, I've fixed the thing where machines would explode with no visible arc to the object." + - bugfix: "Fixes a whole bunch of issues, teslas make more sense now" + - code_imp: "Makes my shitcode better" diff --git a/html/changelogs/AutoChangeLog-pr-49295.yml b/html/changelogs/AutoChangeLog-pr-49295.yml deleted file mode 100644 index 6e34415bbc4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49295.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - spellcheck: "Unhusking someone with synthflesh will no longer tell everyone they were the one to fix the corpse." diff --git a/html/changelogs/AutoChangeLog-pr-49322.yml b/html/changelogs/AutoChangeLog-pr-49322.yml deleted file mode 100644 index 10ba4c295bc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49322.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Fixed nanite shutdown timer not properly shutting down nanites." diff --git a/html/changelogs/AutoChangeLog-pr-49326.yml b/html/changelogs/AutoChangeLog-pr-49326.yml deleted file mode 100644 index 164aa87657f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49326.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "actioninja" -delete-after: True -changes: - - 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." diff --git a/html/changelogs/AutoChangeLog-pr-49406.yml b/html/changelogs/AutoChangeLog-pr-49406.yml new file mode 100644 index 00000000000..ed5f08ba689 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49406.yml @@ -0,0 +1,5 @@ +author: "pireamaineach" +delete-after: True +changes: + - imageadd: "Resprites several plasmaman items. +add:Adds plasmagloves and fixes clipping on the plasmaman suit." diff --git a/html/changelogs/AutoChangeLog-pr-49475.yml b/html/changelogs/AutoChangeLog-pr-49475.yml new file mode 100644 index 00000000000..0eba9655378 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49475.yml @@ -0,0 +1,5 @@ +author: "Yenwodyah" +delete-after: True +changes: + - bugfix: "Removed geneticists from the medbay radio channel" + - bugfix: "Geneticists are on the science payroll now" diff --git a/html/changelogs/AutoChangeLog-pr-49484.yml b/html/changelogs/AutoChangeLog-pr-49484.yml new file mode 100644 index 00000000000..f0fa2e74793 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49484.yml @@ -0,0 +1,5 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - tweak: "Wooden Fermenting barrels now cost 8 wooden planks to craft, down from 30." + - balance: "Wooden Fermenting barrels can now be made in the stack crafting menu, in addition to the crafting menu." diff --git a/html/changelogs/AutoChangeLog-pr-49485.yml b/html/changelogs/AutoChangeLog-pr-49485.yml new file mode 100644 index 00000000000..6faa88bfd56 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49485.yml @@ -0,0 +1,4 @@ +author: "Arkatos and Skoglol" +delete-after: True +changes: + - rscadd: "Gas Turbine now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49499.yml b/html/changelogs/AutoChangeLog-pr-49499.yml new file mode 100644 index 00000000000..f178b3cec8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49499.yml @@ -0,0 +1,4 @@ +author: "cacogen" +delete-after: True +changes: + - tweak: "Box now has a Service Door between hydroponics and the kitchen instead of the desk" diff --git a/html/changelogs/AutoChangeLog-pr-49504.yml b/html/changelogs/AutoChangeLog-pr-49504.yml new file mode 100644 index 00000000000..5f016498f39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49504.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "reaction chamber empties again" diff --git a/html/changelogs/AutoChangeLog-pr-49507.yml b/html/changelogs/AutoChangeLog-pr-49507.yml new file mode 100644 index 00000000000..bc4000720ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49507.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - tweak: "Added plumbing room to Deltastation" diff --git a/html/changelogs/AutoChangeLog-pr-49508.yml b/html/changelogs/AutoChangeLog-pr-49508.yml new file mode 100644 index 00000000000..735e4b7e84c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49508.yml @@ -0,0 +1,4 @@ +author: "improvedname" +delete-after: True +changes: + - rscdel: "Removes magicarp bolt of change" diff --git a/html/changelogs/AutoChangeLog-pr-49509.yml b/html/changelogs/AutoChangeLog-pr-49509.yml new file mode 100644 index 00000000000..a5168b01b8a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49509.yml @@ -0,0 +1,4 @@ +author: "Bumtickley00" +delete-after: True +changes: + - bugfix: "Helbital now heals brute instead of dealing brute" diff --git a/html/changelogs/AutoChangeLog-pr-49510.yml b/html/changelogs/AutoChangeLog-pr-49510.yml new file mode 100644 index 00000000000..2d9910bd56b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49510.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Electropack now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49515.yml b/html/changelogs/AutoChangeLog-pr-49515.yml new file mode 100644 index 00000000000..52d70ffd014 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49515.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - rscadd: "adds the snail achievement to genetics" diff --git a/html/changelogs/AutoChangeLog-pr-49516.yml b/html/changelogs/AutoChangeLog-pr-49516.yml new file mode 100644 index 00000000000..cacc4b7159e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49516.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "fixes gastrolisis runtime" diff --git a/html/changelogs/AutoChangeLog-pr-49517.yml b/html/changelogs/AutoChangeLog-pr-49517.yml new file mode 100644 index 00000000000..652997daf60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49517.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - tweak: "Added the art gallery to Deltastation" diff --git a/html/changelogs/AutoChangeLog-pr-49526.yml b/html/changelogs/AutoChangeLog-pr-49526.yml new file mode 100644 index 00000000000..a650e3b323d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49526.yml @@ -0,0 +1,5 @@ +author: "bobbahbrown" +delete-after: True +changes: + - tweak: "Nanotrasen is now manufacturing wigs with waterproof dye -- shower with new-found confidence!" + - bugfix: "Wigs can no longer have their color changed when not being held." diff --git a/html/changelogs/AutoChangeLog-pr-49532.yml b/html/changelogs/AutoChangeLog-pr-49532.yml new file mode 100644 index 00000000000..5de00757ee4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49532.yml @@ -0,0 +1,4 @@ +author: "Arkatos and actioninja" +delete-after: True +changes: + - rscadd: "Malfunction Modules Picker now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49541.yml b/html/changelogs/AutoChangeLog-pr-49541.yml new file mode 100644 index 00000000000..fcbe4c6cd49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49541.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Blindfolds now properly blind you!" diff --git a/html/changelogs/AutoChangeLog-pr-49553.yml b/html/changelogs/AutoChangeLog-pr-49553.yml new file mode 100644 index 00000000000..740b5853f53 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49553.yml @@ -0,0 +1,4 @@ +author: "nemvar" +delete-after: True +changes: + - spellcheck: "Renamed \"My mental status\" to \"My current sanity\" in the mood printout." diff --git a/html/changelogs/AutoChangeLog-pr-49561.yml b/html/changelogs/AutoChangeLog-pr-49561.yml new file mode 100644 index 00000000000..2c071071822 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49561.yml @@ -0,0 +1,4 @@ +author: "bobbahbrown" +delete-after: True +changes: + - bugfix: "Fixed unsanitized blob broadcast allowing html injection" diff --git a/html/changelogs/AutoChangeLog-pr-49585.yml b/html/changelogs/AutoChangeLog-pr-49585.yml new file mode 100644 index 00000000000..d3ddef84f98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49585.yml @@ -0,0 +1,4 @@ +author: "Ryll/Shaps" +delete-after: True +changes: + - rscadd: "Officer Beepsky has been promoted to Commander Beepsky! He is now officially in command of all of the bots on the station, who will now show him proper respect by saluting him when they cross paths." diff --git a/html/changelogs/AutoChangeLog-pr-49593.yml b/html/changelogs/AutoChangeLog-pr-49593.yml new file mode 100644 index 00000000000..814826bc3a9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49593.yml @@ -0,0 +1,4 @@ +author: "LemonInTheDark" +delete-after: True +changes: + - bugfix: "Zaps no longer infinite chain after hitting coils." diff --git a/html/changelogs/AutoChangeLog-pr-49595.yml b/html/changelogs/AutoChangeLog-pr-49595.yml new file mode 100644 index 00000000000..3855bd876c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49595.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - bugfix: "Deltastation's disposal system will no longer accidentally dump garbage into the morgue" diff --git a/icons/UI_Icons/Achievements/Boss/goatboss.png b/icons/UI_Icons/Achievements/Boss/goatboss.png new file mode 100644 index 00000000000..902e1195d39 Binary files /dev/null and b/icons/UI_Icons/Achievements/Boss/goatboss.png differ diff --git a/icons/UI_Icons/Achievements/Misc/snail.png b/icons/UI_Icons/Achievements/Misc/snail.png new file mode 100644 index 00000000000..f38c5165cb5 Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/snail.png 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..6a92b3b152f 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 ea00f5d1f8a..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..cb4251fd3c6 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 f0ad20bcdc0..5589d556ecc 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 7ae1fd2c793..31a3613e08f 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index 522d9540657..b59c86f8872 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 9e20766cb14..7da66b1df31 100644 Binary files a/icons/mob/clothing/under/civilian.dmi and b/icons/mob/clothing/under/civilian.dmi differ diff --git a/icons/mob/clothing/under/plasmaman.dmi b/icons/mob/clothing/under/plasmaman.dmi index f45a0335616..53e2c7a0fc5 100644 Binary files a/icons/mob/clothing/under/plasmaman.dmi and b/icons/mob/clothing/under/plasmaman.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/human_parts.dmi b/icons/mob/human_parts.dmi index b0beb21017c..83e2a1b4231 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.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/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 fbc00e7f67e..b29a8b04f7d 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 ea5b236ab06..236cb35804d 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/obj/artstuff.dmi b/icons/obj/artstuff.dmi index 4ec2c066a95..14970b76ef2 100644 Binary files a/icons/obj/artstuff.dmi and b/icons/obj/artstuff.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/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index df9517aeaa5..adb0b69c590 100644 Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index a83172612f5..8b9222741ef 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.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 e1968cde991..4f9d288b921 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.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..3570c01732c 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 7188896730a..124a7e266ff 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 d7f041a3948..9dd40b71b44 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 5b51265cf91..9ed2c8ab5c9 100644 Binary files a/icons/obj/clothing/under/civilian.dmi and b/icons/obj/clothing/under/civilian.dmi differ diff --git a/icons/obj/clothing/under/plasmaman.dmi b/icons/obj/clothing/under/plasmaman.dmi index c291b7fa015..dff2d556553 100644 Binary files a/icons/obj/clothing/under/plasmaman.dmi and b/icons/obj/clothing/under/plasmaman.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 1b10515d10a..0306177e7e4 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/food/food.dmi b/icons/obj/food/food.dmi index fc15ca37181..08a4de094f4 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 8f065d41f6c..d52c07372c1 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.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/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 6e509963eb7..e0aa1183cf8 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.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/objects.dmi b/icons/obj/objects.dmi index c4e5bece817..ce9510d00e7 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.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/stationobjs.dmi b/icons/obj/stationobjs.dmi index 9bd12e5f914..c8ee39ede6d 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 291b29a3ffe..1807e5a532f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tapes.dmi b/icons/obj/tapes.dmi new file mode 100644 index 00000000000..a406a4dd1f9 Binary files /dev/null and b/icons/obj/tapes.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 38a340ec15b..31e85ee7e9b 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/rust_g.dll b/rust_g.dll index 27ee495684f..941f29873b8 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/effects/hygienebot_angry.ogg b/sound/effects/hygienebot_angry.ogg new file mode 100644 index 00000000000..d184cc38e21 Binary files /dev/null and b/sound/effects/hygienebot_angry.ogg differ diff --git a/sound/effects/hygienebot_happy.ogg b/sound/effects/hygienebot_happy.ogg new file mode 100644 index 00000000000..ca3b9159c37 Binary files /dev/null and b/sound/effects/hygienebot_happy.ogg differ diff --git a/strings/names/plasmaman.txt b/strings/names/plasmaman.txt index eb5f8b786c9..37e27c2a42f 100644 --- a/strings/names/plasmaman.txt +++ b/strings/names/plasmaman.txt @@ -115,4 +115,4 @@ Xenon Ytterbium Yttrium Zinc -Zirconium \ No newline at end of file +Zirconium diff --git a/strings/wanted_message.json b/strings/wanted_message.json index 73027797695..18965b70263 100644 --- a/strings/wanted_message.json +++ b/strings/wanted_message.json @@ -30,7 +30,7 @@ "noun": { "secret plans": 50, "the hand teleporter": 50, - "an NT centcomm uniform": 50, + "an NT CentCom uniform": 50, "a supermatter shard": 50, "internal Syndicate documents": 50, "experimental Nanotrasen technology": 50, @@ -64,7 +64,7 @@ "on a remote syndicate base": 50, "in a secure NT facility": 50, "while on an escape shuttle": 10, - "while infilrating centcomm headquarters": 10, + "while infiltrating CentCom headquarters": 10, "deep in the necropolis": 10, "during a drunken bar fight": 5, "while stuck in a bathroom": 5, diff --git a/tgstation.dme b/tgstation.dme index 9da559403c9..97eaa6324f1 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" @@ -326,6 +328,7 @@ #include "code\datums\forced_movement.dm" #include "code\datums\hailer_phrase.dm" #include "code\datums\holocall.dm" +#include "code\datums\http.dm" #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\mind.dm" @@ -384,6 +387,7 @@ #include "code\datums\components\earprotection.dm" #include "code\datums\components\edible.dm" #include "code\datums\components\edit_complainer.dm" +#include "code\datums\components\embedded.dm" #include "code\datums\components\empprotection.dm" #include "code\datums\components\explodable.dm" #include "code\datums\components\footstep.dm" @@ -408,6 +412,7 @@ #include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\paintable.dm" +#include "code\datums\components\pricetag.dm" #include "code\datums\components\punchcooldown.dm" #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" @@ -521,6 +526,7 @@ #include "code\datums\elements\digitalcamo.dm" #include "code\datums\elements\dunkable.dm" #include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\embed.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\selfknockback.dm" @@ -697,6 +703,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" @@ -938,6 +945,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" @@ -1011,6 +1019,7 @@ #include "code\game\objects\items\grenades\flashbang.dm" #include "code\game\objects\items\grenades\ghettobomb.dm" #include "code\game\objects\items\grenades\grenade.dm" +#include "code\game\objects\items\grenades\hypno.dm" #include "code\game\objects\items\grenades\plastic.dm" #include "code\game\objects\items\grenades\smokebomb.dm" #include "code\game\objects\items\grenades\spawnergrenade.dm" @@ -1046,6 +1055,7 @@ #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\tape.dm" #include "code\game\objects\items\stacks\telecrystal.dm" #include "code\game\objects\items\stacks\tickets.dm" #include "code\game\objects\items\stacks\wrap.dm" @@ -1066,6 +1076,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" @@ -1126,6 +1137,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" @@ -1442,6 +1454,7 @@ #include "code\modules\antagonists\traitor\syndicate_contract.dm" #include "code\modules\antagonists\traitor\equipment\contractor.dm" #include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm" +#include "code\modules\antagonists\traitor\equipment\module_picker.dm" #include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" #include "code\modules\antagonists\valentines\heartbreaker.dm" #include "code\modules\antagonists\valentines\valentine.dm" @@ -1592,6 +1605,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" @@ -1765,6 +1779,7 @@ #include "code\modules\events\wizard\blobies.dm" #include "code\modules\events\wizard\curseditems.dm" #include "code\modules\events\wizard\departmentrevolt.dm" +#include "code\modules\events\wizard\embeddies.dm" #include "code\modules\events\wizard\fakeexplosion.dm" #include "code\modules\events\wizard\ghost.dm" #include "code\modules\events\wizard\greentext.dm" @@ -2227,13 +2242,14 @@ #include "code\modules\mob\living\simple_animal\bot\firebot.dm" #include "code\modules\mob\living\simple_animal\bot\floorbot.dm" #include "code\modules\mob\living\simple_animal\bot\honkbot.dm" +#include "code\modules\mob\living\simple_animal\bot\hygienebot.dm" #include "code\modules\mob\living\simple_animal\bot\medbot.dm" #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" @@ -2254,7 +2270,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" @@ -2271,11 +2286,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" @@ -2313,6 +2328,7 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" @@ -2332,7 +2348,6 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\king_of_goats.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" @@ -2769,6 +2784,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 + +