diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 817626d2287..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. @@ -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 226ea2b7cee..7be294b00ed 100644 --- a/.github/workflows/autobuild_tgui.yml +++ b/.github/workflows/autobuild_tgui.yml @@ -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/README.md b/README.md index 99f824ca647..ef5fbb7b5db 100644 --- a/README.md +++ b/README.md @@ -2,152 +2,32 @@ [![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 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/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 e84d7789b36..6e0598df41a 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -17896,6 +17896,7 @@ "aTE" = ( /obj/structure/table, /obj/item/hand_labeler, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/art) "aTF" = ( @@ -18098,14 +18099,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{ @@ -18644,9 +18649,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) @@ -19944,6 +19952,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" = ( @@ -23887,6 +23899,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" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 3442eaaed63..d18520b728f 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, @@ -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" = ( @@ -26316,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"; @@ -44500,6 +44800,7 @@ pixel_x = -32 }, /obj/effect/turf_decal/bot, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/primary) "bGH" = ( @@ -55486,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{ @@ -57347,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 @@ -58416,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 @@ -59396,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 @@ -59418,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 @@ -60412,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, @@ -60435,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 @@ -61241,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" @@ -62766,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{ @@ -67869,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{ @@ -67919,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" @@ -68828,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{ @@ -84805,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, @@ -84823,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{ @@ -84843,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 @@ -84858,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, @@ -84866,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{ @@ -84879,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 @@ -85832,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) @@ -85842,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{ @@ -85856,7 +85851,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcS" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -85870,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, @@ -85878,7 +85873,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dcU" = ( /obj/machinery/computer/crew{ dir = 4 @@ -86592,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 @@ -86611,7 +86606,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "deo" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -86623,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{ @@ -86634,7 +86629,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "deq" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder{ @@ -86646,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, @@ -87201,7 +87196,7 @@ "dfv" = ( /obj/structure/sign/departments/chemistry, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/pharmacy) "dfw" = ( /obj/machinery/light{ dir = 8 @@ -87224,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{ @@ -87234,7 +87229,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/pharmacy) "dfy" = ( /obj/machinery/holopad{ pixel_x = -16 @@ -87246,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, @@ -87265,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, @@ -87282,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) @@ -88051,7 +88042,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/medical/pharmacy) "dgV" = ( /obj/machinery/chem_dispenser, /obj/structure/disposalpipe/segment{ @@ -88061,7 +88052,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dgW" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -88071,7 +88062,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "dgX" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -88081,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 @@ -88094,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 @@ -88111,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, @@ -88136,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 @@ -88911,7 +88902,7 @@ name = "Chemistry Desk" }, /turf/open/floor/plasteel, -/area/medical/chemistry) +/area/medical/pharmacy) "diq" = ( /obj/structure/chair/office/light{ dir = 8 @@ -88919,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{ @@ -88944,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 @@ -89890,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, @@ -89920,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; @@ -89938,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 }, @@ -89961,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 @@ -90702,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, @@ -91133,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{ @@ -92142,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 @@ -93069,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" = ( @@ -93771,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" = ( @@ -94308,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"; @@ -94988,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{ @@ -95685,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 @@ -96384,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 @@ -97148,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{ @@ -97633,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 }, @@ -97750,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" = ( @@ -98374,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 = "5;6" - }, -/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, @@ -98938,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 @@ -99005,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, @@ -99577,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, @@ -99630,6 +98780,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/medical/morgue) "dEW" = ( @@ -99646,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 @@ -99659,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) @@ -100255,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 }, @@ -100404,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 }, @@ -100419,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, @@ -101014,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 }, @@ -101112,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 }, @@ -101215,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 }, @@ -101231,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 @@ -101866,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, @@ -101900,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 }, @@ -101919,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{ @@ -102572,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" = ( @@ -113319,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"; @@ -113468,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, @@ -113531,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, @@ -113568,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 @@ -113597,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 @@ -113737,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) @@ -113745,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 @@ -113797,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, @@ -113957,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{ @@ -113993,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{ @@ -114095,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 @@ -114150,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 @@ -114195,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{ @@ -114252,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{ @@ -114416,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, @@ -114488,6 +113651,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{ @@ -114786,6 +113964,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 @@ -114800,6 +113981,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{ @@ -114929,6 +114120,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{ @@ -114936,6 +114143,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{ @@ -114957,6 +114174,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, @@ -115025,6 +114247,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, @@ -115063,6 +114299,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) @@ -115088,6 +114332,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, @@ -115114,10 +114378,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/flip{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "nQW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -115192,6 +114472,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 @@ -115271,6 +114566,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{ @@ -115398,23 +114707,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{ @@ -115440,6 +114732,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, @@ -115465,6 +114760,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 @@ -115472,6 +114778,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{ @@ -115487,6 +114807,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 @@ -115585,10 +114919,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, @@ -115695,6 +115064,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{ @@ -115786,6 +115176,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) @@ -115812,6 +115209,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 @@ -115865,6 +115271,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{ @@ -115903,6 +115322,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) @@ -115964,6 +115401,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{ @@ -115983,6 +115430,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, @@ -115996,6 +115460,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{ @@ -116012,6 +115482,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{ @@ -116022,6 +115510,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 @@ -116079,6 +115575,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" = ( @@ -116136,6 +115635,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 @@ -116149,6 +115658,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 @@ -116170,6 +115690,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" @@ -116208,11 +115742,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, @@ -116269,6 +115798,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, @@ -116317,6 +115872,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" @@ -116343,6 +115904,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 @@ -116388,6 +115961,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 @@ -116434,14 +116023,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) @@ -116714,6 +116308,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 @@ -116728,6 +116340,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, @@ -116787,12 +116402,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 @@ -116815,6 +116436,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 @@ -147088,8 +146713,8 @@ bYM caG ccn cee -cfV -chM +aaX +abc cjr cjs cmp @@ -147344,7 +146969,7 @@ bWD bYM caH cco -cef +aaU cfW chN cjs @@ -147356,7 +146981,7 @@ cqN cmt ctJ caH -cwq +abn cxV czD cBb @@ -147861,7 +147486,7 @@ ccq ceg ccq chO -ceg +abk ckQ cmr ccq @@ -148114,11 +147739,11 @@ bUt bWD bYM caH -ccr -ceh -cfY -chP -cjt +cwq +aaV +caG +caG +abl ckR cms cnO @@ -148369,12 +147994,12 @@ bDl bDl bUu bWE -bYO +aam +caG +aaK +cxV +aaY caG -ccs -cei -cfZ -chQ cjt ckR cms @@ -148626,22 +148251,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 @@ -148885,10 +148510,10 @@ bUn bWI bYM caG -cct -cej +aaL +cxV +aaZ caG -chS cjt ckR cms @@ -149142,11 +148767,11 @@ bUn bWD bYM caG -ccu -cek -cga -chT -cju +aaL +cxV +aaZ +caG +cjt ckR cms cnQ @@ -149399,10 +149024,10 @@ bUp bWD bYM caG -ccv -cel +aaM +cxV +aba caG -chU cjt ckR cmt @@ -149654,12 +149279,12 @@ bKv bSu bUn bWD -bYS +aaI caG -caG -caG -caG -chV +aaN +cxV +cmt +abd cjt ckT cmu @@ -149913,10 +149538,10 @@ bUx bWJ bYM caG -cct -cej -caG -chW +aaQ +xKp +cxV +abg cjt ckR cmt @@ -150170,20 +149795,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 @@ -150425,12 +150050,12 @@ bQu bQv bUm bWD -bYM +aaJ caG -ccv -cel -caG -chX +aaT +aaW +abb +abh cjt ckR chP @@ -150441,7 +150066,7 @@ csl ctO caG cwz -cyg +abt czO caG cCP @@ -155870,7 +155495,7 @@ dqT cPk cXD cPk -cUp +cPk dlR cPk cPk @@ -156127,10 +155752,10 @@ cXE dsn dtz dvb -dwF +dvb dyh dvb -dvb +nQQ dCx dDH dEQ @@ -156371,30 +155996,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 @@ -156630,28 +156255,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 @@ -156885,7 +156510,7 @@ cWj xJl cZt dbc -dcO +lYb dem dfw dgV @@ -156893,22 +156518,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 @@ -157149,23 +156774,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 @@ -157406,23 +157031,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 @@ -157660,26 +157285,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 @@ -157919,24 +157544,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 @@ -158178,21 +157803,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 @@ -158427,25 +158052,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 @@ -158690,22 +158315,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 @@ -158949,21 +158574,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 @@ -159204,23 +158829,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 @@ -159463,21 +159088,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 @@ -159718,24 +159343,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 @@ -159976,23 +159601,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 @@ -160236,20 +159861,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 @@ -160491,11 +160116,11 @@ diC dks dlY dnt -dpu -dri dsB dri dsB +dri +rYU dwW dyw dri @@ -160505,7 +160130,7 @@ dDU dFc dGu dHP -dJf +ekI dKm dLg dMI @@ -160748,22 +160373,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 85ba5f61aa4..19d45a9f889 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" = ( @@ -29713,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 @@ -29721,6 +29721,7 @@ /obj/item/radio/intercom{ pixel_x = 30 }, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/quartermaster/office) "bAQ" = ( @@ -47407,7 +47408,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, @@ -47415,6 +47415,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 61f9cf7dcbc..30b5c21e553 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" = ( @@ -42741,6 +42745,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 201bb8dd8f8..e8d7bbf67bf 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" = ( @@ -41193,7 +41190,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, @@ -41907,7 +41904,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) @@ -42298,7 +42295,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, @@ -42318,7 +42315,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, @@ -42379,7 +42376,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, @@ -68927,6 +68924,7 @@ dir = 8 }, /obj/structure/cable, +/obj/item/storage/box/shipping, /turf/open/floor/plasteel, /area/storage/primary) "dhM" = ( @@ -69205,7 +69203,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, @@ -72631,7 +72629,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 67a66a06642..9aa1258f06b 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" = ( 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/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/signals.dm b/code/__DEFINES/dcs/signals.dm index 08b31193143..e96bfb2e236 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -41,75 +41,80 @@ /// 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 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) +#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_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 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_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 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 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 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 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 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 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_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 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_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) ///////////////// @@ -132,29 +137,29 @@ // /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_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 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 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 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 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 @@ -264,6 +269,12 @@ #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(): () @@ -310,6 +321,8 @@ #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) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index e6c8211cb09..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,18 +30,14 @@ // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) -#define CLAMP(CLVALUE,CLMIN,CLMAX) clamp(CLVALUE, CLMIN, CLMAX) - // 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 -#define TAN(x) tan(x) // Cotangent -#define COT(x) (1 / TAN(x)) +#define COT(x) (1 / tan(x)) // Secant #define SEC(x) (1 / cos(x)) @@ -179,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 @@ -205,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/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/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/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/traits.dm b/code/__DEFINES/traits.dm index 299b829edec..269d41365b8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -259,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/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/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 88f5d5130e8..70a24287f3a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -850,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) @@ -864,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/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d70564bc151..01cdf38b265 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -140,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, @@ -216,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/_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/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/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 dcb03dcf50b..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") @@ -368,3 +371,19 @@ SUBSYSTEM_DEF(persistence) 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/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/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 cf98e7316e7..3c1913fdb38 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -334,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/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 7a03d87fc4d..984a298bef5 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -10,26 +10,38 @@ * 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 @@ -45,6 +57,7 @@ /** * 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,9 +382,13 @@ /** * 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(list/raw_args) 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/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/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/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/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/nanites.dm b/code/datums/components/nanites.dm index 64870dfca6d..15b5169bba3 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -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/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/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/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 fd2a82ce042..c138a2a377f 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -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/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..4cd81eaa973 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() diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index f74dcd0b6e1..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) @@ -44,7 +48,7 @@ /** * 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(list/arguments) var/datum/element/ele = SSdcs.GetElement(arguments) 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/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/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/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index dc95d24ea37..e67b30b3915 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -106,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 @@ -118,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 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/mutations/actions.dm b/code/datums/mutations/actions.dm index ac4bf863a73..1d27c35e776 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -342,11 +342,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/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/atoms.dm b/code/game/atoms.dm index f5845c25252..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 @@ -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) @@ -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/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 8179e7f227c..05780c4e776 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -174,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/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/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/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/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 7f19c69ca78..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) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 5cd21715164..44a5cc69c74 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -1051,7 +1051,7 @@ "desc" = "External armor is wrenched." ), 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.", @@ -1189,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 diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 98fb613af02..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() ..() @@ -295,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 c19561c22c5..04811e40a08 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -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 b197c758c97..c6f8422c6cf 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -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/items.dm b/code/game/objects/items.dm index 6eba8746a31..72636a127f1 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 @@ -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 082e02c587b..c385be7b793 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -203,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]" 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 0f9cdfbb014..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) . = ..() 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/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..e52cecc227c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -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 7133e4d56ab..a7456e5b286 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -115,7 +115,7 @@ update_icon() /obj/item/instrument/piano_synth/headphones/spacepods - name = "nanotrasen space pods" + name = "\improper Nanotrasen space pods" desc = "Flex your money, AND ignore what everyone else says, all at once!" icon_state = "spacepods" item_state = "spacepods" 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/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/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 24abd8fdc00..3a3bdec7ff2 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -250,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/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/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/kitchen.dm b/code/game/objects/items/kitchen.dm index 670b59f063d..a95683d9d21 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 a33d70fbf37..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" 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/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/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 41171ba8575..a543b45a859 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/boxes.dm b/code/game/objects/items/storage/boxes.dm index 93cac7e6b45..659fd936bd6 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1270,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/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/twohanded.dm b/code/game/objects/items/twohanded.dm index 8ecefff8186..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' diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index cdc16465bcf..529526dbd7f 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -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" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index eebcb395b61..bd57f992544 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 @@ -242,7 +242,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/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/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/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/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 092eda73383..4207dfc413f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -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 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/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/world.dm b/code/game/world.dm index fde55ed6749..a1af55a4fd3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -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/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/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 5cc9ce2ce0a..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) 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/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/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 807ec65b7e0..c81ba816ec5 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -21,7 +21,7 @@ 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.") 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/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 c388537aac2..4dcc90f9797 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -278,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/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/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/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 index 83d650e729b..1f6e4d43789 100644 --- a/code/modules/cargo/exports/organs.dm +++ b/code/modules/cargo/exports/organs.dm @@ -1,5 +1,5 @@ /datum/export/organ - include_subtypes = FALSE //Centcom doesn't need organs from non-humans. + include_subtypes = FALSE //CentCom doesn't need organs from non-humans. export_category = EXPORT_CONTRABAND /datum/export/organ/heart diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 276882e0f64..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 @@ -2280,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 6010d282bf1..01affdc3e9a 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -614,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/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/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/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/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/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index c512db31902..ec162f60e67 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -420,29 +420,17 @@ 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/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 e750889f8be..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 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_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_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/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/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 d0bbaea8b6b..5b37d8b5265 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -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 0f2b8d70613..87c9a769d1d 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -116,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 fc70e23645c..b11cf37f123 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -503,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/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/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/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 20f188715b9..63e69ac0cc0 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 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/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..cac062b25ff 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -149,7 +149,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 +160,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 +179,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 +198,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 +209,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 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d39b8ce59f0..29d38f40df8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -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..831ab383cd4 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]!", \ 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/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/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/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm index 11eb42c25b6..f55fa50b2b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -66,6 +66,9 @@ 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 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 954cd200999..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) 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/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/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/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/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 367aaca851f..64b211dac3e 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -21,8 +21,8 @@ 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 - - actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove) + 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. var/mob/living/carbon/human/affecting = null @@ -71,8 +71,7 @@ Contents: //Cell Init cell = new/obj/item/stock_parts/cell/high - cell.charge = 60000 // larger as it now heats - cell.maxcharge = 60000 + cell.charge = 9000 cell.name = "black power cell" cell.icon_state = "bscell" @@ -80,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/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/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/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 cf087e4eb8d..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 @@ -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 d9eb4ac9fb7..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 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/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 8e5985bd3a7..a82e3b946ab 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -164,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() @@ -385,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") @@ -463,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 989bdd03833..9f1357681da 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -336,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 @@ -375,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 @@ -405,14 +405,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //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 += 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) + 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) @@ -436,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 @@ -501,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) ) @@ -515,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)) @@ -531,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) @@ -939,7 +939,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/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 2ce2369f5b9..ab7a9ad61ae 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -65,7 +65,7 @@ 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 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/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/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 2ca43bca448..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 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/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 1fb04012245..88cd85f1c29 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -46,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) @@ -82,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" @@ -99,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 @@ -128,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) @@ -140,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 @@ -152,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 @@ -164,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 @@ -176,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 @@ -246,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) @@ -277,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) @@ -305,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 @@ -373,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) @@ -394,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) @@ -401,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) @@ -408,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. @@ -520,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 @@ -528,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) @@ -536,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) @@ -556,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 @@ -568,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) @@ -577,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)) @@ -605,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)) @@ -630,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 @@ -646,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 @@ -713,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)) @@ -737,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 @@ -748,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) @@ -767,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) @@ -776,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 @@ -785,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 @@ -808,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) @@ -816,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) @@ -823,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 @@ -844,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) @@ -893,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 @@ -912,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 d7b8f3958ec..59266b0c523 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -14,34 +14,61 @@ 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. - //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() + /// 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() @@ -54,96 +81,108 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) . = ..() 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 81d1b463707..5c0b69b4296 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -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 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 c04a1d618bd..e20191c3358 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -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 d067d2899ec..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" @@ -1214,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." @@ -1256,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 21d30148e4e..ffffd95e74a 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1932,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.") ..() diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index 1b85aa6bb2d..136cd443c9a 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -11,6 +11,10 @@ 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 @@ -21,6 +25,12 @@ 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 diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index c3e0186be74..ad60d2f6776 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -149,16 +149,6 @@ 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 - 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 - 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 results = list(/datum/reagent/medicine/granibitaluri = 3) required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/phenol = 1, /datum/reagent/nitrogen = 1) @@ -172,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/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index a69dbc86866..49815c5e8d8 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -244,7 +244,7 @@ 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 @@ -253,7 +253,7 @@ /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 @@ -265,7 +265,7 @@ 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 @@ -274,7 +274,7 @@ /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 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 7560cd0eba8..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,6 +86,48 @@ 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 ..() @@ -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 dcf9be28e91..79d8a1bfe2f 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -92,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 776722ee515..40d8dd409a2 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -728,14 +728,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" @@ -872,6 +864,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/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 208f562c12a..0a9f48021cb 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -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") 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 9f60ff84c69..0617edb55e3 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -8,10 +8,17 @@ display_name = "Basic Research Technology" description = "NT default research technologies." // Default research tech, prevents bricking +<<<<<<< HEAD design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "c-reader", "desttagger", "handlabel", "packagewrap", "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_rshot", "sec_beanbag_slug", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","plumbing_rcd","plastic_knife","plastic_fork","plastic_spoon") +======= + 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") +>>>>>>> upstream/master /datum/techweb_node/mmi id = "mmi" @@ -153,7 +160,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 @@ -1145,6 +1152,30 @@ 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..cc8c020152f 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -827,7 +827,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 +851,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) 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/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 e532631a3af..f107963ac8a 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -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/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 0cb92807c2b..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 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/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 b5dafecf530..791089924e1 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1369,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 \ 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/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/medical.dm b/code/modules/vending/medical.dm index cf574c2fda6..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, 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 51446c8c980..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, 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 4a950af3146..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 diff --git a/html/changelog.html b/html/changelog.html index 6dfe744a0c3..7fe7d16ce82 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,108 @@ -->
+

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:

    @@ -1608,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 8a875661a77..16424ac2c72 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -37316,3 +37316,77 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 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-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-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-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/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/clothing/back.dmi b/icons/mob/clothing/back.dmi index 55ba2a1a4a9..6a92b3b152f 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 09966df4ec3..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/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/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/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/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 7a3d72c8841..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 7ca524b29f6..0306177e7e4 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.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/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/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/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 89d8b5501e5..8a4e16357f6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -328,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" @@ -386,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" @@ -410,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" @@ -523,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" @@ -1015,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" @@ -1050,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" @@ -1772,6 +1778,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" @@ -2234,6 +2241,7 @@ #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" @@ -2319,6 +2327,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" @@ -2338,7 +2347,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" diff --git a/tgui/packages/tgui/interfaces/Canvas.js b/tgui/packages/tgui/interfaces/Canvas.js index 0955aedc3bf..b30639697c2 100644 --- a/tgui/packages/tgui/interfaces/Canvas.js +++ b/tgui/packages/tgui/interfaces/Canvas.js @@ -1,6 +1,6 @@ import { Fragment } from 'inferno'; import { useBackend } from '../backend'; -import { Box } from '../components'; +import { Box, Button } from '../components'; import { Component, createRef } from 'inferno'; import { pureComponentHooks } from 'common/react'; @@ -85,6 +85,12 @@ export const Canvas = props => { act("paint", { x, y })} /> - {data.name} + + {!data.finalized + && act("finalize")} + content="Finalize" />} + {data.name} + ); }; diff --git a/tgui/packages/tgui/interfaces/Electropack.js b/tgui/packages/tgui/interfaces/Electropack.js new file mode 100644 index 00000000000..4e6ebf1cb37 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Electropack.js @@ -0,0 +1,74 @@ +import { NumberInput, Button, Section, LabeledList } from '../components'; +import { useBackend } from '../backend'; +import { toFixed } from 'common/math'; + +export const Electropack = props => { + const { act, data } = useBackend(props); + const { + power, + code, + frequency, + minFrequency, + maxFrequency, + } = data; + + return ( +
+ + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosArcade.js b/tgui/packages/tgui/interfaces/NtosArcade.js index 73f4c3b9afe..73903d70042 100644 --- a/tgui/packages/tgui/interfaces/NtosArcade.js +++ b/tgui/packages/tgui/interfaces/NtosArcade.js @@ -50,7 +50,7 @@ export const NtosArcade = props => { {