diff --git a/.travis.yml b/.travis.yml
index f570dc21032..16938652cf6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,8 +2,13 @@
language: c
env:
- BYOND_MAJOR="503"
- BYOND_MINOR="1224"
+ global:
+ - BYOND_MAJOR="504"
+ - BYOND_MINOR="1232"
+ matrix:
+ - DM_MAPFILE="tgstation2"
+ - DM_MAPFILE="metastation"
+ - DM_MAPFILE="ministation"
before_install:
- sudo apt-get update -qq
@@ -17,4 +22,4 @@ install:
- cd ..
script:
- - DreamMaker tgstation.dme
+ - bash dm.sh -M${DM_MAPFILE} tgstation.dme
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000000..2c7ea1b18ff
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,90 @@
+#CONTRIBUTING
+
+
+##Introduction
+
+Hello and welcome to /tg/station's contributing page. You are here because you are curious or interested in contributing. Thanks for being interested. Everyone is free to contribute to this project as long as they follow the simple guidelines and specifications below, because at /tg/station, we have a goal to increase code maintainability and to do that we are going to need all pull requests to hold up to those specifications. This is in order for all of us to benefit, instead of having to fix the same bug more than once because of duplicated code.
+
+But first we want to make it clear how you can contribute, if contributing is a new experience for you, and what powers the team has over your pull request so you do not get any surprises when submitting pull requests, and it is closed for a reason you did not anticipate.
+
+##Getting Started
+
+At /tg/station we do not have a list of goals and features to add, we instead allow freedom for contributors to suggest and create their ideas for the game. That does not mean we aren't determined to squash bugs, which unfortunately pop up a lot due to the deep complexity of the game. Here are some useful getting started guides, if you want to contribute or if you want to know what challenges you can tackle with zero knowledge about the game's code structure.
+
+We have a [list of guides on the wiki](http://www.tgstation13.org/wiki/index.php/Guides#Development_and_Contribution_Guides) which will help you get started contributing to /tg/station with git and Dream Maker. For beginners, it is recommended you work on small projects, at first. There is an easy list of issues which are [contributor friendly, here](https://github.com/tgstation/-tg-station/issues?labels=Contributor+Friendly&page=1&state=open).
+
+You can of course, as always, ask for help at [#coderbus](irc://irc.rizon.net/coderbus) on irc.rizon.net. We are just here to have fun and help so do not expect professional support please.
+
+##Meet the Team
+
+**Project Leads**
+
+Project Leads, which are elected by the maintainers and members of the project, have complete control over what goes through and what is reverted. They are encouraged to take control in what features are added to the game. Project Leads can also act as Project Managers when needed.
+
+**Project Managers**
+
+Project Managers are responsible for recruiting and firing maintainers, enforcing coding standards, and reverting changes that should have not been committed. Project Managers are assigned by Project Leads. On things that Project Managers disagree on they are to refer to the Project Leads for advice. It is encouraged that if you do not want to waste time working on a feature, that might be denied, that you ask a Project Manager first.
+
+**Maintainers**
+
+Maintainers are quality control. If a proposed pull request does not meet the mentioned quality specifications then it can be closed if you fail to satisfy them. Maintainers are required to give a reason for closing the pull request.
+
+Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications.
+
+##Specification
+
+As mentioned before, you are expected to follow these specifications in order to make everyone's lives easier, it will also save you and us time, with having to make the changes and us having to tell you what to change. Thank you for reading this section.
+
+* As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it. If you are unfamiliar with this concept, it is highly recommended you look it up.
+
+* You must write BYOND code with absolute pathing, like so:
+
+```C++
+
+/obj/item/weapon/baseball_bat
+ name = "baseball bat"
+ desc = "A baseball bat."
+ var/wooden = 1
+
+/obj/item/weapon/baseball_bat/examine()
+ if(wooden)
+ desc = "A wooden baseball bat."
+ else
+ desc = "A metal baseball bat."
+ ..()
+
+```
+
+* You must not use colons to override safety checks on an object's variable/function, instead of using proper type casting.
+
+* It is rarely allowed to put type paths in a text format, as they is no compile errors if the type path no longer exists. Here is an example:
+
+```C++
+//Good
+var/path_type = /obj/item/weapon/baseball_bat
+
+//Bad
+var/path_type = "/obj/item/weapon/baseball_bat"
+```
+
+* You must use tabs to indent your code, NOT SPACES.
+
+* Hacky code, such as adding specific checks, is highly discouraged and only allowed when there is no other option. You can avoid hacky code by using object oriented methodologies, such as overriding a function (called procs in DM) or sectioning code into functions and then overriding them as required.
+
+* Duplicated code is 99% of the time never allowed. Copying code from one place to another maybe suitable for small short time projects but /tg/station focuses on the long term and thus discourages this. Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily.
+
+* Code should be modular where possible, if you are working on a new class then it is best if you put it in a new file.
+
+* Bloated code may be necessary to add a certain feature, which means there has to be a judgement over whether the feature is worth having or not. You can help make this decision easier by making sure your code is modular.
+
+* You are expected to help maintain the code that you add, meaning if there is a problem then you are likely to be approached in order to fix any issues, runtimes or bugs.
+
+##Pull Request Process
+
+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 nice. Here are some helpful ways to make it easier for you and for the maintainer when making a pull request.
+
+* 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.
+
+* If you are proposing multiple changes, which change many different aspects of the code, you are expected to section them off into different pull requests in order to make it easier to review them and to deny/accept the changes that are deemed acceptable.
+
+* If your pull request is accepted, the code you add is no longer exclusively yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly told but there have been cases where this would've saved some trouble.
diff --git a/README.md b/README.md
index 31753b06a42..d33d361b9af 100644
--- a/README.md
+++ b/README.md
@@ -98,81 +98,8 @@ Instructions for bot setup are included in the /bot folder along with the script
itself
#CONTRIBUTING
-Everyone is free to contribute to this project as long as they follow these simple guidelines and specifications.
-**Introduction**
-
-As a goal to increase code maintainability we are going to be requiring all pull requests to hold up to the standards mentioned below. This is in order for all of us to benefit, instead of having to fix the same bug more than once because of duplicated code.
-
-But first we want to make it clear over what powers the maintainers have over your pull request, so you do not get any surprises when submitting pull requests and it is closed for a reason you did not suspect.
-
-**Project Leads**
-
-Project Leads, which are elected by the maintainers and members of the project, have complete control over what goes through and what is reverted. They are encouraged to take control in what features are added to the game. Project Leads can also act as Project Managers when needed.
-
-**Project Managers**
-
-Project Managers are responsible for recruiting and firing maintainers, enforcing coding standards, and reverting changes that should have not been committed. Project Managers are assigned by Project Leads. On things that Project Managers disagree on they are to refer to the Project Leads for advice. It is encouraged that if you do not want to waste time working on a feature, that might be denied, that you ask a Project Manager first.
-
-**Maintainers**
-
-Maintainers are quality control. If a proposed pull request does not meet the mentioned quality specifications then it can be closed if you fail to satisfy them. Maintainers are required to give a reason for closing the pull request.
-
-Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications.
-
-**Specification**
-
-As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it.
-
-You must write BYOND code with absolute pathing, like so:
-
-```C++
-
-/obj/item/weapon/baseball_bat
- name = "baseball bat"
- desc = "A baseball bat."
- var/wooden = 1
-
-/obj/item/weapon/baseball_bat/examine()
- if(wooden)
- desc = "A wooden baseball bat."
- else
- desc = "A metal baseball bat."
- ..()
-
-```
-
-You must not use colons to override safety checks on an object's variable/function, instead of using proper type casting.
-
-It is rarely allowed to put type paths in a text format, as they is no compile errors if the type path no longer exists.
-
-You must use tabs to indent your code.
-
-Hacky code, such as adding specific checks, is highly discouraged and only allowed when there is no other option. You can avoid hacky code by using object oriented methodologies, such as overriding a function (called procs in DM) or sectioning code into functions and then overriding them as required.
-
-Duplicated code is 99% of the time never allowed. Copying code from one place to another maybe suitable for small short time projects but /tg/station focuses on the long term and thus discourages this. Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily.
-
-Code should be modular where possible, if you are working on a new class then it is best if you put it in a new file.
-
-Bloated code may be necessary to add a certain feature, which means there has to be a judgement over whether the feature is worth having or not. You can help make this decision easier by making sure your code is modular.
-
-You are expected to help maintain the code that you add, meaning if there is a problem then you are likely to be approached in order to fix any issues, runtimes or bugs.
-
-**Other Requirements/Information**
-
-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.
-
-You are expected to document all your changes in the pull request, failing to do so will risk delaying it. 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.
-
-If you are proposing multiple changes, which change many different aspects of the code, you are to section them off into different pull requests in order to easily review them and to deny/accept the changes that are deemed acceptable.
-
-If your pull request is accepted, the code you add is no longer yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a Project Lead.
-
-**Getting Started**
-
-We have a [list of guides on the wiki](http://www.tgstation13.org/wiki/index.php/Guides#Development_and_Contribution_Guides) which will help you get started contributing to /tg/station with git and Dream Maker.
-
-For beginners, it is recommended you work on small projects, at first. There is an easy list of issues which are [contributor friendly, here](https://github.com/tgstation/-tg-station/issues?labels=Contributor+Friendly&page=1&state=open).
+Please see [CONTRIBUTING.md](CONTRIBUTING.md)
#LICENSE
diff --git a/_maps/map_files/MetaStation.v39K.dmm b/_maps/map_files/MetaStation.v39K.dmm
index 85d87c7d053..e97892f1830 100644
--- a/_maps/map_files/MetaStation.v39K.dmm
+++ b/_maps/map_files/MetaStation.v39K.dmm
@@ -747,7 +747,7 @@
"aos" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/brig)
"aot" = (/obj/structure/closet/crate,/obj/item/stack/sheet/glass{amount = 10},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/space)
"aou" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aov" = (/obj/item/clothing/gloves/rainbow,/obj/item/clothing/shoes/rainbow,/obj/item/clothing/under/rainbow,/obj/item/clothing/head/soft/rainbow,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aov" = (/obj/item/clothing/gloves/rainbow,/obj/item/clothing/shoes/sneakers/rainbow,/obj/item/clothing/under/rainbow,/obj/item/clothing/head/soft/rainbow,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aow" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
"aox" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aoy" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/disposal)
@@ -1335,7 +1335,7 @@
"azI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/module/power_control,/obj/item/weapon/stock_parts/cell{maxcharge = 2000},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"azJ" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32; supply_display = 1},/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"azK" = (/obj/structure/closet/secure_closet/brig{anchored = 1},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
-"azL" = (/obj/structure/rack,/obj/machinery/flasher{id = "holdingflash"; pixel_x = 25},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/shoes/orange,/obj/item/clothing/shoes/orange,/obj/item/clothing/shoes/orange,/obj/item/clothing/shoes/orange,/obj/item/clothing/shoes/orange,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig)
+"azL" = (/obj/structure/rack,/obj/machinery/flasher{id = "holdingflash"; pixel_x = 25},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/under/color/orange{pixel_x = 1; pixel_y = -1},/obj/item/clothing/shoes/sneakers/orange,/obj/item/clothing/shoes/sneakers/orange,/obj/item/clothing/shoes/sneakers/orange,/obj/item/clothing/shoes/sneakers/orange,/obj/item/clothing/shoes/sneakers/orange,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig)
"azM" = (/obj/structure/closet/secure_closet/brig{anchored = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"azN" = (/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"})
"azO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
@@ -6537,7 +6537,7 @@
"cvK" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
"cvL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/assembly/robotics)
"cvM" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"cvN" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/bible,/turf/simulated/floor/carpet,/area/chapel/main)
+"cvN" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/book/bible,/turf/simulated/floor/carpet,/area/chapel/main)
"cvO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
"cvP" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/storage/fancy/candle_box{pixel_x = -2; pixel_y = 2},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/carpet,/area/chapel/main)
"cvQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -6691,7 +6691,7 @@
"cyI" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/genetics)
"cyJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology)
"cyK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"cyL" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bible,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
+"cyL" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/book/bible,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"cyM" = (/obj/structure/closet/l3closet,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
"cyN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cyO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
@@ -7555,7 +7555,7 @@
"cPo" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/escape/centcom)
"cPp" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cPq" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
-"cPr" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bible,/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Chapel - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
+"cPr" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/book/bible,/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Chapel - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cPs" = (/obj/item/device/radio/intercom{pixel_y = -25},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cPt" = (/obj/structure/table,/obj/item/trash/popcorn,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology)
"cPu" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/tie/waistcoat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding)
@@ -7767,12 +7767,12 @@
"cTs" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"cTt" = (/obj/effect/decal/cleanable/blood,/mob/living/carbon/monkey,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"cTu" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
-"cTv" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cTv" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cTw" = (/turf/unsimulated/wall,/area/tdome/tdomeadmin)
"cTx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"cTy" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"cTz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cTA" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cTA" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cTB" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
"cTC" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
"cTD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
@@ -8010,7 +8010,7 @@
"cYb" = (/turf/simulated/floor/airless{dir = 10; icon_state = "warning"},/area/tcommsat/chamber)
"cYc" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/bridge/access)
"cYd" = (/turf/simulated/floor/airless{dir = 6; icon_state = "warning"},/area/tcommsat/chamber)
-"cYe" = (/obj/structure/table/woodentable,/obj/item/weapon/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
+"cYe" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
"cYf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/chamber)
"cYg" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor,/area/tcommsat/chamber)
"cYh" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/chamber)
@@ -9378,9 +9378,9 @@
"dyr" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/wizard_station)
"dys" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"dyt" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
-"dyu" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"dyu" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"dyv" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
-"dyw" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"dyw" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"dyx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/wizard_station)
"dyy" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/wizard_station)
"dyz" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/wizard_station)
@@ -10217,7 +10217,7 @@
"dOy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/mine/west_outpost)
"dOz" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/mine/west_outpost)
"dOA" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/mine/west_outpost)
-"dOB" = (/obj/machinery/mineral/equipment_locker,/turf/simulated/floor,/area/mine/living_quarters)
+"dOB" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor,/area/mine/living_quarters)
"dOC" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/mine/production)
"dOD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"dOE" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1},/turf/simulated/floor,/area/mine/west_outpost)
@@ -10487,7 +10487,7 @@
"dTI" = (/obj/structure/closet/crate,/obj/machinery/alarm{pixel_y = 28},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/production)
"dTJ" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/mine/production)
"dTK" = (/obj/machinery/mineral/mint{input_dir = 4},/turf/simulated/floor,/area/mine/production)
-"dTL" = (/obj/machinery/mineral/equipment_locker,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/production)
+"dTL" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/production)
"dTM" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/production)
"dTN" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/mine/living_quarters)
"dTO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/production)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 052b83b8a64..b9c13374446 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -193,7 +193,7 @@
"adK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"adL" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"adM" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"adN" = (/obj/machinery/mineral/equipment_locker,/turf/simulated/floor{icon_state = "browncorner"; dir = 8},/area/quartermaster/storage)
+"adN" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor{icon_state = "browncorner"; dir = 8},/area/quartermaster/storage)
"adO" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/storage)
"adP" = (/obj/effect/landmark/start{name = "Cargo Tech"},/turf/simulated/floor,/area/quartermaster/storage)
"adQ" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/quartermaster/storage)
@@ -2257,21 +2257,21 @@
"aRu" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
"aRv" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station)
"aRw" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
-"aRx" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"aRx" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"aRy" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"aRz" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"aRA" = (/obj/machinery/door/poddoor{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome)
"aRB" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome)
"aRC" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome)
"aRD" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
-"aRE" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"aRE" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"aRF" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"aRG" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"aRH" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"aRI" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/grenade/syndieminibomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"aRJ" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"aRK" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"aRL" = (/obj/structure/table/woodentable,/obj/item/weapon/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
+"aRL" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
"aRM" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station)
"aRN" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station)
"aRO" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -2323,12 +2323,12 @@
"aSI" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"aSJ" = (/obj/effect/decal/cleanable/blood,/mob/living/carbon/monkey,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"aSK" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
-"aSL" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"aSL" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"aSM" = (/turf/unsimulated/wall,/area/tdome/tdomeadmin)
"aSN" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeadmin)
"aSO" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeadmin)
"aSP" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeadmin)
-"aSQ" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"aSQ" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"aSR" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"aSS" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
"aST" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm
index 3b7693e3b34..41c46fae5ff 100644
--- a/_maps/map_files/tgstation.2.1.3.dmm
+++ b/_maps/map_files/tgstation.2.1.3.dmm
@@ -96,8 +96,8 @@
"abR" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison)
"abS" = (/obj/machinery/deployable/barrier,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
"abT" = (/obj/machinery/deployable/barrier,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera/motion{c_tag = "Armory Motion Sensor"; dir = 2; name = "motion-sensitive security camera"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
-"abU" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
-"abV" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
+"abU" = (/obj/machinery/door_control{id = "briggate"; name = "Brig Lockdown"; pixel_x = -26; pixel_y = 6; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
+"abV" = (/obj/machinery/suit_storage_unit/security,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
"abW" = (/obj/structure/rack,/obj/item/weapon/storage/lockbox/loyalty,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
"abX" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
"abY" = (/obj/structure/rack,/obj/item/weapon/shield/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory)
@@ -276,7 +276,7 @@
"afp" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
"afq" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
"afr" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/brig)
-"afs" = (/obj/machinery/flasher{id = "brigentry"; pixel_x = 26},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig)
+"afs" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/hallway/secondary/exit)
"aft" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{icon_state = "red"},/area/security/main)
"afu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig)
"afv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig)
@@ -293,7 +293,7 @@
"afG" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/main)
"afH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/security/main)
"afI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/security/main)
-"afJ" = (/obj/machinery/door_control{id = "briggate"; name = "Brig Lockdown"; pixel_x = -26; pixel_y = 6; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/flasher_button{id = "brigentry"; pixel_x = -26; pixel_y = -6},/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
+"afJ" = (/obj/machinery/light{dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/hallway/secondary/exit)
"afK" = (/obj/machinery/flasher{id = "insaneflash"; pixel_x = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor{icon_state = "white"},/area/security/prison)
"afL" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig)
"afM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden)
@@ -1066,7 +1066,7 @@
"auz" = (/obj/machinery/door/poddoor/preopen{id = "maint3"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"auA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/electrical)
"auB" = (/obj/machinery/power/apc{dir = 1; name = "Electrical Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"auC" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"auC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access_txt = "16"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"auD" = (/obj/structure/table,/obj/item/clothing/gloves/fyellow,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical)
"auE" = (/obj/machinery/door/airlock/external{name = "Escape Pod One"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"auF" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/hallway/secondary/entry)
@@ -1585,7 +1585,7 @@
"aEy" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/ai_monitored/nuke_storage)
"aEz" = (/obj/machinery/door/airlock/vault{icon_state = "door_locked"; locked = 1; req_access_txt = "53"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/ai_monitored/nuke_storage)
"aEA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/ai_monitored/nuke_storage)
-"aEB" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/nuke_storage)
+"aEB" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plating,/area/security/prison)
"aEC" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/nuke_storage)
"aED" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aEE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/gateway)
@@ -1967,7 +1967,7 @@
"aLQ" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"},/obj/machinery/camera{c_tag = "Kitchen Cold Room"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aLR" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aLS" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
-"aLT" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/hallway/secondary/exit)
+"aLT" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Command)"; pixel_x = -28},/obj/machinery/suit_storage_unit/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"aLU" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aLV" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/machinery/camera{c_tag = "Hydroponics Storage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aLW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
@@ -2493,7 +2493,7 @@
"aVW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
"aVX" = (/obj/machinery/power/apc{dir = 1; name = "Port Emergency Storage APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
"aVY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
-"aVZ" = (/obj/item/clothing/gloves/rainbow,/obj/item/clothing/shoes/rainbow,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/clothing/under/rainbow,/obj/item/clothing/head/soft/rainbow,/turf/simulated/floor/plating,/area/maintenance/port)
+"aVZ" = (/obj/item/clothing/gloves/rainbow,/obj/item/clothing/shoes/sneakers/rainbow,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/clothing/under/rainbow,/obj/item/clothing/head/soft/rainbow,/turf/simulated/floor/plating,/area/maintenance/port)
"aWa" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/storage/tools)
"aWb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/tools)
"aWc" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/item/device/multitool,/turf/simulated/floor,/area/storage/tools)
@@ -2672,9 +2672,9 @@
"aZt" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/library)
"aZu" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/library)
"aZv" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library)
-"aZw" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/library)
-"aZx" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/library)
-"aZy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library)
+"aZw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/library)
+"aZx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/library)
+"aZy" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/library)
"aZz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"aZA" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/chapel/main)
"aZB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
@@ -2735,7 +2735,7 @@
"baE" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor,/area/hydroponics)
"baF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics)
"baG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/starboard)
-"baH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/library)
+"baH" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/library)
"baI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/chapel/main)
"baJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/chapel/main)
"baK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/chapel/main)
@@ -2772,7 +2772,7 @@
"bbp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/preopen{id = "heads_meeting"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/bridge/meeting_room)
"bbq" = (/turf/simulated/floor,/area/engine/gravity_generator)
"bbr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor,/area/engine/gravity_generator)
-"bbs" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/turf/simulated/floor,/area/engine/gravity_generator)
+"bbs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/library)
"bbt" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bbu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bbv" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
@@ -2788,7 +2788,7 @@
"bbF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/starboard)
"bbG" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/starboard)
"bbH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard)
-"bbI" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard)
+"bbI" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/starboard)
"bbJ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/starboard)
"bbK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/starboard)
"bbL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/starboard)
@@ -3090,9 +3090,9 @@
"bhv" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; dir = 1; freq = 1400; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/bridge/meeting_room)
"bhw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bhx" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bhy" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"bhy" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "11"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator)
"bhz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
-"bhA" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/space/captain,/obj/item/clothing/head/helmet/space/capspace,/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Command)"; pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bhA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering)
"bhB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bhC" = (/obj/machinery/computer/card,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bhD" = (/obj/structure/table/woodentable,/obj/machinery/recharger,/obj/item/weapon/melee/chainofcommand,/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -3259,11 +3259,11 @@
"bkI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bkJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bkK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/bluespace_beacon,/turf/simulated/floor,/area/teleporter)
-"bkL" = (/obj/machinery/computer/upload/borg,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bkL" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard)
"bkM" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bkN" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "11;23"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator)
+"bkN" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator)
"bkO" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table,/obj/item/device/radio/beacon,/turf/simulated/floor,/area/teleporter)
-"bkP" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/gravity_generator)
+"bkP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/gravity_generator)
"bkQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
"bkR" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = null; req_access_txt = "20"},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bkS" = (/obj/machinery/door/airlock/maintenance{name = "Captain's Office Maintenance"; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/crew_quarters/captain)
@@ -3333,7 +3333,7 @@
"bme" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/crew_quarters/heads)
"bmf" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bmg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/gravity_generator)
-"bmh" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator)
+"bmh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass_engineering{name = "Gravity Generator"; req_access_txt = "11"; req_one_access_txt = "0"},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator)
"bmi" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload)
"bmj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator)
"bmk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/captain)
@@ -3822,7 +3822,7 @@
"bvz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint/supply)
"bvA" = (/obj/machinery/camera{c_tag = "Cargo Bay Entrance"; dir = 4; network = list("SS13")},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central)
"bvB" = (/obj/machinery/door/poddoor/shutters/preopen{id = "hopqueue"; name = "HoP Queue Shutters"},/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central)
-"bvC" = (/obj/machinery/flasher{id = "hopflash"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central)
+"bvC" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bvD" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
"bvE" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1},/turf/simulated/floor,/area/crew_quarters/heads)
"bvF" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor,/area/crew_quarters/heads)
@@ -3901,7 +3901,7 @@
"bxa" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/supply)
"bxb" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint/supply)
"bxc" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/crew_quarters/heads)
-"bxd" = (/obj/machinery/door/airlock/glass_command{name = "Gravity Generator Area"; req_access_txt = "11; 23"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator)
+"bxd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"bxe" = (/obj/machinery/camera{c_tag = "Engineering Escape Pod"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering)
"bxf" = (/obj/structure/sign/pods{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engineering)
"bxg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/teleporter)
@@ -4181,7 +4181,9 @@
"bCu" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft)
"bCv" = (/turf/simulated/wall,/area/maintenance/aft)
"bCw" = (/turf/simulated/wall,/area/storage/tech)
+"bCx" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/paper/range,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/toxins/misc_lab)
"bCy" = (/obj/structure/table,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
+"bCz" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser/practice,/obj/item/clothing/ears/earmuffs,/turf/simulated/floor,/area/toxins/misc_lab)
"bCA" = (/turf/simulated/wall,/area/janitor)
"bCB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/janitor)
"bCC" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/janitor)
@@ -5304,7 +5306,7 @@
"bYb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab)
"bYc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab)
"bYd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab)
-"bYe" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/gun/energy/laser/practice,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/toxins/misc_lab)
+"bYe" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/engine/engineering)
"bYf" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab)
"bYg" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; name = "Armory Desk"; req_access_txt = "3"},/obj/machinery/door/window/eastleft{name = "Reception Desk"; req_access_txt = "1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/ai_monitored/security/armory)
"bYh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab)
@@ -5334,7 +5336,7 @@
"bYF" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/structure/closet/secure_closet/security/engine,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/engineering)
"bYG" = (/obj/structure/filingcabinet,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint/engineering)
"bYH" = (/obj/structure/closet/fireaxecabinet{pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/atmos)
-"bYI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/item/weapon/watertank/atmos,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos)
+"bYI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"bYJ" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/atmos)
"bYK" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/atmos)
"bYL" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
@@ -5349,7 +5351,7 @@
"bYU" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology)
"bYV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/virology)
"bYW" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"bYX" = (/obj/machinery/flasher{id = "escape_flasher"; pixel_x = -6; pixel_y = 24},/obj/machinery/light{dir = 1},/obj/machinery/flasher_button{id = "escape_flasher"; pixel_x = 6; pixel_y = 24},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/hallway/secondary/exit)
+"bYX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering Power Storage"},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering)
"bYY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"bYZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bZa" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
@@ -5363,7 +5365,7 @@
"bZi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab)
"bZj" = (/obj/machinery/door/airlock/glass_research{name = "Firing Range"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab)
"bZk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/misc_lab)
-"bZl" = (/obj/structure/closet/crate,/obj/item/clothing/under/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bZl" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bZm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"bZn" = (/obj/machinery/atmospherics/pipe/simple/insulated{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
"bZo" = (/obj/machinery/atmospherics/binary/pump{dir = 4; icon_state = "intact_on"; on = 1},/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 24; pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator)
@@ -5416,7 +5418,7 @@
"caj" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab)
"cak" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab)
"cal" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/toxins/misc_lab)
-"cam" = (/obj/structure/rack,/turf/simulated/floor,/area/toxins/misc_lab)
+"cam" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"can" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cao" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cap" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
@@ -5763,7 +5765,7 @@
"cgS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"cgT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"cgU" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cgV" = (/obj/structure/bookcase/manuals/engineering,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cgV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering)
"cgW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cgX" = (/obj/machinery/light{dir = 1},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cgY" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -5828,7 +5830,7 @@
"cif" = (/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cig" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cih" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cii" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/elite,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cii" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/engine/engineering)
"cij" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"cik" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cil" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
@@ -5938,12 +5940,12 @@
"ckl" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
"ckm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
"ckn" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"cko" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/engine/engineering)
-"ckp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
-"ckq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering Power Storage"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/engineering)
+"cko" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor,/area/engine/engineering)
+"ckp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"ckq" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
"ckr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engineering)
-"cks" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
-"ckt" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cks" = (/obj/structure/dispenser,/turf/simulated/floor,/area/engine/engineering)
+"ckt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
"cku" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckv" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckw" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -5969,9 +5971,9 @@
"ckQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"ckR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"ckS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"ckT" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
+"ckT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
"ckU" = (/turf/simulated/floor,/area/engine/engineering)
-"ckV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/engine/engineering)
+"ckV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
"ckW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -6008,10 +6010,10 @@
"clD" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/module/power_control,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/engine/engineering)
"clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/table,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/engine/engineering)
"clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering)
-"clG" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/turf/simulated/floor,/area/engine/engineering)
-"clH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/dispenser,/turf/simulated/floor,/area/engine/engineering)
-"clI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig,/turf/simulated/floor,/area/engine/engineering)
-"clJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
+"clG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
+"clH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
+"clI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
+"clJ" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_y = 30},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"clK" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"clL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/chiefs_office)
"clM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -6052,10 +6054,10 @@
"cmv" = (/turf/simulated/wall,/area/engine/engineering)
"cmw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
"cmx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
-"cmy" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering)
+"cmy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"cmz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"cmA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
-"cmB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
+"cmB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
"cmC" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering)
"cmD" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cmE" = (/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
@@ -6087,9 +6089,9 @@
"cne" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cnf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/engivend,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cng" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/tool,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
-"cnh" = (/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
-"cni" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
-"cnj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
+"cnh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cni" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
+"cnj" = (/obj/machinery/suit_storage_unit/ce,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/engine/chiefs_office)
"cnk" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cnl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
"cnm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
@@ -6118,7 +6120,7 @@
"cnJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cnK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cnL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"cnM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
+"cnM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cnN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cnO" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"cnP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
@@ -6992,7 +6994,7 @@
"cEz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cEA" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cEB" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"cEC" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/aisat)
+"cEC" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/aisat)
"cED" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"cEE" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"cEF" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/tdome/tdomeobserve)
@@ -7098,20 +7100,20 @@
"cGB" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
"cGC" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station)
"cGD" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
-"cGE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cGE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cGF" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cGG" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"cGH" = (/obj/machinery/door/poddoor{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome)
"cGI" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome)
"cGJ" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome)
"cGK" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
-"cGL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cGL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cGM" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cGN" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cGO" = (/obj/structure/table,/obj/item/device/sbeacondrop/bomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cGP" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"cGQ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"cGR" = (/obj/structure/table/woodentable,/obj/item/weapon/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
+"cGR" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
"cGS" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station)
"cGT" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station)
"cGU" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -7167,12 +7169,12 @@
"cHS" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"cHT" = (/obj/effect/decal/cleanable/blood,/mob/living/carbon/monkey,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"cHU" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
-"cHV" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cHV" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cHW" = (/turf/unsimulated/wall,/area/tdome/tdomeadmin)
"cHX" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeadmin)
"cHY" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeadmin)
"cHZ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeadmin)
-"cIa" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"cIa" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"cIb" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"cIc" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
"cId" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
@@ -8600,8 +8602,8 @@
"djv" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/mine/living_quarters)
"djw" = (/turf/simulated/floor,/area/mine/living_quarters)
"djx" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/living_quarters)
-"djy" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/eva)
-"djz" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/mine/eva)
+"djy" = (/obj/machinery/suit_storage_unit/atmos,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos)
+"djz" = (/obj/machinery/flasher_button{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"djA" = (/obj/machinery/light,/turf/simulated/floor/plating/asteroid/airless,/area/mine/explored)
"djB" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor,/area/mine/west_outpost)
"djC" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor,/area/mine/west_outpost)
@@ -8923,8 +8925,8 @@
"dpG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/item/weapon/wrench,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/medical/virology)
"dpH" = (/turf/simulated/wall,/area/aisat)
"dpI" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
-"dpJ" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/aisat)
-"dpK" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/aisat)
+"dpJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/aisat)
+"dpK" = (/obj/machinery/recharge_station,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/aisat)
"dpL" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor{dir = 5; icon_state = "yellow"},/area/aisat)
"dpM" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/device/flashlight,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dpN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -8936,17 +8938,17 @@
"dpT" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dpU" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dpV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2)
-"dpW" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/aisat)
+"dpW" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/turf/simulated/floor{dir = 5; icon_state = "yellow"},/area/aisat)
"dpX" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area)
"dpY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/aisat)
"dpZ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat)
-"dqa" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor,/area/aisat)
-"dqb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/valve{dir = 4; layer = 2},/turf/simulated/floor,/area/aisat)
+"dqa" = (/obj/machinery/power/apc{dir = 8; name = "MiniSat APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/aisat)
+"dqb" = (/obj/machinery/atmospherics/binary/pump{dir = 0; icon_state = "intact_on"; name = "Air Out"; on = 1},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/aisat)
"dqc" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor,/area/aisat)
"dqd" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/aisat)
"dqe" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat)
"dqf" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
-"dqg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor,/area/aisat)
+"dqg" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/aisat)
"dqh" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
"dqi" = (/obj/structure/window/reinforced,/turf/space,/area)
"dqj" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area)
@@ -8964,7 +8966,7 @@
"dqv" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"dqw" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"dqx" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/camera{c_tag = "MiniSat Exterior South West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat)
-"dqy" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/wall/r_wall,/area/aisat)
+"dqy" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat)
"dqz" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"dqA" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"dqB" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
@@ -8986,7 +8988,7 @@
"dqR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/aisat)
"dqS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat)
"dqT" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
-"dqU" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/ai)
+"dqU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/ai)
"dqV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"dqW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"dqX" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
@@ -8995,14 +8997,14 @@
"dra" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/camera{c_tag = "MiniSat Exterior North West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat)
"drb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/assembly/chargebay)
"drc" = (/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"drd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"drd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"dre" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drf" = (/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior)
"drg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"drh" = (/obj/machinery/bot/secbot/beepsky{auto_patrol = 0; desc = "It's Officer Pingsky! Loyal, vigilent and lonely."; name = "Officer Pingsky"},/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior)
"dri" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "MiniSat Exterior North East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat)
-"drk" = (/obj/machinery/camera/motion{c_tag = "MiniSat Antechamber"; dir = 1; network = list("MiniSat")},/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior)
+"drk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/gravity_generator)
"drl" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
"drm" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drn" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
@@ -9029,9 +9031,9 @@
"drI" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/aisat)
"drJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area)
"drK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"drL" = (/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_one_access_txt = "65"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"drL" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_one_access_txt = "65"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"drN" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_one_access_txt = "65"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"drN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor,/area/engine/gravity_generator)
"drO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area)
"drP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
"drQ" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area)
@@ -9058,8 +9060,8 @@
"dsl" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/camera{c_tag = "MiniSat Entrance"; dir = 2; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor,/area/aisat)
"dsm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/securearea,/turf/simulated/wall,/area/aisat)
"dsn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/aisat)
-"dso" = (/obj/machinery/light,/obj/machinery/camera/motion{c_tag = "MiniSat Teleport Room"; dir = 8; name = "motion-sensitive security camera"; network = list("SS13","RD","MiniSat")},/obj/machinery/teleport/hub,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat)
-"dsp" = (/obj/machinery/door_control{id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "17;65"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor,/area/aisat)
+"dso" = (/obj/machinery/door_control{id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "17;65"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/obj/machinery/camera{c_tag = "MiniSat Teleporter"; dir = 1; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor,/area/aisat)
+"dsp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/aisat)
"dsq" = (/obj/machinery/door/poddoor/shutters{id = "teledoor"; name = "AI Satellite Teleport Access"},/turf/simulated/floor,/area/aisat)
"dsr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor,/area/aisat)
"dss" = (/obj/structure/transit_tube{dir = 1; icon_state = "Block"; tag = "icon-Block (NORTH)"},/obj/machinery/light,/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/aisat)
@@ -9067,9 +9069,9 @@
"dsu" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor,/area/aisat)
"dsv" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat)
"dsw" = (/obj/structure/transit_tube/station{dir = 4; icon_state = "closed"; reverse_launch = 1; tag = "icon-closed (EAST)"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/aisat)
-"dsx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/flora/kirbyplants,/turf/simulated/floor,/area/aisat)
+"dsx" = (/obj/machinery/computer/upload/borg,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"dsy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/aisat)
-"dsz" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/aisat)
+"dsz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/aisat)
"dsA" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/aisat)
"dsB" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat)
"dsC" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/aisat)
@@ -9085,7 +9087,7 @@
"dsM" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor{icon_state = "yellow"},/area/aisat)
"dsN" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/simulated/floor/plating/airless,/area)
"dsO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/aisat)
-"dsP" = (/obj/machinery/power/apc{aidisabled = 0; cell_type = 5000; dir = 4; name = "MiniSat APC"; pixel_x = 28; pixel_y = 0},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/aisat)
+"dsP" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/aisat)
"dsQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/aisat)
"dsR" = (/obj/structure/stool/bed/chair,/turf/simulated/floor,/area/aisat)
"dsS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/aisat)
@@ -9096,12 +9098,24 @@
"dsX" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"dsY" = (/obj/machinery/bot/floorbot{on = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"dsZ" = (/obj/machinery/bot/cleanbot{on = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
-"dta" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/turretid{control_area = "\improper AI Satellite Antechamber"; enabled = 0; icon_state = "motion0"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/turf/simulated/floor,/area/aisat)
+"dta" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/turretid{control_area = "\improper AI Satellite Antechamber"; enabled = 1; icon_state = "motion3"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/turf/simulated/floor,/area/aisat)
"dtb" = (/obj/structure/transit_tube{tag = "icon-E-NW"; icon_state = "E-NW"},/turf/space,/area)
"dtc" = (/obj/item/weapon/mop,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"dtd" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
-"dte" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/engine,/area/toxins/misc_lab)
+"dte" = (/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/nuke_storage)
+"dtf" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
+"dtg" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor,/area/mine/eva)
+"dth" = (/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/mine/eva)
+"dti" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/aisat)
+"dtj" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"dtk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
+"dtl" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
+"dtm" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/aisat)
+"dtn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/aisat)
+"dto" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/aisat)
+"dtp" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/aisat)
+"dtq" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/obj/machinery/camera/motion{c_tag = "MiniSat Antechamber"; dir = 1; network = list("MiniSat")},/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior)
+"dtr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/flora/kirbyplants,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/aisat)
"dts" = (/obj/structure/transit_tube{tag = "icon-E-W-Pass"; icon_state = "E-W-Pass"},/turf/space,/area)
"dtu" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area)
"dty" = (/obj/structure/transit_tube{tag = "icon-S-NW"; icon_state = "S-NW"},/obj/structure/lattice,/turf/space,/area)
@@ -9194,7 +9208,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaaiaajaakaalaakaalaakaamaaiaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaiajlajPajmajRajkaaqaktaaKalhaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaiahBahAahAahAahAahAdplaaKahCaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaiahBahAaEBahAahAahAdplaaKahCaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaiaaiaieaibahEaidaicaaqaaqaaKaiFaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaiNaafaafaaaaaaaaaaaaaaaahjaaiagWaaqaaqaaqaaqaaxaaqaaqagVagTaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaagaaiaaiaawaaxaaqaaqaayaazaaxaaqaataaAaaiahlaahaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9203,7 +9217,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabddoVdoWdoXdoYdpoabddppaaiaaSaaqaaqaaTaaqaaqaaqaaUaaqaaKaaqaaVaaWaaiaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaNdpcaaYaaZdpbdpdaaNaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabcaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaHaaHaaGaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabddpedpqdphdoLabddpgaaiabdabeabdabfabdabgabdabhabdabiabdabdabjaaiaafaaaaafaafaafaafaaaaafabkabkablabkaaNdpjabodpkaboabpaaNaafaaaaafabqaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaGaaGaaGaaGaaaaaaaaaabraaaaaaaaaaaGaaGaaHaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafdpmdoLdpfdoLabddpiaaiabsaaqabtabfabuaaqabvabhabwaaKabxabdabyaaiabzabzabzabzabzabzabzabzabzabAabBabCabDabodoJdoIabEaboaaNaafaaaaafabIabJabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaaaaaaafaafaafaaaaaaabraafaafaaaaafaafaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabKaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafdpmdoTdoRdoSagjdpnaaiabLaaqabMabNabOaaqabPabhabQaaKabPabdabRaaiabSabTabUabVabWabXabYdoOabzacaacbaccacdaceabodoPabodoUaaNaafaafaafabIaciabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafackaafacjacjacjacjacjaafaaGaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabKaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafdpmdoTdoRdoSagjdpnaaiabLaaqabMabNabOaaqabPabhabQaaKabPabdabRaaiabSabTabVabVabWabXabYdoOabzacaacbaccacdaceabodoPabodoUaaNaafaafaafabIaciabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafackaafacjacjacjacjacjaafaaGaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHaaGaaGaaaaaaaaaaclaaaaaaaaaaaGaaGaaHaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlabddowdoxdosdoydozaaiabhacmabdabfabhacnabfabhabhacoabfabdabdaaiabSacpacqacqacqacqdoCdoAabzacsabBactaaNdoBacvacwacxacyaaNaczacAabkacBabJabIabIacCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacDacEacEacEacEacFacGacHacIacIacIacIacJaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaafaafaaaaaaaaaaclaafaafaaaaafaafaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahldoMdoKdoDdoHacPacMacNdpaacPacQacRacSacPacTacUacVacWaaiacXacYdoEdoFadbdoGdoQdoZbYgabBadfadgaaNadhaaNadiaaNadjaaNadkadladmabkadnadoadpadpadqaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadradradradradraafacGaafadradradradradraafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafadtaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlaKubRDcdladzamJadwaliadBadzadAadBadzadzadCajwadEadFaaiadGamfadIadJadJadKalbakZalaajQaksadQabkadRadSadTaNpcuBadUadUadVadWadXadYadZaeaaebaecaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaafacGaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9217,8 +9231,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafaegaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahYahZahZahZaiaaaaaaaahyabbabaacOacZaeRacLacraigahDabZabmabHailaimainaioaipaipaipaioaipaiqairaipairaipaipaglairaisaitaiuaivaiwaixaiyaizaiAaiBahuahvahwabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafaaaaaaacGaaaaaaaafaaaaaaaafaaaaaGaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaedaeeaeeaeeaeeaefaegaehaeiaeiaeiaeiaejaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiDaiCaaaaaaahyaanaiGadeaffaauaaXaaoaapaaraasaiOaiPaiQaiRaiSaiPaiTaiRaiOaiPaiUaiVaiWaiWaiXaiYaiZafgajbajcaeRaiuajdaiuaiuaiuajeaiuaiuahuahvahwahfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaaaaaaaafaaaaaaacGaaaaafaafaafaafaaGaaGaaGaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaaaePaePaePaePaePaafaegaafaePaePaePaePaePaaaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCajfajfajfaiCajgajhajiajjaiHamIaihaeRaeSaiiaeSaeSajnajoajpajqajrajsajpajqajtajuajvajqallajxaeSajyajzajqamdcupcuoaeRajDajEaiuajFaiuajGajHaiuahuahvahwahxaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaajIaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaaafaaaaafaafaaaaaaajJaaaaaaaafaaaaaaaafaaaaaGaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaiCajKajKajKajLajMajNajMajjaiHamIaifaeRafrahoafraeSajSajTajUaeSajVajTajUaeSajVajTajUaeSafJajXalkajZagFaeSakaajTakbaeRakcakdakeakfakeakgakhakiahuahvahwahXaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaakkaklakkaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaakmaknakmaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaGaaGaaaaaaaafaaaakoakpakoaafaafaafaafaaGaaGaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCakqajKajKaiCajgajhakrahnahkameakvaeRafrahoafraeSakwajTakxaeSakyajTakzaeSakAajTakBaeSakCakDahrajZafsaeSakFajTakGaeRakHakIakJakKakHakIakIakLahuahvahwabIabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaakMakNakMaaaaafaaaaaaaafaaaaaaaaaaafaafaafaaaaaaaaaaaaakmakOakmaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaaafaaaaafaafaaaaaaajJaaaaaaaafaaaaaaaafaaaaaGaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaiCajKajKajKajLajMajNajMajjaiHamIaifaeRafrahoafraeSajSajTajUaeSajVajTajUaeSajVajTajUaeSabUajXalkajZagFaeSakaajTakbaeRakcakdakeakfakeakgakhakiahuahvahwahXaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaakkaklakkaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaakmaknakmaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaGaaGaaaaaaaafaaaakoakpakoaafaafaafaafaaGaaGaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCakqajKajKaiCajgajhakrahnahkameakvaeRafrahoafraeSakwajTakxaeSakyajTakzaeSakAajTakBaeSakCakDahrajZagFaeSakFajTakGaeRakHakIakJakKakHakIakIakLahuahvahwabIabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaakMakNakMaaaaafaaaaaaaafaaaaaaaaaaafaafaafaaaaaaaaaaaaakmakOakmaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaakPakQakPaafaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCakRakSakTakUaaaaaaakVahyakWalFalGaeRafragOafraeRalcaldalealfalgaldalealfalgaldalealfakEagLaljajYajWaeRaeRaeRaeRaeRalmalmalmalnalmalmalmaloahualpalqalrabIabIabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafalsaltalualtakkaafaafaafaafaaaaafaaaaaaaaaaafaafaaaaaaaaaakmalvakmaafaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafalwalxalyalzalAaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCalBalCalCaiCajgajhalDagIalEakXakYadcaeRaeRaeRaeRalHalHalHalJalHalHalHalIalHalHalHalJalHalHalHalKalKalLalMalMalMalNalmalmalmalnalmalmalmaloabIalOalPadYalQalRalQaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafalSalTakNalUalVaafaaaaaaaafaaaaafaaaaaaaaaaaaaafaafaaaaaaakmalvakmaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafalWalXalYalZalWamaamaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCalCalCalCambamcajNamcajjaiHakuakvamgalKalKalKagEalKalKamhalKalKalKalKalKalKalKamialKalKalKamjalKalKalKalKalKalKamkalnalnamlammamnamoampamqamramsamtamuamuamvabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafamwamxamyamzamwaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaafakmakmakmalvakmakmakmakmakmakmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9235,7 +9249,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafawLawMawNawMawOawNawNawPawMawNawQawRawSawSawTamaavQamaawUanlaqqawVawWamaawXarqarqarqarqarqawYawZamaaxaanlamaasCasCaogapqaogaxbaxcaxdaxdaxdaxdaxdaxdaxdaxeaxbaxfaxgaxgaxgaxgaxgaxgaxgaopaxhawfaxiaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtawhaxualKaxvabIaxwapFaucaudaxxaqHarRaxyawtawtawtaxzaxAaxBaxCaxDaunaxEaxFaxGaxHaxIaxJaxKaxLaxMapSapSapSapSapSaxNapQapQapQakmakmakmaxOakmakmanSakmakmardakmakmaxPakmakmanSakmardaxQakmakmaxRakmalvaxSardalvasoarjaxTavDaxUaxVaxWavDaxXarjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarkavJaxYavJaxZawNawNayaavJaxYavJaybaycawOaydamaavQamaamaamaamaamaayeayeayfaspakmayeayeayeayeaygaogaogaogaogaogaogaogapqarvaxbaaaaafaaaaafaaaaafaaaaafaaaaxbaxfaxgayhayiayjaykaylaxgaopaymaynayoaypayqayraysaysaytayuayvaywaywayxawhaxualKaxvabIayyarMarNarParPayzarRayAaxCayBayCayDayEayFayFayGayFapQayHayIayJayKayLayMapQayNapSapSapSapSapSayNapQaoUalvayOayPakmakmakmayQalvakmayRardakmaySalvakmayTalvakmayUayVakmayWalvakmanOanQardanOanQarjayXavDayYayZazaavDayXarjaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafazbaqfazcatwazdazeazfazgazhazdatwaziazjaqfazkazlamaazmaznaznaznaqoazoayeazpazqazrazsaztazuazpayeazvazwazxapqapqapqapqapqapqazyaxbaafazzazzazzazzazzazzazzaafaxbaxfaxgazAazBazCazDazAaxgazEazFawfazGazHazIazJaywazKazLazMazNaywaywaywazOaxualKazPabIayyaqDaqHaqHaqHaqHaufazQayFayFayFayFayFayFazRazSazTayFapQapQapQapQazUakmapQayNapSapSapSapSapSayNapQakmalvazVayPakmazWakmalvalvakmalvardakmalvalvakmalvalvakmardaskakmalvalvakmazXalvardalvaqcarjarjarjazYarjazZarjarjarjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlaaaazzaECaGvaGwaGxaEBazzaaaaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmaafaAMaANaANaANaANaANaAOaaaakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaBdaBeaBfaBgalvaqcaBhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlaaaazzaECaGvaGwaGxdteazzaaaaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmaafaAMaANaANaANaANaANaAOaaaakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaBdaBeaBfaBgalvaqcaBhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaBiaBjaBkaBjaBjaBlaBmaBjaBjaBkaBnaBoaqfaxZaBpaBqaBraBsaBtaBuaBvaBwayeazpaAhazraBxazrazrazpayeaByaBzaBAaBBaBCaBDaBEaBFaBGaBHaAlaafazzaAoaApaAmaAnaAqazzaafaxbaxfaxgaBNaBOaBPaBOaBQaxgaopaBRawfaBSaBTazIaBUazIaBVaBWaBXaBYaBZawhaCaawhaxualKaxvabIayyarMarNarOarPaCbarRazQayFaCcazSazSazSayGaCdaCeaCfayFaCgaChaCiaCjaCkakmaaaaafaaaaafaaaaafaaaaafaaaakmaClaCmaCnaCoaCpakmaCqalvaxSardalvakmaaaakmalvalvalvayOaCraCsaCsaCsaCsaCsaCtaCuaCvaCwaCxaCxaCyaCwaCzaCAaCBatpaCCaCDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBiaBnaBjaCEaCFaCFaCGaCHaCIaCJaCKaCFaCFaCLaCMavJaxZaCNaAfaCOaCPaCQaCRaCQaCSayeaCTaAhazrazrazrazrazraCUaBGaCVaCWaCWaCWaCXaCWaCWaCWaBGaAlaaaazzaBIaBJaBKaAnaBLazzaaaaxbaxfaxgaDcaDdaDeaDfaDgaxgaopaDhawfawfaDiaDjaDkaDjaDlawfawfaDmaDnawhaDoawhaxualKaxvabIayyaDpaDqaDqaDqaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDwaDyaDwaDzaDAaDBaDCaDDakmakmakmakmakmakmakmakmakmakmakmakmakmakmaDEakmakmakmaDFaBaaAZaDGaDHasJaDHaDJaDKaDLaDMaDNaDOaDOaDOaDOaDOaDPaDQaDRaDRaDSaDTaDUaDRaDVaDWaDXakmaDVaDVaDVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCLaDYaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaxZaEeaAfaEfaEgaEhaEiaEjaEkayeaElaEmaEnazraEoaEpaEqayeaEraEsaCWaCWaCWaCWaCWaCWaEtaEuaEvaEwaBMaDbaExaCZaDaaCYazzaafaxbaEDaEEaEFaEGaEHaEIaEJaEEaEKaELaEMaENaEOaEPaEQaEPayvaERawhaESaESawhaDmawhaETaEUaEVabIaEWaEXaEXaEXaEYaEZaFaaFbaFcaFdaFeaFcaFfaFcaFgaFcaFhaFiaFjaFkaFlaAKaFmaFnaFoaFpaFqaFnaFraFsaFsaFsaFsaFtaFuaFvaFsaFwaFxaFyaFzaFAaFBaFCaFDaFEasKaFEaFGaFHaFIaFJaFKaDOaFLaFMaFNaDOaDRaFOaDRaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaFZaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9243,34 +9257,34 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCLaHJaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaHKaHLaHMaHNaHNaHNaHNaHLaHOaHPaHQaHRayeaHSaHTaHUaHVayeaHWaBzaBGaHXaHYaHZaIaaIbaIcaIdaAlaaaaIeaaaaIfaIgaIfaaaaafaaaaxbaGyaxgaIhaIiaIjaIkaIlaxgapsapqawhaImaInaDmaDmaDmaIoaIpawhaaaaaaaIqaIraIsaItaIuaIvaIwaIxaIqaaaaaaaIyaIzaIAaIBayFaICazSazSazSaCeazSazSazSaIDaAKaIEaAKaIFaIGakmaIHaIIaIIaIJaIKaILaIIaIMaIIaINaIOaINaIPaINaIQaIRaIRaISaIRaIRaITaIRaIRaIRaIRaIUaHuaHwaIVaIWaIXaIYaIZaDOaJaaJbaJcaJdaJeaJfaHGaJgaHHaFXaFWaFXaJhaJiaJjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJkaJlaBjaCEaCFaCFaCFaJmaCFaCFaJnaCFaCFaCLaJoawLaxZawNaJpaJqaJqaJqaJqaJqaJqaJqaJraJsayeayeaJtayeayeayeaJuaJvaJwaAkaAkaAkaAkaJuaJxaJyaAlaJzaJAaJBaJCaJDaJEaJBaJBaJFaxbaJGaxgaJHaxgaJIaJJaJKaxgaqtavWawhawhawhaJLaJMaJNawhawhawhaJOaJPaJQaJRaIuaIuaIuaIuaIuaJSaJTaJPaJUaIyaJVaIAaJWayFayFayFayFayFayFayFayFayFaIDaJXaJYaJZaKaaKbaKcaKdaKeaIIaKfaKgaKhaKiaKjaINaKkaKlaINaKmaINaKnaKoaKpaKqaKraKsaKtaLVaKvaKwaIRaKxaKyaKzaIVaKAaIXaIYaKBaDOaKCaKDaKEaKFaKGaHGaHGaDRaDVaKHaFWaFXaKIaKJaKKaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJkaBjaBkaBjaBjaKLaBmaBjaBjaBkaJlaKMaqfaKNawNavJaKOaKOaKPaKOaKQarkaKRaKSaJsaKTaKUaKVaKWaKXaKYaKYaKZaKYaKYaKYaKYaKYaKYaKYaLaaLbaLcaLdaLeaLeaLfaLgaLeaLeaLeaLhaLiaLjaLfaLeaLeaLeaLkaLlaLmaIuaLnaLoaIvaIwaIwaIwaItaIuaIuaLpaIuaLqaLraLsaLtaLuaLvaLwaLxaIuaIuaLyaLzaLAaLBaLAaLCaLDaLEaLFaIuaLGaIuaAKaLHaLIaJYaJYaJYaJYaKbaKcaKcaLJaIIaLKaLLaKjaLMaLNaINaLOaLPaLQaLRaINaIRaLSbgAaLUaPSaLWaLXaLYaLZaMaaIRaIUaMbaMcaMcaMdaMeaMcaMfaDOaMgaMhaDRaHGaHGaHGaHGaDRaMiaMjaMkaFXaDVaDVaDVaMlaMlaMlaMmaMnaMoaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavJaxYaMpaAbaAbaAbaAbaMqaxYavJaAdaqfaAeaMrazdaMsaMtaMuaMuaMvarkaMwaKSaMxaMyaMzaMAaMBaMCaMDaMEaMFaKYaKYaKYaKYaKYaKYaKYaLaaKYaMGaKYaKYaKYaMHaMIaKYaKYaKYaKYaMJaKYaMKaKYaKYaKYaMLaLlaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaLpaIuaMMaMNaMOaMPaMQaMRaMSaMTaIuaIuaLyaIuaIuaIuaIuaIuaIuaIuaIuaIuaMUaIuaAKaJYaMVaJYaJYaJYaJYaMWaKcaLJaMXaIIaMYaMZaNaaIIaIIaINaNbaKlaNcaLRaNdaINaIRaIRaNeaIRaIRaIRaNfaNgaNfaIRaIUaHuaNhaHwaHwaNiaHwaNjaDOaDRaDRaDRaDRaDRaDRaNkaDRaFXaFXaFWaFXaNlaNmaDVaNnaNobYXaNqaNraNsaafaaaaafaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavJaxYaMpaAbaAbaAbaAbaMqaxYavJaAdaqfaAeaMrazdaMsaMtaMuaMuaMvarkaMwaKSaMxaMyaMzaMAaMBaMCaMDaMEaMFaKYaKYaKYaKYaKYaKYaKYaLaaKYaMGaKYaKYaKYaMHaMIaKYaKYaKYaKYaMJaKYaMKaKYaKYaKYaMLaLlaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaLpaIuaMMaMNaMOaMPaMQaMRaMSaMTaIuaIuaLyaIuaIuaIuaIuaIuaIuaIuaIuaIuaMUaIuaAKaJYaMVaJYaJYaJYaJYaMWaKcaLJaMXaIIaMYaMZaNaaIIaIIaINaNbaKlaNcaLRaNdaINaIRaIRaNeaIRaIRaIRaNfaNgaNfaIRaIUaHuaNhaHwaHwaNiaHwaNjaDOaDRaDRaDRaDRaDRaDRaNkaDRaFXaFXaFWaFXaNlaNmaDVaNnaNoafJaNqaNraNsaafaaaaafaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafazbaqfazdatwazdaNtaNuaNvaNwazdatwaNxaNyaqfaxZawNazdaNzaNAaMuaMuaMvarkaNBaKSaJsaMyaMzaNCaNDaNEaNEaNEaNFaNGaNHaNEaNIaNEaNEaNEaNJaNKaNLaNEaNEaNEaNMaNNaNOaNPaNPaNQaNRaNSaNTaNUaKYaKYaMLaLlaIuaNVaIuaNWaNWaNWaNWaNWaNWaNWaNWaNXaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNYaNWaNWaNWaNWaNWaNWaNWaNWaIuaIuaIuaAKaNZaOaaNZaNZaNZaObaOcaKcaKcaOdaIIaIIaOeaIIaIIaOfaINaOgaKlaOhaOiaOjaINaIRaOkaOlaOmaOnaOmaOmaOoaOpaIRaIUaHuaOqaOqaOraOsaOtaOtaOuaDOaOvaOwaOxaDVaOyaOzaOAaFXaFXaOBaOAaDVaOCaDVaODaOEaOFaOFaOGaOHaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarkawLaxYawLaxZawNawNayaawLaxYawLaOJaOKaOLawNawLaOMaOMaKPaOMaKQarkaONaKSaJsaOOaOOaOPaOQaOOaORaORaORaORaORaOSaOTaORaOUaORaORaORaOVaOWaOXaOWaOYaOZaPaaKYaKYaPbaPcaPdaKYaKZaKYaKYaPeaPeaIuaIuaIvaPfaJPaJPaPgaPgaPgaPgaPhaPiaPjaPkaPlaPmaPnaPmaPoaPmaPpaPkaPqaPiaPraPgaPgaPgaPgaJPaJPaPsaItaIuaIuaIIaPtaPuaKcaKcaKcaKcaPvaPwaPxaKcaIIaPyaPzaPAaINaINaINaINaPBaINaPCaINaINaIRaOmaPDaPEaPEaPEaPEaPFaOmaIRaPGaHuaPHaHwaOraOsaHwaHwaPIaDOaPJaPKaPLaDVaFXaPMaPNaPOaPOaPPaPNaPQaPRaDVaLTaPTaPUaPVaOFaPWaPXaPXaPWaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarkawLaxYawLaxZawNawNayaawLaxYawLaOJaOKaOLawNawLaOMaOMaKPaOMaKQarkaONaKSaJsaOOaOOaOPaOQaOOaORaORaORaORaORaOSaOTaORaOUaORaORaORaOVaOWaOXaOWaOYaOZaPaaKYaKYaPbaPcaPdaKYaKZaKYaKYaPeaPeaIuaIuaIvaPfaJPaJPaPgaPgaPgaPgaPhaPiaPjaPkaPlaPmaPnaPmaPoaPmaPpaPkaPqaPiaPraPgaPgaPgaPgaJPaJPaPsaItaIuaIuaIIaPtaPuaKcaKcaKcaKcaPvaPwaPxaKcaIIaPyaPzaPAaINaINaINaINaPBaINaPCaINaINaIRaOmaPDaPEaPEaPEaPEaPFaOmaIRaPGaHuaPHaHwaOraOsaHwaHwaPIaDOaPJaPKaPLaDVaFXaPMaPNaPOaPOaPPaPNaPQaPRaDVafsaPTaPUaPVaOFaPWaPXaPXaPWaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafavJaPZawNavKaOLawNawNaQaavKawNaPZaOLawNawNawNaQbaQcaQcaQcaQcaQcaQcaQcaQdaJsaOOaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQraQsaQtaQuaQvaQwaQxaOYaQyaPaaPaaQzaPaaQAaPeaPeaQBaQCaPeaPeaPeaQDaIuaIvaQEaaaaaaaaaaaaaaaaaaaaaaPiaQFaQGaQHaQIaQJaQKaQLaQMaQNaQOaQPaPiaaaaaaaaaaaaaaaaaaaaaaQQaItaIuaQRaIIaQSaPuaQTaKcaKcaKcaQTaKcaQUaLJaQVaKcaQWaQXaINaQYaQZaRaaRbaRcaRdaReaRfaINaOmaRgaRhaRhaRhaRhaRiaOmaIRaRjaHuaRkaRkaOraOsaRlaRlaRmaDOaDOaRnaDOaDVaRoaOzaOAaRpaRpaOBaOAaDVaDVaDVaMmaRqaRraMmaMnaMnaMnaMnaRsaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaawLaRtaRuaRuaRuaRuaRuaRuaRuaRuaRtaRuaRvawNawNaRwawNawNaRxawNaRyawNaRzaRAaRBaOOaRCaOPaRDaORaREaQnaQnaQnaQnaQnaQoaRFaQnaQnaQnaQtaOVaRGaQwaQwaOYaQyaPaaRHaRIaRIaRJaPeaRKaRLaRMaRNaROaRPaIuaIuaIvaQEaaaaaaaaaaaaaPiaPiaPiaPiaRQaRRaRSaRTaRUaRVaRWaRXaRYaRZaSaaPiaPiaPiaPiaaaaaaaaaaaaaQQaItaIuaIuaSbaKcaScaSdaSeaKcaSfaSgaSeaQUaLJaShaKcaSiaKcaSjaSkaSkaSkaSlaSmaSnaSoaSkaSpaSqaSraRhaSsaStaRhaSuaOmaIRaIUaHuaHwaHwaOraOsaHwaHwaHwaSvaSwaHwaSxaDVaKHaSyaSzaRpaRpaSAaSzaSBaDVaSCaSDaPTaSEaOFaOFaSFaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkaSKaSLaSMaSMaSMaSNaSMaSMaSMaSOaSMaSOaOOaRCaSPaSQaORaSRaQnaQnaSSaSTaSUaSVaSSaQnaQnaQnaSWaOVaSXaSYaSZaOYaTaaPaaTbaTcaTdaTeaPeaTfaTgaThaRMaTiaTjaIuaIuaIvaJTaPhaTkaTlaPiaPiaTmaTnaToaTpaTqaTqaTraTsaTqaTtaTqaTqaTqaTuaTvaTwaTxaPiaPiaTlaTkaJOaTyaItaIuaIuaIIaTzaPuaTAaKcaKcaKcaTAaKcaQUaLJaTBaTCaKcaTDaINaSkaTEaTFaTGaTHaTIaTJaSkaTKaTLaTMaRhaTNaTOaRhaTPaTQaIRaIUaHuaTRaTRaOraOsaTSaHwaHwaTTaHwaTUaTVaDVaTWaTXaTYaRpaRpaTZaTYaFXaDVaUaaOFaPTaSEaOFaOGaUbaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUdazeawOaUeaUfaUgaUhaUiaUjaUkaUlaUmaUkaUnaUoaUpaUqaUraORaUsaQnaQnaSSaSUaUtaUuaSSaQnaQnaQnaQtaOVaOYaOYaUvaOYaUwaUxaUxaUxaUxaUyaUzaUAaRMaRMaRMaRMaTjaIuaIuaIvaIwaIwaUBaUCaUDaPiaUEaUFaUGaTqaTqaTqaUHaUIaUJaUKaULaUMaUNaULaUOaUPaUQaPiaURaUCaUSaUTaIwaItaIuaIuaSbaKcaPuaQTaKcaUUaKcaQTaKcaQUaLJaUVaKcaKcaKcaUWaSkaSkaUXaUYaUZaVaaTJaVbaINaVcaTMaVdaRhaRhaRhaTPaVeaIRaVfaHuaDOaDOaOraOsaVgaVhaHwaViaVjaKAaVkaVlaMjaVmaVnaVoaVoaVpaVqaVraVlaVsaVtaVuaVvaVtaVwaNsaaaaafaafaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaVxaVyaVzaxZaVAaVBaVCaVDaVEaVFaVGaVHaVIaVDaVJaVKaVLaVMaVNaORaVOaQnaQnaVPaQnaQnaQoaQnaQnaQnaQnaVQaVRaRCaVSaVTaVUaVVaVWaVXaVYaOOaVZaPeaWaaWbaWcaWdaWdaWeaIuaIuaIuaIuaIuaWfaWgaWhaWiaWjaWkaWlaWmaWnaWraWpaWqcpzaWtaWoaWsaWuaWvaWwaWxaWyaWzaWAaWBaWCaWDaWEaWFaIuaIuaIIaQSaScaSgaSeaKcaSfaSdaSeaQUaLJaTBaTBaWGaWHaINaSkaSkaSkaWIaSkaWJaTJaWKaINaOmaTMaRhaRhaRhaRhaTPaOmaIRaWLaWMaWNaWOaWPaWQaOraOraOraOraOraOraWRaWSaRpaRpaRpaRpaRpaRpaRpaWTaWUaWVaOFaOFaSEaOFaWWaNsaafaafaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaVxaVyaVzaxZaVAaVBaVCaVDaVEaVFaVGaVHaVIaVDaVJaVKaVLaVMaVNaORaVOaQnaQnaVPaQnaQnaQoaQnaQnaQnaQnaVQaVRaRCaVSaVTaVUaVVaVWaVXaVYaOOaVZaPeaWaaWbaWcaWdaWdaWeaIuaIuaIuaIuaIuaWfaWgaWhaWiaWjaWkaWlaWmaWnaWraWpaWqcpzaWtaWoaWsaWuaWvaWwaWxaWyaWzaWAaWBaWCaWDaWEaWFaIuaIuaIIaQSaScaSgaSeaKcaSfaSdaSeaQUaLJaTBaTBaWGaWHaINaSkaSkaSkaWIaSkaWJaTJaWKaINaOmaTMaRhaRhaRhaRhaTPaOmaIRaWLbkLaWNaWOaWPaWQaOraOraOraOraOraOraWRaWSaRpaRpaRpaRpaRpaRpaRpaWTaWUaWVaOFaOFaSEaOFaWWaNsaafaafaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaWXatwaWXawNawNaSOaWYaWZaXaaXaaXaaXaaXbaXcaSMaXdaXeaXfaXgaXhaXhaXhaXiaXhaXjaXkaXlaXmaXnaXnaXoaQtaXpaXqaXraXsaXtaXuaXvaXvaXwaXxaXyaXzaXAaXBaXBaXBaXCaPeaIuaIuaXDaXEaXFaXGaXHaXIaPiaXJaXKaXLaXMaPibqwbqwbqwauCbqwbapbqwaPiaXPaXLaXQaXRaPiaXSaXHaXTaXUaXEaXVaIuaIuaSbaKcaXWaTAaKcaKcaKcaTAaKcaQUaKcaLJaLJaKcaKcaXXaXYaXZaSkaSkaSkaYaaYbaYcaINaYdaYeaRhaYfaYfaYgaYeaYhaIRaYiaYjaYkaYlaOraOraOraOraYmaOraOraOraWRaWSaRpaRpaRpaRpaRpaRpaRpaWTaWUaWVaOFaOFaYnaOFaYoaNsaaaaafaafaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaYpaYqaVzaxZawNaYraWZaYsaXaaXaaXaaXaaYsaWZaSMaYtaYuaXfaXgaYvaYwaYxaYyaXhaYzaYAaYBaORaYCaYDaYEaQnaORaYFaYGaYHaYHaYHaYHaYIaYHaYHaYJaYKaYKaYKaYLaYKaYMaYNaYOaYOaYPaYQaYQaYQaYQaYQaYQaYRaYSaYRaYQbqwaYVbkMbkMbrIbambkMaYVbqwaYWaYWaYXaYYaYWaYWaYWaYWaYWaYWaYZaYOaYOaIIaZaaZbaZcaZdaKcaKcaKcaZeaZfaZgaKcaZhaZiaZjaINaINaINaZkaZlaZlaZlaINaINaINaZmaRhaRhaZnaZoaZpaZqaNfaIRaZraYjaZsaDOaZtaZuaZvaVhaZwaZuaZxaVhaZyaDVaZzaFXaZAaRpaRpaZAaFXaZBaDVaZCaZDaZEaSEaOFaOGaZFaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcawLaZGaOLaZHaSOaZIaZIaZIaWZaZJaZIaZKaZIaSMaZLaZMaZNaZOaZPaZPaZQaZRaZPaZSaYAaZTaORaYCaYDaYEaQnaORaZUaYGaYHaZVaZWaZWaZWaZXaYHaZYaZZbaababaYNaYNaYNaYNaIubacbadaYQbaebafbagbahbaibajbakbalbqwaYTbkMbkMbnIaXObnIbkMbkMasrbqwbaqbarbasbatbaubavbawbaxaYWaXVaIuaIuaIIaIIaIIaIIaIIbayaSbbaybazbaAaIIaIIaIIaIIaIIbaBbaCbaCbaCbaCbaCbaCbaDbaCbaBaNfbaEbaEbaFaYkaYkaYkaYkbaBaZrbaGaZsaDOaDOaDOaDOaDObaHaDOaDOaDOaDOaDVbaIbaJbaKbaKbaKbaKbaLaDVaDVbaMaOFbaNaSEaOFaOFaSGaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkbaOaHLbaPaSMaSMaSMaSMaSMaSMaSMaSMaSMbaQaVWbaRaXgaYvbaSaYybaTaXhbaUbaVbaWaORaYCaYDaYEaQnaORaZUaYGaYHaZWbaXbaXaZWbaXaYHaZYbaYbaZbaZbbabbbbbcaYNbbdbbeaXDbcxbbgbbhbbibbjbbjbbibbkbblbqwbcpbkMbkMbnIbaobnIbkMbkMbczbqwbbtbaxbbubbvbbwbbxbaxbbyaYWaXVbbzaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbbCaYkaYkaYkaYkbbDaYkaYkaYkaYkaYkaYkaYkaYkbbBaYkaYkaYkaYkaYkaYkaYkaYkbbEbbFbbGbbHbbHbbHbbHbbHbbIbbJbbKbbHbbLbbHbbHbbMbbHbbHbbHbbHbbHbbHbbNbbObbPbbQbbRbbSaPVbbTbbUaMnaMnbbVaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaYpaYqaVzaxZawNaYraWZaYsaXaaXaaXaaXaaYsaWZaSMaYtaYuaXfaXgaYvaYwaYxaYyaXhaYzaYAaYBaORaYCaYDaYEaQnaORaYFaYGaYHaYHaYHaYHaYIaYHaYHaYJaYKaYKaYKaYLaYKaYMaYNaYOaYOaYPaYQaYQaYQaYQaYQaYQaYRaYSaYRaYQbqwaYVbkMbkMbrIbambkMaYVbqwaYWaYWaYXaYYaYWaYWaYWaYWaYWaYWaYZaYOaYOaIIaZaaZbaZcaZdaKcaKcaKcaZeaZfaZgaKcaZhaZiaZjaINaINaINaZkaZlaZlaZlaINaINaINaZmaRhaRhaZnaZoaZpaZqaNfaIRaZraYjaZsaDOaZtbaHaZvaVhaZyaZuaTTaVhbbsaDVaZzaFXaZAaRpaRpaZAaFXaZBaDVaZCaZDaZEaSEaOFaOGaZFaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcawLaZGaOLaZHaSOaZIaZIaZIaWZaZJaZIaZKaZIaSMaZLaZMaZNaZOaZPaZPaZQaZRaZPaZSaYAaZTaORaYCaYDaYEaQnaORaZUaYGaYHaZVaZWaZWaZWaZXaYHaZYaZZbaababaYNaYNaYNaYNaIubacbadaYQbaebafbagbahbaibajbakbalbqwaYTbkMbkMbnIaXObnIbkMbkMasrbqwbaqbarbasbatbaubavbawbaxaYWaXVaIuaIuaIIaIIaIIaIIaIIbayaSbbaybazbaAaIIaIIaIIaIIaIIbaBbaCbaCbaCbaCbaCbaCbaDbaCbaBaNfbaEbaEbaFaYkaYkaYkaYkbaBaZrbaGaZsaDOaDOaDOaZwaDOaZxaDOaZwaDOaDOaDVbaIbaJbaKbaKbaKbaKbaLaDVaDVbaMaOFbaNaSEaOFaOFaSGaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkbaOaHLbaPaSMaSMaSMaSMaSMaSMaSMaSMaSMbaQaVWbaRaXgaYvbaSaYybaTaXhbaUbaVbaWaORaYCaYDaYEaQnaORaZUaYGaYHaZWbaXbaXaZWbaXaYHaZYbaYbaZbaZbbabbbbbcaYNbbdbbeaXDbcxbbgbbhbbibbjbbjbbibbkbblbqwbcpbkMbkMbnIbaobnIbkMbkMbczbqwbbtbaxbbubbvbbwbbxbaxbbyaYWaXVbbzaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbbCaYkaYkaYkaYkbbDaYkaYkaYkaYkaYkaYkaYkaYkbbBaYkaYkaYkaYkaYkaYkaYkaYkbbEbbFbbGbbHbbKbbHbbHbbHbbIbbJbbHbbHbbHbbHbbLbbMbbHbbHbbHbbHbbHbbHbbNbbObbPbbQbbRbbSaPVbbTbbUaMnaMnbbVaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavJavNavMavMavMavMavMavMavMavMavNavMbbWawNawNbbXbbYbbZbbZbbZbbZbbZbcabcbaOObccbbYbcdaXgaXhaXhbcebcfaXhaORaORbcgaORaYCaYDbchbciaORaZUaYGaYHaZWbcjaZWbaXbckaYHaZYbclbaZbaZbaZbcmbcnaYNbcobbeaXDbbpbcqbcrbcsbctbcubcvbbkbcwbqwbbnbnIbkMbmiaYUbmibkMbnIbbfbqwbcAbcBbbubbvbcCbbxbaxbaxaYWbcDaIuaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbcEaYkaYkaYkaYkaYkaYkbcFbbHbbHbbHbbHbbHbbHbcGbbHbbHbbHbbHbbHbbHbbHbcHbcIbcJbcKaWNaWNaWNaWNaWNaWMaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNbcLbcMbcNbcObcObcPaOFaOFaOFbcQaPXaPXbcQaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafawLawMawNawMawOawNawNawPawMawNawMawOawNawNawNbcRbcSbcRbcRbcRbcRbcRbcTaOOaOOaOObcTaXfaXgaYvbcUbcVbcWaXhbcXbcYbcZaORaORaORaOObbXaOOaZUaYGaYHbdaaZWbaXbdbbdcaYHaZYaYNbddbaZbaZbdebdfbdgbdhbbeaXDbuqbdjbcrbcsbdkbdlbcvbdmbdnbnGbupbuobkMbtfbunbkLbkMbrKbtbbrHbdubdvbdwbdxbdxbdybdzbdAaYWbdBbdCaIubdpbbBaYkaYkbdDaYkbdEbdFbdFbdFbdGbdFbdFbdFbdHaYkaYkaYkaYkaYkaYkbdIbdJbdKbbBaYkaYkaYkaYkaYkbdLbdMbdNbdObdPaYkaYkaYkaYkaYkbdQbdRaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkbdSbdTbdUbdVbdWaOFaOFaOGbdXaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafawLawMawNawMawOawNawNawPawMawNawMawOawNawNawNbcRbcSbcRbcRbcRbcRbcRbcTaOOaOOaOObcTaXfaXgaYvbcUbcVbcWaXhbcXbcYbcZaORaORaORaOObbXaOOaZUaYGaYHbdaaZWbaXbdbbdcaYHaZYaYNbddbaZbaZbdebdfbdgbdhbbeaXDbuqbdjbcrbcsbdkbdlbcvbdmbdnbnGbupbuobkMbtfbundsxbkMbrKbtbbrHbdubdvbdwbdxbdxbdybdzbdAaYWbdBbdCaIubdpbbBaYkaYkbdDaYkbdEbdFbdFbdFbdGbdFbdFbdFbdHaYkaYkaYkaYkaYkaYkbdIbdJbdKbbBaYkaYkaYkaYkaYkbdLbdMbdNbdObdPaYkaYkaYkaYkaYkbdQbdRaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkbdSbdTbdUbdVbdWaOFaOFaOGbdXaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarkavJbdYavJaxZawNawNayaavJbdZavJaybbeabebbebbcRbecbedbeebefbegbcRbehbeibejbejbekbelbembenbenbeobepbenbeqbeqberbeqbesaUoaUoaUoaUobetbeubevbewbexbexbeybezbevbeAbeBbeCbaZbaZbeDbeEbeFbeGbbeaXDaYQbaibeHbbibbibeIbbibbkbeJaYQbqybqwbapbqwbqwbqwbqAbqwbhzaYWbeNbeObePbeQbaxbeRbaxbeSaYWaXVaIuaIubeVbeVbeVbeVbeVbeVbeVbeWbeXbeYbeZbfabfabeWbfbbfbbfbbfbbfbbfcbfcbfcbfdbfcbfcbfcbfcbfeaYkbdQbffbfgbfhbfibfjaYkaYkbfkbfkbflbflbflbflbflbfmbfnbfnbfnbfnaYkbfnbfobfnbfnbfpbfqbfqbfqbfqbfrbfsbftbfuaNsaafaaaaafaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzbcRbfAbfBaRCaRCbcTbfCaXhaYvbfDaYybfEaXhbfFbfGbfHbfHbfIbfJbfKbfKbfLbfKbfMbfNbfObfPbfObfObfQbfRbfSbfTbfUbaZbaZbfVbfWbfXbeGbbebfYaYQbfZbgabgbbaibgcbgdbgebgfaYQbqxcmqboZcltcltboXboYclybgiaYWbgjbgkbglbgmbaxbgnbaxbgoaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvbgwbgwbgxbgybgybgybgzboLbjpbgCbfbbgDbgEbgEbgEbgEbgFbgGbgHbgIbgJbgIbgIbgIbgKbgLbgMbgNbgMbgObgObflbgPbgQbgRbflbgSbgTbgSbflbfmaYkbfpbfqbgUbgVbgUbfqbgWbgXbfqbgYbgZaMmaMnbhaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafawLbdYaAaaAbaAbaAbaAbaAcbdZawLaafaafaafaaabcRbhbbcRbhcbfybhdbhebcRaRCbbYbhfbhgbhhaXhaXhaXhaXhaXhaXhbhibhjbhkaRCbhlaYHaYHaYHbhmaYHaYHaYHbhnaYHaYHaYHaYHbhobhpbhqbhrbaZbaZbhsbhtbeFbeGbbebhuaYQbhvbgaaYRaYRaYRbaibhwbhxaYQahjckNcnAboTboUboWcnzckNahjaYWbhAbhBbhCbhDbaxbeRbhEbhFbhGbhHbhIbhJbeVbhKbhLbhMbhNbhObhPbgybhQbgybhRbgybgybhSbhTbhVbhUbhWbfbbhXbgEbhXbgEbhXbhYbgEbfcbhZbhZbiabibbfgbicbfibidbiebifbigbigbflbihbiibijbikbilbimbinbflbiobfnbipbfqbiqbirbiqbisbitbitbfqbiubgZaaaaafaaaaaaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafawLbdYaAaaAbaAbaAbaAbaAcbdZawLaafaafaafaaabcRbhbbcRbhcbfybhdbhebcRaRCbbYbhfbhgbhhaXhaXhaXhaXhaXhaXhbhibhjbhkaRCbhlaYHaYHaYHbhmaYHaYHaYHbhnaYHaYHaYHaYHbhobhpbhqbhrbaZbaZbhsbhtbeFbeGbbebhuaYQbhvbgaaYRaYRaYRbaibhwbhxaYQahjckNcnAboTboUboWcnzckNahjaYWaLTbhBbhCbhDbaxbeRbhEbhFbhGbhHbhIbhJbeVbhKbhLbhMbhNbhObhPbgybhQbgybhRbgybgybhSbhTbhVbhUbhWbfbbhXbgEbhXbgEbhXbhYbgEbfcbhZbhZbiabibbfgbicbfibidbiebifbigbigbflbihbiibijbikbilbimbinbflbiobfnbipbfqbiqbirbiqbisbitbitbfqbiubgZaaaaafaaaaaaaaaaaaaaaaGbaGbaGbaGbaGbaGbaGbaGbaGbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabcRbivbiwbixbiybiybizbiAbbZbhgaOObiBbiCbiDbiDbiDbfKbfKbfKbiEbiFbiFbiFbiGaYHbiHbiIbiJbiKbiLbiMbiNbiOaYHbiPbiQbiRbiSbiTbiUbiVbiWbiXbiVbiYbiZbjabjbbjcbjdbjebjfbjgbjhbjibhwaYQaYQahjckNcnAboUcltboUcnzckNahjaYWbFabjmbaxbjnbaxbjodoNbjqaYWaXVaIuaIubeVbjrbjsbjtbjubjvbjwbgybjxbjybjzbjAbjAbjBbjCbjDbjEbjFbfbbhXbgEbhXbgEbhXbhYbjGbfcbjHbjIbjJbjKbfgbjLbjMdtkdrgdrgdrbbjPbjQbjRbjSbjSbjSbjTbjSbjUbjVbjWbjXbjYbjZbkabkbbitbkcbkdbkebfqbiubgZbgZbgZbgZbgZaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabcRbkfbcRbkgbkhbkhbkibcRbkjbkkaOObklbkmbklbklbklbkmbklaOOaOOaYHaYHaYHbknaYHbiNbiNbkobiNbiNbiNbiNbiNbkpbkqbkrbksbktbkubkubkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkHbkIbkJaYQaafahjckNcnAboWcmWboTbDDckNahjaafbkQaYWbkRaYWaYWaYWaYWbkSaYWbkTaIuaIubeVbkUbjsbkVbhNbhObkWbgybhRbkXbkYbkZblablbbfbblcbldblebfbbhXblfbhXbgEbhXbhYbgEbfcbfgbfgbfgbfgbfgbjLbfidqNblhblibljblkbllblmblnblobloblpbijblqbflblrblsbltbfqblublvblwblxblyblzbfqbiublAceYblBblCblBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabcRblDblEblFbkhblGblHbcRaaaaafaafblIblIblIblIblIblIblIaaaaaablJblKblLblMblNbiNbiNbiNbiNbiNbiNbiNbiNblObhrbaZblPblQblRblSblTblUbiSblVaYNblWblXblYblZbmabmbbmbbmcbmdbmebmfbmbaafahlckNbBjbzTcltcltbyGckNahlaafbmkbmlbmmbmnbmobmpbmqbmrbmsbmtaIubmubmvbCybmxbkVbmybmzbeVbmAbhRbkXbkZbmBbgybmCbfbbmDbmEbmFbfbbmGbmHbmIbmJbmKbmLbmKbmMbmNbmObmNbmNbmNbmPbfibmQbiedqCdqobmRbmSbmTbmUbmVbmVbmWbmXbmYbflbmZblsbnabfqbnbbncbndblxbitbnebfqbiublAblAbgZbgZbgZbgZbgZbgZbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabcRbnfbngbnhbnibcRbcRbcRaaaaaaaaablIblIblIblIblIblIblIaaaaaabnjbnkbiNbnlbnmbnmbnmbnmbnmbnmbnmbnmbnmbnnbnobnpbnqbnrbnsbntbnubhsbnvbnwbnxbnybnzbnAblZblZbmbbnBbnCbnDbnEbnFbmbahlahlckNbvIbvJbxdbyDbyEckNahlaaabnLbnMbmmbnNbmsbnObmsbnPbmsbmtaIuaIubeVbnQbjsbkVbnRbnSbeVbnTbnUbnVbnWbnXbgybnYbnZboabobbocbfbbfcbodbfcbfcbfcboeboeboeboeboeboeboeboebjLbfiblgblhblibofbogbohboibojbojbojbmWbijbokbflbolblsbombfqbonboobonbopbitboqbfqborbosbosbosbosbosbosbosbotbgZbgZbgZbgZaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbgBboMboNboOboPboQbjlbmbaafahlckNbmhbnHcoCbmjbmwckNahlaafbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbpZbgZbgZaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbqabqbbqabqcbqdbiNbiNbiNbiNbiNbiNbiNbiNbqeaYHaYHbqfbaZbaZbqgbqhbqibqjbhsbqkbaZbqlbqmbnzbqnbqobqpbqqbqrbqsbqtbqubqvbmbaaaahlckNbbsbmgcpgcpgbbrckNahlaaabqBbqCbqCbqCbqCbqCbqCbqDbqCbqEbqFbqFbeVbeVbqGbqHbqIbqJbeVbqKbhRbgybgybgybgybqLbgybqMbqNbgybgybgybqNbgybgybpvbqObqPbqQbqRbqSbqTbqUboebqVbqWboVbqXbqYbqZbiebflbrabijbijbrbbrcbijbrdbrebrfbrfbrgbrhbrhbribgUbrjbgUbrhbfqbpXbpXbrkbrlbrmbrnbrobpXbrpbrqbrrbrsbrtbgZaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabcRbnfbngbnhbnibcRbcRbcRaaaaaaaaablIblIblIblIblIblIblIaaaaaabnjbnkbiNbnlbnmbnmbnmbnmbnmbnmbnmbnmbnmbnnbnobnpbnqbnrbnsbntbnubhsbnvbnwbnxbnybnzbnAblZblZbmbbnBbnCbnDbnEbnFbmbahlahlckNbvIbvJbmhbyDbyEckNahlaaabnLbnMbmmbnNbmsbnObmsbnPbmsbmtaIuaIubeVbnQbjsbkVbnRbnSbeVbnTbnUbnVbnWbnXbgybnYbnZboabobbocbfbbfcbodbfcbfcbfcboeboeboeboeboeboeboeboebjLbfiblgblhblibofbogbohboibojbojbojbmWbijbokbflbolblsbombfqbonboobonbopbitboqbfqborbosbosbosbosbosbosbosbotbgZbgZbgZbgZaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbgBboMboNboOboPboQbjlbmbaafahlckNbkNbnHcoCbmjbmwckNahlaafbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbpZbgZbgZaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbqabqbbqabqcbqdbiNbiNbiNbiNbiNbiNbiNbiNbqeaYHaYHbqfbaZbaZbqgbqhbqibqjbhsbqkbaZbqlbqmbnzbqnbqobqpbqqbqrbqsbqtbqubqvbmbaaaahlckNdrNbmgdrkcpgbbrckNahlaaabqBbqCbqCbqCbqCbqCbqCbqDbqCbqEbqFbqFbeVbeVbqGbqHbqIbqJbeVbqKbhRbgybgybgybgybqLbgybqMbqNbgybgybgybqNbgybgybpvbqObqPbqQbqRbqSbqTbqUboebqVbqWboVbqXbqYbqZbiebflbrabijbijbrbbrcbijbrdbrebrfbrfbrgbrhbrhbribgUbrjbgUbrhbfqbpXbpXbrkbrlbrmbrnbrobpXbrpbrqbrrbrsbrtbgZaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbrubrvbrubrwbiNbiNbiNboyboyboyboybiNbiNbrxbryaYHbrzbaZbaZbqgbrAbntbqjbhsbaZbaZbqlbqmbrBaIuaQQbqpbrCbrDbrEbrFbrFbrGbmbaafaafckNckNbkPbbqbbqbbockNaafaafbrJbkObrLbrMbrNbrObrPbrQbqCbrRaIuaIubrSbrTbrUbrVbrWbrXbrYbrZbsabrZbsbbrZbrZbscbrZbsdbsebrZbrZbrZbsfbsgbsgbshbqObsibqQbsjbsjbskbslboebjLbfibsmbsnbsobspbspbflbsqbsrbssbrebstbijbsubrebsvbswbsxbsybszbsAbsBbsCbsDbsEbsFbsGbsHbsIbsJbsJbsJbsKbsLbsMbgZbsNblAbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbsObovbsPbsQbiNbiNbiNbiNbiNbiNbiNbiNbiNbrxbsRaYHbsSbcmbaZbqgbaZbsTbaZbhsbaZbsUbnxbsVbrBaIuaQQbqpbmbbsWbsXbsYbsZbtabmbahlahlaafckNckNbkNckNckNaafaaaaaabrJbtcbtdbtebkKbtgbtgbthbtibtjaIuaIubtkbtlbhRbqMbtmbtnbtobtnbtpbtnbtqbtrbtnbtsbpqbttbgybgybgybtubtvbtvbtwbtxbtybtzbqQbtAbtBbqTbslboebfhbfibtCbtCbtDbtCbtCbflbrebrebrebrebtEbtFbgSbrebtGbtHbtIbsEbsEbtJblsbtKbtLbtMbtNbtObtPbtQbtRbtRbtSbtTbpXbtUbgZbsNblAbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbsObovbsPbsQbiNbiNbiNbiNbiNbiNbiNbiNbiNbrxbsRaYHbsSbcmbaZbqgbaZbsTbaZbhsbaZbsUbnxbsVbrBaIuaQQbqpbmbbsWbsXbsYbsZbtabmbahlahlaafckNckNbhyckNckNaafaaaaaabrJbtcbtdbtebkKbtgbtgbthbtibtjaIuaIubtkbtlbhRbqMbtmbtnbtobtnbtpbtnbtqbtrbtnbtsbpqbttbgybgybgybtubtvbtvbtwbtxbtybtzbqQbtAbtBbqTbslboebfhbfibtCbtCbtDbtCbtCbflbrebrebrebrebtEbtFbgSbrebtGbtHbtIbsEbsEbtJblsbtKbtLbtMbtNbtObtPbtQbtRbtRbtSbtTbpXbtUbgZbsNblAbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaablIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbtWbtXbtYbtXbtXbtXbtZbuabevbubbiXbiVbucbiVbudbiWbiXbuebufboGbsVbrBaXDbugbuhbmbbuibujbukbulbumbmbahlahlaafbdrbggcoCbeMbdraafaaaaaaburbusbutbutbuubuvbuwbuxbqCbuyaIuaIubnTbnTbuzbqMbuAbuBbuCbuDbuEbuFbuGbuCbuDbuCbuDbuCbuDbuCbfabfabtvbuHbsjbuIbuJbqObqQbuKbuLbuMbuNboebuObuPbuQbuRbuSbsEbsEbuTbsEbsEbuUbuVbuWbsEbsDbsEbuXbuYbuZbvabvbbvcbvdbvebvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbtUbgZbsNbvkbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbvubvvbvwbvxbvybvzbvwbvwbvAbrBaJSbvBbvCbmbbvDbvEbvFbvGbumbmbahlahlaafbdrcocbbqboRbdraafaaaaaabrJbvKbvLbvMbvNbuvbuwbuxbqCbvOaIuaIubvPbvQbvRbqMbvSbvTbuCbvUbvVbvWbvXbvYbvZbwabwbbwabwcbuCbgybgybtvbwdbsjbwebwfbwgbwhbwibwjbwjbwkbwlbwmbwnbwobwpbwqbwrbwsbwrbwrbwtbwrbwubwvbwrbwrbwrbwwbwxbwybwzbwAbwBbwCbwDbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbtUbgZbwMbrsbwNbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbwObwPbovbwQaYHbwRbovbwQbwSbwSbwSbwSbwTbwUbwVbwSbwSbwWbwWbwXbwWbvwbwYbwZbxabxbbvwbsVbrBaIvaTkaTkbmbbmbbmbbmbbmbbxcbmbaJOaJPaJUbdrbdtbkNbdsbdraJOaJPaJUbqBbqCbqCbqCbqCbqCbqCbxgbqCbvOaIubxhbuCbuCbxibxjbxkbuCbuCbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbgybgybtvbxwbxxbxybxzbxAbxBbxCbxzbxzbxDbxEbxFbxGbxHbxHbxHbxHbxIbxHbxHbxHbxJbxKbxLbxMbxNbxObxPbxQbxRbwzbxSbxTbxUbxVbxWbxXbxYbpXbpXbxZbyabybbpXbycbpXbtUbgZbsNblAbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbvubvvbvwbvxbvybvzbvwbvwbvAbrBaJSbvBbqpbmbbvDbvEbvFbvGbumbmbahlahlaafbdrcocbbqboRbdraafaaaaaabrJbvKbvLbvMbvNbuvbuwbuxbqCbvOaIuaIubvPbvQbvRbqMbvSbvTbuCbvUbvVbvWbvXbvYbvZbwabwbbwabwcbuCbgybgybtvbwdbsjbwebwfbwgbwhbwibwjbwjbwkbwlbwmbwnbwobwpbwqbwrbwsbwrbwrbwtbwrbwubwvbwrbwrbwrbwwbwxbwybwzbwAbwBbwCbwDbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbtUbgZbwMbrsbwNbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIbwObwPbovbwQaYHbwRbovbwQbwSbwSbwSbwSbwTbwUbwVbwSbwSbwWbwWbwXbwWbvwbwYbwZbxabxbbvwbsVbrBaIvaTkaTkbmbbmbbmbbmbbmbbxcbmbaJOaJPaJUbdrbdtbhybdsbdraJOaJPaJUbqBbqCbqCbqCbqCbqCbqCbxgbqCbvOaIubxhbuCbuCbxibxjbxkbuCbuCbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbgybgybtvbxwbxxbxybxzbxAbxBbxCbxzbxzbxDbxEbxFbxGbxHbxHbxHbxHbxIbxHbxHbxHbxJbxKbxLbxMbxNbxObxPbxQbxRbwzbxSbxTbxUbxVbxWbxXbxYbpXbpXbxZbyabybbpXbycbpXbtUbgZbsNblAbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIaaaaaaaaaaaaaaaaaaaaaaaaaaabwSbydbyebyfbygbyhbyibyjbykbylbymbynbyobypbyqbyrbysbvwbytbyubyvbyvbyvbywbyxbyybbAbyzbyAbyBbyCbyCbyCbBhbyFbyIbyHbyJaIuaIuaIubbeaLFaIuaLpaIuaIuaIubyKbyLbvOaIubyMbuCbyNbyObyPbyQbyRbuCbySbxmbyTbxobxpbxqbxqbyUbyVbyWbxvbgybyXbtvbsjbyYbyZbzabzbbzcbzdbzebzfboeboebfhbzgbxHbzhbzibzjbzkbzlbzmbxHbznbzobzpbzqbzrbzsbxPbxQbxRbztbzubzvbzwbzxbzybzzbxYbzAbzAbzAbzAbzAbzAbzAbpXbtUbgZbsNblAbgZaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIblIblIaaaaaaaaaaaaaaaaaaaaaaaaaaabzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbylbzMbzNbzObyrbzPbvwbzQbzRaIuaIuaIuaIuaIuaIubbAaIubrBaIuaIuaIuaIuaIubzSbeKbzUaIuaIuaIuaIubbeaIuaIuaLpaIuaIuaIubzVbzWbvObzXbzYbzZbAabAbbAcbAdbAebAfbAgbAhbAibAjbuCbAkbAlbAmbAnbAobuCbgybgybtvbtvbtvbtvbtvboeboeboeboeboeboebApbAqbArbxHbAsbAtbAubAvbAwbAxbxHbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbAJbAJbAKbALbAMbxYbzAbANbzAbAObzAbzAbzAbpXbtUbgZbsNblAbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablIblIblIblIblIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwSbAPbAQbARbASbATbAUbyjbylbylbymbylbyobAVbAWbAXbAYbvwbAZbBabBbbBbbBbbBcbBbbBbbBdbBbbBeaIubBfbBgbhIbhIbBiaWEbBkbBlbBmbBnaWEbBkbBoaWEbBpbBqaWEbBrbBsbBtbBuaIuaIubuCbBvbBwbBxbBybBzbuCbBAbBBbBAbuCbuCbuCbuCbuCbuCbuCbuCbgybgybgybBCbBDbuBbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbxHbBObBPbBQbBRbBSbBTbxHbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbChbCibCjbxYbzAbzAbzAbCkbzAbzAbzAbpXbtUbrqbClbrsbrtbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9291,26 +9305,26 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTXaaaaafaafbTYbTYbTYbTYbTYbTYbTYbTYbCvbCvbTZbCvbCvbCvbPtbPubPvbCvbCvbLXbCvckdbELbCvbTbbOqbOqbUabOqbOqbOqbOqbOqbOqbOqbUbbUcbQMbUdbMjbNrbNrbUebUfbUgbUhbOGbOGbOGbTnbUibONbONbUjbUkbUlbPLbUmbUnbUobUpbPQbPRbUqbUrbUrbOPaafbzgbNIbNJbNJbNJbNJbNKbUsbUtbUubUvbUwbUxbUybUybUzbRobNJbTIbSCbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIbRxbUJbRBbSQbUKbTRbULbQubUMbUMbUMbRHbUNbQubNhbgZaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUObUPbUQbURbUSbURbUTbUUbUVbUWbUXbUYbUZbTYbVabVbbVbbVbbVbbVbbVbbVbbVbbVbbVcbVdbVebVebVebVebVfbVgbVgbVhbVibVjbVkbVlbVlbVlbVmbVnbMgbQMbVobVpbVqbONbONbONbVrbVsbONbONbVtbVubVvbOGbVwbVxbVybVzbOGbVAbVBbVCbRdaafbRebVDbVEbVFbOPaafbVGbVHbVIbVIbVIbVJbNJbVKbOXbVLbVMbVNbVObSybVPbSzbVQbNJbTIbSCbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWbVXbVYbVZbVZbVZbWabWbbSSbUMbUMbWcbRHbWdbQubNhbgZbgZbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWobWqbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPaafbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmaaaaaaaafaaaaaaaafaaabCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdaafbOPbOPbOPbOPbOPaafbXHbXIbCDbXJbXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbYebYfchUbRHbYhbQubYibgZblAbgZbgZbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmaaaaaaaafaaaaaaaafaaabCvbWmbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWobELbCvbWrbMgbQMbYAbYBbMobYCbYDbMjbYEbYFbYGbMjbYHbTnbYIbNrbYJbWFbOGbWDbYKbYLbUnbYMbUpbPQbPRbYNbYObYPbOPaafbCDbXIbCDbYQbXKbWMbNJbYRbYSbYTbYUbYVbOQbYWdprchWchXbNJbTIbSCbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgbZhbZibZjbVYbVZbZkbUMbYhbQubNhbgZbrqbgZbZlbgZaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbXcbZmbZnbZobZnbZpbZqbZrbZsbZtbZubTYbZvbZwaaaaaaaaaaaaaaaaaaaaabCvbWmbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbZDbZEbZFbZGbZHbZIbZJbZKbZLbZMbZNbZObZPbZQbZRbZSbZTbMjbOGbTnbZUbZVbYJbZWbOGbWDbYKbVAbVBbZXbRdaafbReclkbZZcaabOPaafbCDbXIbCDcabcacbWMbNJbNJcadcaebNJbNNbNJbNJbSubNJbNJbNJbTIbSCbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcaicajcakcalbRxcambRHbYhbQubNhbgZblAblAblAcanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYaafaaaaaaaPYaaaaaaaaaaaaaaacaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPaafcaSbXIbCDcaTbXKbWMcaUbNJbNJcaVbNJdpGdpFdpEdpzcaZcbabXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRdtebTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmaaaaaaaafaaaaaaaafaaabCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdaafbOPbOPbOPbOPbOPaafbXHbXIbCDbXJbXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmaaaaaaaafaaaaaaaafaaabCvbWmbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWobELbCvbWrbMgbQMbYAbYBbMobYCbYDbMjbYEbYFbYGbMjbYHbTnbZUbNrbYJbWFbOGbWDbYKbYLbUnbYMbUpbPQbPRbYNbYObYPbOPaafbCDbXIbCDbYQbXKbWMbNJbYRbYSbYTbYUbYVbOQbYWdprchWchXbNJbTIbSCbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgbZhbZibZjbVYbVZbZkbUMbYhbQubNhbgZbrqbgZbZlbgZaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbXcbZmbZnbZobZnbZpbZqbZrbZsbZtbZubTYbZvbZwaaaaaaaaaaaaaaaaaaaaabCvbWmbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbZDbZEbZFbZGbZHbZIbZJbZKbZLbZMbZNbZObZPbZQbZRbZSbZTbMjbOGbTndjybZVbYJbZWbOGbWDbYKbVAbVBbZXbRdaafbReclkbZZcaabOPaafbCDbXIbCDcabcacbWMbNJbNJcadcaebNJbNNbNJbNJbSubNJbNJbNJbTIbSCbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcaicajcakcalbRxbCzbRHbYhbQubNhbgZblAblAblAcanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYaafaaaaaaaPYaaaaaaaaaaaaaaacaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPaafcaSbXIbCDcaTbXKbWMcaUbNJbNJcaVbNJdpGdpFdpEdpzcaZcbabXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHaaGaaGaaHaaGaaGaaGaaRaaGaaGaaGaaHaaGaafaafbCvbELbELbELbELbELbELbELbELcbocbpaafaaaaaaaafaagaFFaaaaaaaaabRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAcbBcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdaafbOPbOPbOPbOPbOPaafcbMbXIbCDcbNcbObVHbVIbVIcbPcbQbNKdpCdpBdpDdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHcchblAccibgZccjcckblAcclaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaGaaaaaabCvccmbELbCvbCvbTZbCvbCvbCvbCvbCvaaaaaaaaaaagaDIauKaagaagaafbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPaafbXHbXIbCDbCDbCDbXKbCDbCDccMccNbNKbNKdpAbNKdpzccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHcdbblAbNhbgZbgZbgZblAbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaacdccddcdeaaacdccddcdeaaacdccddcdeaafaaGaaaaaabCvcdfcdgbCvcdhbELbELcdicdjcdkbCvaaaaaaaaaatIaagaagaafaaaaaacdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdaafbReclhcdIcdJbOPaafbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZceccedblAbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaacdcceecdeaaacdcceecdeaaacdcceecdeaafaafaaaaaabCvbPtbPvbCvbCvcefcegbQCbELbSYbCvaaaaaaaaaaaaaafaaaaaaaaaaaabCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPaafbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEaaaaaaaaaaafaaaaaaceVaaaaafaaaaaaaaaaaabgZceWceXceYceZceZbRHcfacfaceacfbcfccfdblAblAblAcfebgZbYibgZcffblAblAbgZbgZbgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafcdcceecdeaaacdcceecdeaafcdcceecdeaafaafaaaaaaaaaaaaaafaafbCvbCvbCvbCvbTZbCvbCvaaaaaaaaaaaaaafaaaaaaaafaaabCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdaafbOPbOPbOPbOPbOPaafbCDcabcfHcfIcfJcacbCDbCDbCDcfKcfLcdUbXKcfMcfNbzgbCDbgZceUbLEaaaaaaaaaaafaaaaaaceVaaaaafaaaaaaaaaaaabgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVcfWbgZcfXbECbECbECcfYcfZcgacfZcgbaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacdcceecdeaafcdcceecdeaaacdcceecdeaaaaafaaaaaaaaaaaaaaaaaabCvckLbCvbELbELbCvaafaaaaafaaaaaaaafaaaaaaaafaaabCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwaafaafaafaafaafaafaafaaaaafcbMbXKcbMaafaaabCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHcgJbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaafaaacdcceecdeaafcdcceecdeaaacdcceecdeaafaafaafaafcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcgVcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIaafaafaaaaaaaaaaaaaafaaaaafchpcfIchpaafaaabCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFchGchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafchMaafaafaafchMaafaaaaafchMaafaaaaafchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihciicijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisaafaafaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafaaabCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLciMciIciIciIciIciNciObgZciPbpYciQbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaafaaacdcceecdeaafcdcceecdeaaacdcceecdeaafaafaafaafcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIaafaafaaaaaaaaaaaaaafaaaaafchpcfIchpaafaaabCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFchGchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafchMaafaafaafchMaafaaaaafchMaafaaaaafchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisaafaafaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafaaabCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLciMciIciIciIciIciNciObgZciPbpYciQbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjecjfbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbELcjjcjkcjlcjmciccjncjncjociccjpcjqcjrcjscjtcjucjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGduncicaafcjIaafcjJaafcjIaafcjJaafcjKaafcjKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabCDbXKcjLcjMcjNcjOcjPbFodpMcjRbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafcjWaafaaaaafcjWaafaaaaafcjWaafaaaaaachNchOcjXcjYcjZckacgNbELbELbELbELbCvaaaaaaaafaaaaaaaafaaaaaaaafbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknckockpckqckrckscghcktckuckvcjCckwcghckxckycnqcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaabgZcnyckEbgZcjTblAbgZaaaaaaaaaaaabgZblAblAckFckGckGckHckIckGaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaafaafcdcckJcdeaaacdcckJcdeaaacdcckJcdeaafaafaafaafckKcgNcgNcgNcgNckccmlbELbELbCvaafaafbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvcdjckOcicckPckhckhckickQckRckSckSckSckRckRckTckUckVcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabCDcfKclmcnZcacbCDbCDaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgZcnUbgZbgZcloblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcckJcdeaafcdcckJcdeaaacdcckJcdeaaaaaaaaaaaaaaaaaaaaaaaabCvbCvbCvbXlbELbCvaaaaaabGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFclFckUclGclHclIclJcghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcmaahlaaaaafaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaacmccmdcmebgZcoGbpYbgZcmgblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafcdcckJcdeaaacdcckJcdeaaacdcckJcdeaafaaaaaaaaaaaaaaaaaaaaacgccgdcgcbELbELbCvaaaaaabGvcmUcmVcmUcmYcmXcnBcmrcmsbVlbVlbVlcmtcicclAclAclBciccmucmvcmwcmxcmycmzcmAcjwcmzcmBcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcmNahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafcdcckJcdeaaacdcckJcdeaafcdcckJcdeaafaafaafaafaafaafaafaafbCvbCvbCvbCvbELbCvaafaafbGvcoacoBcoAcodcobbGvcmZcnaciccnbciccnccicclAclBclBciccndcnecnfcngclFcmGcnhcnicnhcnjcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaagcbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZaaaaafaaaaafaaacnscntcnucnvcnwaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaafcdccnxcdeaaacdccnxcdeaaacdccnxcdeaafaaGaafaaaaaaaaaaaaaaaaaaaaaaaabLWbELcaqaaaaaabGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcnJcnKcnKcnKcnLcnMcnNcnOcnOcnPcnPcnQcnPcnPdufduecicaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaagcbnblAbvkbgZdpwblAblAblAblAblAblAblAbgZaaaaafaaaaafaaaaafcnVcnWcnVaafaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaGaafaafaaaaaaaaaaaaaaaaaaaaabRMbELbRMaaaaaabGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopckUcoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduicicciccicciccmvcmvcmvcicaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoucmdcmebgZcnUbgZbgZcovcowckEcoxbgZbgZaaaaafaaaaaaaaaaafcoycnucoyaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafcjWaafaaaaafcjWaafaaaaafcjWaafaaaaaachNchOcjXcjYcjZckacgNbELbELbELbELbCvaaaaaaaafaaaaaaaafaaaaaaaafbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknbYebYIbYXckrbhAcghbvCckuckvcjCckwcghckxckycnqcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaabgZcnyckEbgZcjTblAbgZaaaaaaaaaaaabgZblAblAckFckGckGckHckIckGaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaafaafcdcckJcdeaaacdcckJcdeaaacdcckJcdeaafaafaafaafckKcgNcgNcgNcgNckccmlbELbELbCvaafaafbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvcdjckOcicckPckhckhckickQckRckSckScamcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabCDcfKclmcnZcacbCDbCDaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgZcnUbgZbgZcloblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcckJcdeaafcdcckJcdeaaacdcckJcdeaaaaaaaaaaaaaaaaaaaaaaaabCvbCvbCvbXlbELbCvaaaaaabGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFckpcmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcmaahlaaaaafaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaacmccmdcmebgZcoGbpYbgZcmgblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGcaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafcdcckJcdeaaacdcckJcdeaaacdcckJcdeaafaaaaaaaaaaaaaaaaaaaaacgccgdcgcbELbELbCvaaaaaabGvcmUcmVcmUcmYcmXcnBcmrcmsbVlbVlbVlcmtcicclAclAclBciccmucmvcmwcmxckTckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcmNahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafcdcckJcdeaaacdcckJcdeaafcdcckJcdeaafaafaafaafaafaafaafaafbCvbCvbCvbCvbELbCvaafaafbGvcoacoBcoAcodcobbGvcmZcnaciccnbciccnccicclAclBclBciccndcnecnfcngckpclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaagcbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZaaaaafaaaaafaaacnscntcnucnvcnwaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaafcdccnxcdeaaacdccnxcdeaaacdccnxcdeaafaaGaafaaaaaaaaaaaaaaaaaaaaaaaabLWbELcaqaaaaaabGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcmBcnKcmycnKcnLcnhcnNcnOcnOcnPcnPcnQcnPcnPdufduecicaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaagcbnblAbvkbgZdpwblAblAblAblAblAblAblAbgZaaaaafaaaaafaaaaafcnVcnWcnVaafaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaGaafaafaaaaaaaaaaaaaaaaaaaaabRMbELbRMaaaaaabGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduicicciccicciccmvcmvcmvcicaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoucmdcmebgZcnUbgZbgZcovcowckEcoxbgZbgZaaaaafaaaaaaaaaaafcoycnucoyaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaGaaHaaHaaRaaGaaGaaGaaGaaHaaGaaGaaHcozaaaaafaafaaaaaaaaaaaaaaaaafbRMbELbRMaafaafbGvcpYcuqcridptdhldpvdpudpydpxcoJcnPcoKcoLcoMcoNcoOcoPcmFckUcoQcoRckUcoSciccoTcoUcoVcoUcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcmbaaabgZbgZcgCcgEbgZbgZaafaafaaaaaaaaaaaaaafaaacpdaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaacdmbELcdmaaaaaabGvcbScbRcaYcaXcaWbGvbSrbHWbGvckUckUcmFckUcmIcplcpmcpncmFcopckUckjcpocpocppcpqcprcpscptcpucpvcpwcpwcpxckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcpCcpDahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaabqzaaaaaaaafaaaaafaaaaaaaafaafaafaaaaaaaaaaafaaacpdaaaaafaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaabCvbCvbTZbCvbCvaaabGvcluccOcbTbGvbGvbGvbGvbGvciccpHckUcmFckUcjFcpIcpJcpKcmFcpLcpMcpNcpOcpPciccpQcpRcpScopcpTciccpUcpVcpVcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaacqbcqbcqbcqcaafaafaafaafcpdaafaafaafaafaafaaRcqbcqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9327,36 +9341,36 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccrRcrHaaaaaaaafaaacrYaafaagaagaagaafaafcrIaafaaaaaacrHcrRciccicaaaaaaaafaafaafaaaahlahlahlahlaaaahlahlahlahlahlahlahlahlahlahlahjahlahlahldtzdtBdtAahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaacqbaafcrjcrkcrkcrkcrkcrZcsacrZcrncrncrncrncroaafcqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccrPcrQcrHaaaaaaaafaaaaaaaafaafaafaafaafaaaaaaaafaaaaaacrHcrNcrOcicaaaahlahlaafaagaafahlahlahlahlaaaahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdtzdtyahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaacqbaafcrBcrBcrBcrBcrBaaacpdaaacrBcrBcrBcrBcrBaaacqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccrCcrHcsbaaaaaacscaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacrHcrHcrCcicaaaahlahlaaeaafaaaahlahlahlahlaaaahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdsEdpHdsGdsFdqudqudqudquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaacqbaaaaaaaafaafaafaaaaaacpdaafaaaaaaaafaafaaaaaacqbaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaciccsecsfcrHaafaafaafcrIaaaaaacrIaaaaaaaaaaaacrIaafcsgaafcrHcshcsicicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahldtuahjahjahjahjdpHdsAdszdsydsxdsDdsCdsBdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaeaaaaaaaaaaaacqbcqbcqbcqbcqbaaaaaaaaacpdaaaaaaaaacqbcqbcqbcqccqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaciccsecsfcrHaafaafaafcrIaaaaaacrIaaaaaaaaaaaacrIaafcsgaafcrHcshcsicicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahldtuahjahjahjahjdpHdsAdspdsydtrdsDdsCdsBdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaeaaaaaaaaaaaacqbcqbcqbcqbcqbaaaaaaaaacpdaaaaaaaaacqbcqbcqbcqccqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccsjcsjcrHaaaaaaaafaafaafaafaafaafaafaafaafaafaafaaaaaacrHcsjcsjcicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdswdsrdrUdrUdsudstdsvdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqbaafcskaafcqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclcciccqWcrHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqWcicclcaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdssdsrdrUdrUdsqdspdsodquahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqbaaaaafaaacqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclcciccqWcrHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqWcicclcaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdssdsrdrUdrUdsqdsodqydquahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqbaaaaafaaacqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjdpHdpHdsmdrUdrUdqudsndqudquahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqbcqbcqbcqbcqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahjahjdsidsiahlahjahldsjdrWdrUdrUdsldskdsjahjahjahjdsidsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdpXdshdshdpXdpXahldsddsedsgdsfdscdsbdsdahldpXdpXdshdshdpXdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrYdrXdpXdpXdrSdrWdrUdrVdrUdtadrSdpXdpXdrZdsadrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrIdrOdqidrcdrcdrKdrLdrcdrNdrMdrcdrcdqidrJdrHdrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrIdrOdqidrcdrcdrKdrLdrcdrLdrMdrcdrcdqidrJdrHdrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrEdrGdqpdqpdrFdrAdrzdredredredrDdrCdrBdqedqedrxdrydqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdrRcMfdrQdrcdrpdredredrudredredrodrcdrQdrQdrPdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdpYcLyahlaaadrcdrvdrwdrtdpIdrrdrsdrqdrcaaaahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdradpHdpHdpHdrcdrddredrfdrhdrfdredridrcdpHdpHdpHdrjdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdpYcLyahlaaadrcdsYdrmdrkdrfdrfdrmdsZdrcaaaahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdpYcLyahlaaadrcdsYdrmdrfdrfdtqdrmdsZdrcaaaahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldqudqQdqtdqTdqUaXNdqvdqWdquahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqZdqDdqYbandqXdqDdqVaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqMbanbandqObanbandqPaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqRdpHdpHdquaXNdqDbanbcybcybcybandqDaXNdqudpHdpHdqSdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmdquaXNdqFdqDdqGbcydqIbcydqGdqDdqHaXNdqudqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqDbandqKdqLdqJbandqDaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNbhybanbandqzbanbanbhyaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqDdqEdqAdqBdqDdqEdqDaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNbanbanbandqzbanbanbanaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdtldqEdqAdqBbxddqEdtlaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqxdpHdpHdpHdquaXNdqvaXNdqwaXNdqtaXNdqudpHdpHdpHdqsdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahjahldqudqudqudqydqudqudquahlahlahldqfdpZdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqhdqidqjdqjdpHcECdpJdpKdpLdpWdpHdqidqidqidqkdpZdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqndqqdqpdqpdqpdqcdqadqadqbdqgdqldqddqedqedqedqedqrdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahldrQdrQdrQdrQdrQdpHdsTdsSdsRdsQdsPdsOdsNdrQdrQdtZdtZahldpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaGaaGaaGaaGdpXdpXdpXdpHdsKdsMdsLdsJdsIdpHdpXdpXdpXdpXdpXdpXdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjdpHdpHdsGdsUdsVdpHdpHahlahlahjahjahjahlahlaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahlahldqudqudqudtjdqudqudquahlahlahldqfdpZdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahjahldpHcECdpLdpJdpKdpWdpHahlahlahldqfdpZdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqhdqidqjdqjdpHdqadqbdqgdsPdtidpHdqidqidqidqkdpZdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqndqqdqpdqpdqpdqcdtpdtodszdtndqldqddqedqedqedqedqrdqmdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahldrQdrQdrQdrQdrQdpHdsTdsSdsRdsQdtmdsOdsNdrQdrQdtZdtZahldpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaGaaGaaGaaGdpXdpXdpXdpHdsKdsMdsLdsJdsIdpHdpXdpXdpXdpXdpXdpXdpXaaaahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjdpHdpHdsGdsUdsVdpHdpHahlahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahjahjahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslaaacslcslcslcslcslaaacslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslaaacslcslcslcslcslaaacslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9534,9 +9548,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqaaaaaaaaacAjcAycAncAncAncAzcAjcApcApcApcApcApcApcAlaaaaaaaaaaaacAAcABcACcACcACcADcAEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAqcAvcAqcAvcAqcAvcAqcAvcAqcAvcAqcAvcAqcAvcAqcAvcAqaaaaaaaaacAjcAycAncAncAncAzcAjcApcAlcAlcAFcAlcAlcAlaaaaaaaaacAAcAGcAHcAIcAJcAIcAKcALcAEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqcAqaaaaaaaaacAjcAjcAMcAjcAjcANcAjcApcAlcAOcAOcAOcAPcAlaaaaaaaaacAQcARcAScATcATcATcAUcAVcAQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjcAWcAXcAYcAWcAjcApcAlcAOcAOcAOcAOcAlaaaaaaaaacAQcAZcBacBbcATcATcAUcBccAQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjcBdcBecBfcAWcAjcApcAlcAOcBgcBhcBicAlaaaaaacAAcBjcBkcBkcBlcBmcBncBkcBkcBjcAEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBocBocBocBocBoaaaaaacAjcAWcAXcBpcBqcAjcApcAlcBrcBscBtcBucAlaaaaaacAQcBvcBvcBvcBwcBxcATcBxcBycBzcBAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjcAWcAXcAYcAWcAjcApcAlcAOcAOcAOcAOcAlaaaaaaaaacAQcAZcBacBbdjzcATcAUcBccAQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjcBdcBecBfcAWcAjcApcAlcAOcBgcBhcBicAlaaaaaacAAcBjcBkcBkcBlcBkcBncBmcBkcBjcAEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBocBocBocBocBoaaaaaacAjcAWcAXcBpcBqcAjcApcAlcBrcBscBtcBucAlaaaaaacAQcBvcBvcBvcBwdtfcATcBxcBycBzcBAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBocBBcBCcBDcBocuScAjcAjcBEcAjcAjcAjcAjcAjcAlcAOcAOcAOcAOcBFcBGcBHcAQckMcBJcBJcBKcATcATcATcATcBxcAQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBocBLcBMcBMcBocBNcBOcAncBPcBPcBPcBPcBOcBQcAlcAOcAOcAOcAOcBRcBScBRcBTcBJcBUcBUcBwcBVcBWcBXcATcBxcBAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBocBocBocBocBocBocBocBocBocBocBocBocBocBocBocBocBYcBocBocBQcBZcAncCacCbcCccBPcBZcBQcAlcBFcBHcCdcBFcBGcBGcBHcCecBkcBkcBkcCfcBXcBXcBXcATcBxcAQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10337,7 +10351,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAda
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdaEdaEdaEdaEdaEdcldcldcldcldcldcldcldcldiudivdiwdcldcldcldaEdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdaEdaEdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdiadixdiadiadiadiadiadiadigdiydcldcldcldcldcldcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaadaEdaEdaEdaEdaEdaEdaEdcldcldcldcldcldhodeCdeDdcldcldcldcldcldcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaEdaEdcldcldizdizdizdizdizdizdiAdiBdiBdiCdizdizdizdizdiDdcldcldaEdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdaEdcldcldcldcldcldaEdaEdaEdaEdaEdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdiadiadiadiadiEdiFdiGdiadiediHdiadimdiadiadiadiIdiJdiKdiadcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaadaEdaEdaEdaEdaEdcldcldcldcldcldcldeydePdeAdcldcldcldcldcldcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdcldcldcldizdiLdiMdiNdiOdiPdiQdiRdiSdiSdiTdiUdiVdiWdeDdcldcldaEdaEdaEdaEdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldcldaEdaEdaEdaEdaEdaAdaAdaAdaAdaAdaCdaCdiadiXdiYdiZdjadjbdjcdiadiidijdjddigdiadjedjfdjgdjgdjgdipdcldcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaadaEdaEdaEdcldcldcldcldcldcldcldcldjhdjidjjdjkdjidjidcldcldcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaAdaAdaEdcldcldcldizdjldiUdjmdjndiUdiUdiUdiUdiUdjodiUdiVdjpdjqdcldcldcldcldcldaEdaEdaEdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdaEdaEdcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaAdaAdaAdaAdaAdaCdiadjrdjbdjsdjtdjudjvdiadiadiadiadigdiadjedjwdjwdjwdjxdisdcldcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaadcldcldcldcldcldcldcldcldcldcldcldjhdjydjydjydjzdjidcldjAdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaAdaAdaEdcldcldcldizdjldiUdjmdjndiUdiUdiUdiUdiUdjodiUdiVdjpdjqdcldcldcldcldcldaEdaEdaEdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdaEdaEdcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaAdaAdaAdaAdaAdaCdiadjrdjbdjsdjtdjudjvdiadiadiadiadigdiadjedjwdjwdjwdjxdisdcldcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaadcldcldcldcldcldcldcldcldcldcldcldjhdthdtgdtgdtgdjidcldjAdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaAdaAdaEdcldcldcldizdjBdiUdiUdjCdiUdiUdiUdiUdiUdiTdjDdjEdiTdeAdcldcldcldcldcldcldcldaEdaEdaEdaEdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaEdaEdaAdaAdaCdiadjFdjbdjGdjbdjHdjbdjIdjxdjJdjKdjLdiadjMdjwdjNdjwdjOdiydcldcldcldcldcldclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcldcldcldcldcldjPdjPdjQdjRdjhdjSdjTdjTdjUdjidjidjidjidcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldizdjVdiUdjWdjXdjYdjZdkadiUdkbdizdizdizdizdizdhodeDdcldcldcldcldcldcldcldcldaEdaEdaEdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldhodeDdcldcldcldcldcldcldcldcldcldaEdaEdaAdaAdiadiadiadiadiadiadiadkcdkddkedkcdkddiadiadiadiadiadkfdiadiadkgdkhdcldclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcldcldkidjRdkjdkkdkldkmdkndkodkodkpdkqdkrdksdktdeDdcldcldclddadaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAdaAaaadaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdcldcldizdkudiUdkvdjndkwdkxdkydiUdkzdkAdkBdkCdkDdkEdhvdhwdgSdgSdgSdgSdgSdfQdcldcldcldcldaEdaEdaEdaAdaAdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdaEdcldcldhpdgSdgSdgSdgSdgSdgSdgSdgSdhvdhwdgSdgSdgSdgSdfQdcldcldcldcldcldaEdaAdaAdaAdaAdaAdiadkFdkGdkHdjwdjOdkIdjxdjOdjIdkJdkKdjwdjxdjOdjwdjwdkLdkMdiJdiKdkNdkOdkOdkOdkOdkOdkOdkOdkPdkPdkPdkPdkPdkPdkPdjQdkQdkRdkSdkkdkTdkUdkVdkWdkodkodkodkXdkYdkZdladjqdcldcldclddadaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm
index 9a308d3f9c7..edb3113fa78 100644
--- a/code/__HELPERS/matrices.dm
+++ b/code/__HELPERS/matrices.dm
@@ -1,3 +1,17 @@
/matrix/proc/TurnTo(old_angle, new_angle)
. = new_angle - old_angle
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
+
+
+/atom/proc/SpinAnimation(speed = 10)
+ var/matrix/m120 = matrix(transform)
+ m120.Turn(120)
+ var/matrix/m240 = matrix(transform)
+ m240.Turn(240)
+ var/matrix/m360 = matrix(transform)
+ speed /= 3 //Gives us 3 equal time segments for our three turns.
+ //Why not one turn? Because byond will see that the start and finish are the same place and do nothing
+ //Why not two turns? Because byond will do a flip instead of a turn
+ animate(src, transform = m120, time = speed, loop = -1)
+ animate(transform = m240, time = speed)
+ animate(transform = m360, time = speed)
\ No newline at end of file
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 2f8c2204921..4fc8bf4b1b8 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -73,10 +73,9 @@ datum/shuttle_controller
last_call_loc = null
if(recall_count == 2)
- captain_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace any further signals to their source. Results may be viewed on any communications console.")
+ priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace any further signals to their source. Results may be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg')
else
- captain_announce("The emergency shuttle has been recalled.")
- world << sound('sound/AI/shuttlerecalled.ogg')
+ priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority")
setdirection(-1)
online = 1
@@ -86,7 +85,10 @@ datum/shuttle_controller
proc/timeleft()
if(online)
var/timeleft = round((endtime - world.timeofday)/10 ,1)
- if(direction == 1 || direction == 2)
+ if(timeleft > (MIDNIGHT_ROLLOVER/10)) // midnight rollover protection
+ endtime -= MIDNIGHT_ROLLOVER // subtract 24 hours from endtime
+ timeleft = round((endtime - world.timeofday)/10 ,1) // recalculate timeleft
+ if(direction == 1)
return timeleft
else
return SHUTTLEARRIVETIME-timeleft
@@ -130,8 +132,7 @@ datum/shuttle_controller
incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so
log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
+ priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority")
proc/move_shuttles()
var/datum/shuttle_manager/s
@@ -146,11 +147,9 @@ datum/shuttle_controller
if(!online)
return
var/timeleft = timeleft()
- if(timeleft > 1e5) // midnight rollover protection
- timeleft = 0
if(location == UNDOCKED)
if(direction == -1)
- if(timeleft >= timelimit)
+ if(timeleft >= timelimit) // Shuttle reaches CentCom after being recalled.
online = 0
direction = 1
endtime = null
@@ -165,14 +164,13 @@ datum/shuttle_controller
location = DOCKED
settimeleft(SHUTTLELEAVETIME)
send2irc("Server", "The Emergency Shuttle has docked with the station.")
- captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
- world << sound('sound/AI/shuttledock.ogg')
+ priority_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
else if(timeleft <= 0) //Nothing happens if time's not up and the ship's docked or later
if(location == DOCKED)
move_shuttles()
location = TRANSIT
settimeleft(SHUTTLETRANSITTIME)
- captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
+ priority_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.", null, null, "Priority")
else if(location == TRANSIT)
move_shuttles()
//message_admins("Shuttles have attempted to move to Centcom")
diff --git a/code/controllers/supply_shuttle.dm b/code/controllers/supply_shuttle.dm
index 758d1bd7c92..1457fa818bb 100644
--- a/code/controllers/supply_shuttle.dm
+++ b/code/controllers/supply_shuttle.dm
@@ -121,6 +121,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
var/points_per_process = 1
var/points_per_slip = 2
var/points_per_crate = 5
+ var/points_per_intel = 100
var/plasma_per_point = 0.2 //5 points per plasma sheet due to increased rarity
var/centcom_message = "" // Remarks from Centcom on how well you checked the last order.
// Unique typepaths for unusual things we've already sent CentComm, associated with their potencies
@@ -228,6 +229,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
if(!shuttle) return
var/plasma_count = 0
+ var/intel_count = 0
var/crate_count = 0
centcom_message = ""
@@ -287,6 +289,10 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
var/obj/item/stack/sheet/mineral/plasma/P = A
plasma_count += P.amount
+ // Sell syndicate intel
+ if(istype(A, /obj/item/documents/syndicate))
+ intel_count += 1
+
if(istype(A, /obj/item/seeds))
var/obj/item/seeds/S = A
if(S.rarity == 0) // Mundane species
@@ -306,11 +312,15 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
qdel(MA)
if(plasma_count)
- centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] units of exotic material.
"
+ centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] unit(s) of exotic material.
"
points += round(plasma_count / plasma_per_point)
+ if(intel_count)
+ centcom_message += "+[round(intel_count*points_per_intel)]: Received [intel_count] article(s) of enemy intelligence.
"
+ points += round(intel_count*points_per_intel)
+
if(crate_count)
- centcom_message += "+[round(crate_count*points_per_crate)]: Received [crate_count] crates.
"
+ centcom_message += "+[round(crate_count*points_per_crate)]: Received [crate_count] crate(s).
"
points += crate_count * points_per_crate
//Buyin
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index d333851fb73..4dba24ce357 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -405,7 +405,7 @@ client
if(href_list["Vars"])
debug_variables(locate(href_list["Vars"]))
- if(href_list["datumrefresh"])
+ else if(href_list["datumrefresh"])
var/datum/DAT = locate(href_list["datumrefresh"])
if(!istype(DAT, /datum))
return
diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm
index 616c4eee99a..4d3ac8b7fd0 100644
--- a/code/datums/mixed.dm
+++ b/code/datums/mixed.dm
@@ -1,19 +1,32 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/datum/powernet
var/list/cables = list() // all cables & junctions
var/list/nodes = list() // all APCs & sources
- var/newload = 0
- var/load = 0
- var/newavail = 0
- var/avail = 0
- var/viewload = 0
- var/number = 0
- var/perapc = 0 // per-apc avilability
- var/netexcess = 0
+ var/newload = 0 // increased by every machines each tick then becomes...
+ var/load = 0 // ...the current load on the powernet
+ var/newavail = 0 // increased by every machines each tick then becomes...
+ var/avail = 0 //...the current available power in the powernet
+ var/viewload = 0 //the load as it appears on the power console (gradually updated)
+ var/number = 0 //Unused //TODEL
+ var/perapc = 0 // per-apc avilability
+ var/netexcess = 0 //excess power on the powernet (typically avail-load)
+
+/*Powernet procs :
+
+In modules/power/power.dm :
+
+/datum/powernet/New()
+/datum/powernet/Destroy()
+/datum/powernet/proc/is_empty()
+/datum/powernet/proc/remove_cable(var/obj/structure/cable/C)
+/datum/powernet/proc/add_cable(var/obj/structure/cable/C)
+/datum/powernet/proc/remove_machine(var/obj/machinery/power/M)
+/datum/powernet/proc/add_machine(var/obj/machinery/power/M)
+/datum/powernet/proc/reset()
+/datum/powernet/proc/get_electrocute_damage()
+*/
/datum/debug
var/list/debuglist
\ No newline at end of file
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index f18ddd01a0f..06bedadbd4d 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -7,6 +7,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
name = "Spell"
desc = "A wizard spell"
panel = "Spells"
+ anchored = 1 // Crap like fireball projectiles are proc_holders, this is needed so fireballs don't get blown back into your face via atmos etc.
density = 0
opacity = 0
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 06894734078..c29b5dcff44 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -921,8 +921,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
name = "Religious Supplies Crate"
contains = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
- /obj/item/weapon/storage/bible/booze,
- /obj/item/weapon/storage/bible/booze,
+ /obj/item/weapon/storage/book/bible/booze,
+ /obj/item/weapon/storage/book/bible/booze,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/chaplain_hoodie,
@@ -1019,7 +1019,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/under/rank/clown,
/obj/item/weapon/bikehorn,
/obj/item/clothing/under/mime,
- /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/sneakers/black,
/obj/item/clothing/gloves/white,
/obj/item/clothing/mask/gas/mime,
/obj/item/clothing/head/beret,
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 6712228a671..bfdfb312732 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -101,11 +101,17 @@ var/list/uplink_items = list()
category = "Conspicuous and Dangerous Weapons"
/datum/uplink_item/dangerous/revolver
- name = "Full Revolver"
+ name = "Syndicate Revolver"
desc = "The syndicate revolver is a traditional handgun that fires .357 Magnum cartridges and has 7 chambers."
item = /obj/item/weapon/gun/projectile/revolver
cost = 6
+/datum/uplink_item/dangerous/pistol
+ name = "Stechkin Pistol"
+ desc = "A small, easily concealable handgun that uses 10mm magazines and is compatible with silencers."
+ item = /obj/item/weapon/gun/projectile/automatic/pistol
+ cost = 5
+
/datum/uplink_item/dangerous/smg
name = "C-20r Submachine Gun"
desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine."
@@ -217,7 +223,6 @@ var/list/uplink_items = list()
desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol."
item = /obj/item/ammo_box/magazine/m10mm
cost = 1
- gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun
name = "Ammo-7.62×51mm"
@@ -257,7 +262,6 @@ var/list/uplink_items = list()
desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it."
item = /obj/item/weapon/silencer
cost = 2
- gamemodes = list(/datum/game_mode/nuclear)
// STEALTHY TOOLS
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 21f89fb2e7b..5e2726cd14e 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -175,9 +175,9 @@
desc = "A trap used to catch bears and other legged creatures."
var/armed = 0
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
- return (BRUTELOSS)
+/obj/item/weapon/legcuffs/beartrap/suicide_act(mob/user)
+ user.visible_message("[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
..()
@@ -186,26 +186,31 @@
icon_state = "beartrap[armed]"
user << "[src] is now [armed ? "armed" : "disarmed"]"
+
/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
- if(armed)
- if(ishuman(AM))
- if(isturf(src.loc))
+ if(armed && isturf(src.loc))
+ if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
+ var/mob/living/L = AM
+ armed = 0
+ icon_state = "beartrap0"
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ L.visible_message("[L] triggers \the [src].", \
+ "You trigger \the [src]!")
+
+ if(ishuman(AM))
var/mob/living/carbon/H = AM
- if(H.m_intent == "run")
- armed = 0
+ if(H.lying)
+ H.apply_damage(20,BRUTE,"chest")
+ else
+ H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg")))
+ if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs.
H.legcuffed = src
src.loc = H
H.update_inv_legcuffed(0)
- H << "\red You step on \the [src]!"
feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
- for(var/mob/O in viewers(H, null))
- if(O == H)
- continue
- O.show_message("\red [H] steps on \the [src].", 1)
- if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
- armed = 0
- var/mob/living/simple_animal/SA = AM
- SA.health -= 20
+
+ else
+ L.apply_damage(20,BRUTE)
..()
diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm
index 26cf272df9c..d5912a1c163 100644
--- a/code/defines/procs/AStar.dm
+++ b/code/defines/procs/AStar.dm
@@ -122,7 +122,8 @@ proc
var/closed[] = new()
var/path[]
start = get_turf(start)
- if(!start) return 0
+ if(!start)
+ return 0
open.Enqueue(new /PathNode(start,null,0,call(start,dist)(end)))
@@ -166,10 +167,7 @@ proc
continue
open.Enqueue(new /PathNode(d,cur,ng,call(d,dist)(end),cur.nt+1))
- if(maxnodes && open.L.len > maxnodes)
- open.L.Cut(open.L.len)
}
-
var/PathNode/temp
while(!open.IsEmpty())
temp = open.Dequeue()
@@ -179,6 +177,8 @@ proc
temp.bestF = 0
closed.Cut(closed.len)
+ if(path && maxnodes && path.len > maxnodes+1)
+ return 0
if(path)
for(var/i = 1; i <= path.len/2; i++)
path.Swap(i,path.len-i+1)
diff --git a/code/defines/procs/captain_announce.dm b/code/defines/procs/captain_announce.dm
deleted file mode 100644
index 9b91705ea56..00000000000
--- a/code/defines/procs/captain_announce.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/proc/captain_announce(var/text)
- world << "
Priority Announcement
"
- world << "[html_encode(text)]"
- world << "
"
-
diff --git a/code/defines/procs/command_alert.dm b/code/defines/procs/command_alert.dm
deleted file mode 100644
index 9635e20eb97..00000000000
--- a/code/defines/procs/command_alert.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-/proc/command_alert(var/text, var/title = "")
- var/command
- command += "[command_name()] Update
"
-
- if (title && length(title) > 0)
- command += "
[html_encode(title)]
"
-
- command += "
[html_encode(text)]
"
- command += "
"
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << command
- if(title == "")
- news_network.SubmitArticle(text, "Centcom Official", "Central Command", null)
- else
- news_network.SubmitArticle(title + "
" + text, "Centcom Official", "Central Command", null)
diff --git a/code/defines/procs/priority_announce.dm b/code/defines/procs/priority_announce.dm
new file mode 100644
index 00000000000..12690ea4a41
--- /dev/null
+++ b/code/defines/procs/priority_announce.dm
@@ -0,0 +1,29 @@
+/proc/priority_announce(var/text, var/title = "", var/sound = 'sound/AI/attention.ogg', var/type)
+ if(!text)
+ return
+
+ var/announcement
+
+ if(type == "Priority")
+ announcement += "Priority Announcement
"
+
+ else if(type == "Captain")
+ announcement += "Captain Announces
"
+ news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
+
+ else
+ announcement += "[command_name()] Update
"
+ if (title && length(title) > 0)
+ announcement += "
[html_encode(title)]
"
+ if(title == "")
+ news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null)
+ else
+ news_network.SubmitArticle(title + "
" + text, "Central Command", "Station Announcements", null)
+
+ announcement += "
[html_encode(text)]
"
+ announcement += "
"
+
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << announcement
+ M << sound(sound)
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index f91338962b6..673b9f0e7bf 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -123,6 +123,7 @@ proc/process_ghost_teleport_locs()
power_light = 0
power_equip = 0
power_environ = 0
+ ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg',)
@@ -500,6 +501,7 @@ proc/process_ghost_teleport_locs()
/area/prison/morgue
name = "\improper Prison Morgue"
icon_state = "morgue"
+ ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg')
/area/prison/medical_research
name = "\improper Prison Genetic Research"
@@ -757,6 +759,7 @@ proc/process_ghost_teleport_locs()
/area/chapel/main
name = "\improper Chapel"
icon_state = "chapel"
+ ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg')
/area/chapel/office
name = "\improper Chapel Office"
@@ -821,30 +824,32 @@ proc/process_ghost_teleport_locs()
//Engineering
/area/engine
- engine_smes
- name = "\improper Engineering SMES"
- icon_state = "engine_smes"
- requires_power = 0//This area only covers the batteries and they deal with their own power
+ ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
- engineering
- name = "Engineering"
- icon_state = "engine_smes"
+/area/engine/engine_smes
+ name = "\improper Engineering SMES"
+ icon_state = "engine_smes"
+ requires_power = 0//This area only covers the batteries and they deal with their own power
- break_room
- name = "\improper Engineering Foyer"
- icon_state = "engine"
+/area/engine/engineering
+ name = "Engineering"
+ icon_state = "engine_smes"
- chiefs_office
- name = "\improper Chief Engineer's office"
- icon_state = "engine_control"
+/area/engine/break_room
+ name = "\improper Engineering Foyer"
+ icon_state = "engine"
- secure_construction
- name = "\improper Secure Construction Area"
- icon_state = "engine"
+/area/engine/chiefs_office
+ name = "\improper Chief Engineer's office"
+ icon_state = "engine_control"
- gravity_generator
- name = "Gravity Generator Room"
- icon_state = "blue"
+/area/engine/secure_construction
+ name = "\improper Secure Construction Area"
+ icon_state = "engine"
+
+/area/engine/gravity_generator
+ name = "Gravity Generator Room"
+ icon_state = "blue"
//Solars
@@ -930,6 +935,7 @@ proc/process_ghost_teleport_locs()
name = "\improper AI Satellite Teleporter Room"
icon_state = "teleporter"
music = "signal"
+ ambientsounds = list('sound/ambience/ambimalf.ogg')
//MedBay
@@ -972,6 +978,7 @@ proc/process_ghost_teleport_locs()
/area/medical/morgue
name = "\improper Morgue"
icon_state = "morgue"
+ ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg')
/area/medical/chemistry
name = "Chemistry"
@@ -1372,6 +1379,10 @@ proc/process_ghost_teleport_locs()
name = "Emergency Storage"
icon_state = "storage"
+
+/area/turret_protected/
+ ambientsounds = list('sound/ambience/ambimalf.ogg')
+
/area/turret_protected/ai_upload
name = "\improper AI Upload Chamber"
icon_state = "ai_upload"
@@ -1454,6 +1465,9 @@ proc/process_ghost_teleport_locs()
// Telecommunications Satellite
+/area/tcommsat
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+
/area/tcommsat/entrance
name = "\improper Telecoms Teleporter"
icon_state = "tcomsatentrance"
@@ -1465,18 +1479,22 @@ proc/process_ghost_teleport_locs()
/area/turret_protected/tcomsat
name = "\improper Telecoms Satellite"
icon_state = "tcomsatlob"
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/turret_protected/tcomfoyer
name = "\improper Telecoms Foyer"
icon_state = "tcomsatentrance"
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/turret_protected/tcomwest
name = "\improper Telecommunications Satellite West Wing"
icon_state = "tcomsatwest"
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/turret_protected/tcomeast
name = "\improper Telecommunications Satellite East Wing"
icon_state = "tcomsateast"
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcommsat/computer
name = "\improper Telecoms Control Room"
@@ -1513,56 +1531,13 @@ proc/process_ghost_teleport_locs()
/area/awaymission/beach
name = "Beach"
- icon_state = "null"
+ icon_state = "away"
luminosity = 1
lighting_use_dynamic = 0
requires_power = 0
- var/sound/mysound = null
+ has_gravity = 1
+ ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
- New()
- ..()
- var/sound/S = new/sound()
- mysound = S
- S.file = 'sound/ambience/shore.ogg'
- S.repeat = 1
- S.wait = 0
- S.channel = 123
- S.volume = 100
- S.priority = 255
- S.status = SOUND_UPDATE
- process()
-
- Entered(atom/movable/Obj,atom/OldLoc)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_UPDATE
- Obj << mysound
- return
-
- Exited(atom/movable/Obj)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_PAUSED | SOUND_UPDATE
- Obj << mysound
-
- proc/process()
- set background = BACKGROUND_ENABLED
-
- var/sound/S = null
- var/sound_delay = 0
- if(prob(25))
- S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
- sound_delay = rand(0, 50)
-
- for(var/mob/living/carbon/human/H in src)
- if(H.client)
- mysound.status = SOUND_UPDATE
- H << mysound
- if(S)
- spawn(sound_delay)
- H << S
-
- spawn(60) .()
/////////////////////////////////////////////////////////////////////
/*
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index bd03bbf1207..614c6009fbc 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -17,6 +17,12 @@
/area
var/global/global_uid = 0
var/uid
+ var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\
+ 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\
+ 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\
+ 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\
+ 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\
+ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
/area/New()
icon_state = ""
@@ -249,9 +255,6 @@
/area/Entered(A)
- var/musVolume = 25
- var/sound = 'sound/ambience/ambigen1.ogg'
-
if(!istype(A,/mob/living)) return
var/mob/living/L = A
@@ -271,27 +274,10 @@
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
if(prob(35))
-
- if(istype(src, /area/chapel))
- sound = pick('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg')
- else if(istype(src, /area/medical/morgue))
- sound = pick('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/title2.ogg')
- else if(type == /area)
- sound = pick('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg',)
- else if(istype(src, /area/engine))
- sound = pick('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
- else if(istype(src, /area/AIsattele) || istype(src, /area/turret_protected/ai) || istype(src, /area/turret_protected/ai_upload) || istype(src, /area/turret_protected/ai_upload_foyer))
- sound = pick('sound/ambience/ambimalf.ogg')
- else if(istype(src, /area/mine/explored) || istype(src, /area/mine/unexplored))
- sound = pick('sound/ambience/ambimine.ogg')
- musVolume = 25
- else if(istype(src, /area/tcommsat) || istype(src, /area/turret_protected/tcomwest) || istype(src, /area/turret_protected/tcomeast) || istype(src, /area/turret_protected/tcomfoyer) || istype(src, /area/turret_protected/tcomsat))
- sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
- else
- sound = pick('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
+ var/sound = pick(ambientsounds)
if(!L.client.played)
- L << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
+ L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1)
L.client.played = 1
spawn(600) //ewww - this is very very bad
if(L.&& L.client)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 8b7dc07052f..45193079a06 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -80,9 +80,6 @@
*/
-/atom/proc/meteorhit(obj/meteor as obj)
- return
-
/atom/proc/allow_drop()
return 1
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index f7632a02844..12080db7be8 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -106,7 +106,7 @@
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target as mob)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
- target.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(target), slot_w_uniform)
+ target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 77f303e371b..1b72fbc1935 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -156,10 +156,7 @@ var/list/blob_nodes = list()
return
if (1)
- command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << sound('sound/AI/outbreak5.ogg')
+ priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
return
return
diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm
index ad0cb2bbfe1..7a0ed702059 100644
--- a/code/game/gamemodes/changeling/powers/fakedeath.dm
+++ b/code/game/gamemodes/changeling/powers/fakedeath.dm
@@ -1,8 +1,9 @@
/obj/effect/proc_holder/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We fall into a stasis, allowing us to regenerate."
- chemical_cost = 10
+ chemical_cost = 20
dna_cost = 0
+ req_dna = 1
req_stat = DEAD
max_genetic_damage = 100
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 69c09bd383f..36842d319c5 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -1,7 +1,6 @@
/obj/effect/proc_holder/changeling/revive
name = "Regenerate"
desc = "We regenerate, healing all damage from our form."
- chemical_cost = 10
req_stat = DEAD
//Revive from regenerative stasis
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index d11ab6834ae..a89d7681a21 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -32,10 +32,7 @@
eventNumbersToPickFrom += 3
switch(pick(eventNumbersToPickFrom))
if(1)
- command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << sound('sound/AI/meteors.ogg')
+ priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg')
spawn(100)
meteor_wave()
spawn_meteors()
@@ -74,9 +71,7 @@
*/
/proc/power_failure()
- command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
- for(var/mob/M in player_list)
- M << sound('sound/AI/poweroff.ogg')
+ priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/AI/poweroff.ogg')
for(var/obj/machinery/power/smes/S in world)
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
continue
@@ -123,9 +118,7 @@
/proc/power_restore()
- command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
- for(var/mob/M in player_list)
- M << sound('sound/AI/poweron.ogg')
+ priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z == 1)
C.cell.charge = C.cell.maxcharge
@@ -146,9 +139,7 @@
/proc/power_restore_quick()
- command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
- for(var/mob/M in player_list)
- M << sound('sound/AI/poweron.ogg')
+ priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in world)
if(S.z != 1)
continue
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 720f0058217..6b61e9e11bc 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -203,10 +203,7 @@
comm.messagetitle.Add("Cent. Com. Status Summary")
comm.messagetext.Add(intercepttext)
- command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << sound('sound/AI/intercept.ogg')
+ priority_announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.", 'sound/AI/intercept.ogg')
if(security_level < SEC_LEVEL_BLUE)
set_security_level(SEC_LEVEL_BLUE)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index f508252b9ab..5ace34574d3 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -66,18 +66,19 @@ var/round_start_time = 0
var/list/datum/game_mode/runnable_modes
if((master_mode=="random") || (master_mode=="secret"))
runnable_modes = config.get_runnable_modes()
- if (runnable_modes.len==0)
- current_state = GAME_STATE_PREGAME
- world << "Unable to choose playable game mode. Reverting to pre-game lobby."
- return 0
- if(secret_force_mode != "secret")
- for (var/datum/game_mode/M in runnable_modes)
- if (M.config_tag && M.config_tag == secret_force_mode)
- src.mode = M
- break
- if (!src.mode)
- message_admins("\blue Unable to force secret [secret_force_mode].", 1)
+
+ if((master_mode=="secret") && (secret_force_mode != "secret"))
+ var/datum/game_mode/smode = config.pick_mode(secret_force_mode)
+ if (!smode.can_start())
+ message_admins("\blue Unable to force secret [secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.", 1)
+ else
+ src.mode = smode
+
if(!src.mode)
+ if (runnable_modes.len==0)
+ current_state = GAME_STATE_PREGAME
+ world << "Unable to choose playable game mode. Reverting to pre-game lobby."
+ return 0
src.mode = pickweight(runnable_modes)
else
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index f0a078f313c..d37f3880e6e 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -184,7 +184,7 @@
if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes")
return
- command_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert")
+ priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg')
set_security_level("delta")
for(var/obj/item/weapon/pinpointer/point in world)
@@ -196,9 +196,6 @@
ticker.mode:malf_mode_declared = 1
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << sound('sound/AI/aimalf.ogg')
/datum/game_mode/malfunction/proc/ai_win()
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 4f790db04fe..f7caf7be4e9 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -1,10 +1,15 @@
/var/const/meteor_wave_delay = 625 //minimum wait between waves in tenths of seconds
//set to at least 100 unless you want evarr ruining every round
-/var/const/meteors_in_wave = 50
-/var/const/meteors_in_small_wave = 10
+/var/list/meteorsA = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \
+ /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3)
-/proc/meteor_wave(var/number = meteors_in_wave)
+/var/list/meteorsB = list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/meaty/xeno=1)
+
+/var/list/meteorsC = list(/obj/effect/meteor/dust) //for space dust event
+
+
+/proc/meteor_wave(var/number = 50) //this proc's unused now.
if(!ticker || wavesecret)
return
@@ -15,12 +20,13 @@
spawn(meteor_wave_delay)
wavesecret = 0
-/proc/spawn_meteors(var/number = meteors_in_small_wave)
+
+/proc/spawn_meteors(var/number = 10, var/list/meteortypes)
for(var/i = 0; i < number; i++)
spawn(0)
- spawn_meteor()
+ spawn_meteor(meteortypes)
-/proc/spawn_meteor()
+/proc/spawn_meteor(var/list/meteortypes)
var/startx
var/starty
@@ -30,7 +36,6 @@
var/turf/pickedgoal
var/max_i = 10//number of tries to spawn meteor.
-
do
switch(pick(1,2,3,4))
if(1) //NORTH
@@ -58,90 +63,149 @@
pickedgoal = locate(endx, endy, 1)
max_i--
if(max_i<=0) return
-
while (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen.
- var/obj/effect/meteor/M
- switch(rand(1, 100))
-
- if(1 to 10)
- M = new /obj/effect/meteor/big( pickedstart )
- if(11 to 75)
- M = new /obj/effect/meteor( pickedstart )
- if(76 to 100)
- M = new /obj/effect/meteor/small( pickedstart )
+ var/Me = pickweight(meteortypes)
+ var/obj/effect/meteor/M = new Me(pickedstart)
M.dest = pickedgoal
spawn(0)
walk_towards(M, M.dest, 1)
-
return
+
+
/obj/effect/meteor
- name = "meteor"
+ name = "the concept of meteor"
+ desc = "You should probably run instead of gawking at this."
icon = 'icons/obj/meteor.dmi'
- icon_state = "flaming"
+ icon_state = "small"
density = 1
- anchored = 1.0
- var/hits = 1
+ anchored = 1
+ var/hits = 4
+ var/hitpwr = 2 //Level of ex_act to be called on hit.
var/dest
pass_flags = PASSTABLE
+ var/heavy = 0
+ var/meteorsound = 'sound/effects/meteorimpact.ogg'
-/obj/effect/meteor/small
- name = "small meteor"
- icon_state = "smallf"
+ var/meteordrop = /obj/item/weapon/ore/iron
+ var/dropamt = 2
+
+/obj/effect/meteor/dust
+ name = "space dust"
+ icon_state = "dust"
pass_flags = PASSTABLE | PASSGRILLE
+ hits = 1
+ hitpwr = 3
+ meteorsound = 'sound/weapons/throwtap.ogg'
+ meteordrop = /obj/item/weapon/ore/glass
-/obj/effect/meteor/Bump(atom/A)
- if (A)
- A.meteorhit(src)
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
- if (--src.hits <= 0)
-
- //Prevent meteors from blowing up the singularity's containment.
- //Changing emitter and generator ex_act would result in them being bomb and C4 proof.
- if(!istype(A,/obj/machinery/power/emitter) && \
- !istype(A,/obj/machinery/field/generator) && \
- prob(15))
- explosion(src.loc, 4, 5, 6, 7, 0)
- qdel(src)
-
-
-/obj/effect/meteor/ex_act(severity)
- if (severity < 4)
- qdel(src)
- return
+/obj/effect/meteor/medium
+ name = "meteor"
+ dropamt = 3
/obj/effect/meteor/big
name = "big meteor"
- hits = 5
+ icon_state = "large"
+ hits = 7
+ heavy = 1
+ dropamt = 4
- ex_act(severity)
- return
+/obj/effect/meteor/flaming
+ name = "flaming meteor"
+ icon_state = "flaming"
+ hits = 3
+ heavy = 1
+ meteorsound = 'sound/effects/bamf.ogg'
+ meteordrop = /obj/item/weapon/ore/plasma
- Bump(atom/A)
- //Prevent meteors from blowing up the singularity's containment.
- //Changing emitter and generator ex_act would result in them being bomb and C4 proof
- if(!istype(A,/obj/machinery/power/emitter) && \
- !istype(A,/obj/machinery/field/generator))
- if(--src.hits <= 0)
- qdel(src) //Dont blow up singularity containment if we get stuck there.
+/obj/effect/meteor/irradiated
+ name = "glowing meteor"
+ icon_state = "glowing"
+ hits = 4
+ heavy = 1
+ meteordrop = /obj/item/weapon/ore/uranium
- if (A)
- for(var/mob/M in player_list)
- var/turf/T = get_turf(M)
- if(!T || T.z != src.z)
- continue
- var/dist = get_dist(M.loc, src.loc)
- shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
- M.playsound_local(src.loc, 'sound/effects/meteorimpact.ogg', 50, 1, get_rand_frequency(), 10)
- explosion(src.loc, 0, 1, 2, 3, 0)
+/obj/effect/meteor/meaty
+ name = "meaty ore"
+ icon_state = "meateor"
+ desc = "Just... don't think too hard about where this thing came from."
+ hits = 2
+ heavy = 1
+ meteorsound = 'sound/effects/blobattack.ogg'
+ meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat
+ var/meteorgibs = /obj/effect/gibspawner/generic
+
+/obj/effect/meteor/meaty/xeno
+ color = "#5EFF00"
+ meteordrop = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
+ meteorgibs = /obj/effect/gibspawner/xeno
+
+
+/obj/effect/meteor/New()
+ ..()
+ SpinAnimation()
+
+/obj/effect/meteor/Bump(atom/A)
+ if(A)
+ A.ex_act(hitpwr)
+ playsound(src.loc, meteorsound, 40, 1)
+ if(--src.hits <= 0)
+ make_debris()
+ meteor_effect(heavy)
+ qdel(src)
+
+
+/obj/effect/meteor/ex_act()
+ return
+
+
+/obj/effect/meteor/proc/meteor_effect(var/sound=1)
+ if(sound)
+ for(var/mob/M in player_list)
+ var/turf/T = get_turf(M)
+ if(!T || T.z != src.z)
+ continue
+ var/dist = get_dist(M.loc, src.loc)
+ shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
+ M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10)
+
+
+/obj/effect/meteor/medium/meteor_effect()
+ ..(heavy)
+ explosion(src.loc, 1, 2, 3, 4, 0)
+
+
+/obj/effect/meteor/big/meteor_effect()
+ ..(heavy)
+ explosion(src.loc, 0, 1, 2, 3, 0)
+
+
+/obj/effect/meteor/flaming/meteor_effect()
+ ..(heavy)
+ explosion(src.loc, 0, 1, 2, 3, 0, 0, 5)
+
+
+/obj/effect/meteor/irradiated/meteor_effect()
+ ..(heavy)
+ explosion(src.loc, 0, 0, 4, 3, 0)
+ new /obj/effect/decal/cleanable/greenglow(get_turf(src))
+ for(var/mob/living/L in view(5, src))
+ L.apply_effect(40, IRRADIATE)
+
+
+
+/obj/effect/meteor/proc/make_debris()
+ for(var/throws = dropamt, throws > 0, throws--)
+ var/obj/item/O = new meteordrop(get_turf(src))
+ O.throw_at(dest, 5, 10)
+
+/obj/effect/meteor/meaty/make_debris()
+ ..()
+ new meteorgibs(get_turf(src))
- if (--src.hits <= 0)
- if(prob(15) && !istype(A, /obj/structure/grille))
- explosion(src.loc, 1, 2, 3, 4, 0)
- qdel(src)
/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pickaxe))
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 4008de70f13..cdf38cdf2f0 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -197,7 +197,7 @@
synd_mob.equip_to_slot_or_del(R, slot_ears)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
- synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(synd_mob), slot_shoes)
+ synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(synd_mob), slot_shoes)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(synd_mob), slot_head)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index c720112f353..f29f7b9d1d2 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -308,8 +308,6 @@ datum/objective/steal/check_completion()
return 1
return 0
-
-
var/global/list/possible_items_special = list()
datum/objective/steal/special //ninjas are so special they get their own subtype good for them
@@ -324,6 +322,33 @@ datum/objective/steal/special/find_target()
+datum/objective/steal/exchange
+ dangerrating = 10
+ var/faction //Exchange objectives: Which side are we on?
+ var/datum/mind/otheragent //Exchange objectives: The mind of the other party
+
+datum/objective/steal/exchange/proc/set_faction(faction,otheragent)
+ if(faction == "red")
+ targetinfo = new/datum/objective_item/unique/docs_blue
+ else if(faction == "blue")
+ targetinfo = new/datum/objective_item/unique/docs_red
+ explanation_text = "Acquire [targetinfo.name] held by [otheragent], the Syndicate Agent"
+ steal_target = targetinfo.targetitem
+
+
+datum/objective/steal/exchange/backstab
+ dangerrating = 3
+
+datum/objective/steal/exchange/backstab/set_faction(faction)
+ if(faction == "red")
+ targetinfo = new/datum/objective_item/unique/docs_red
+ else if(faction == "blue")
+ targetinfo = new/datum/objective_item/unique/docs_blue
+ explanation_text = "Do not give up or lose [targetinfo.name]."
+ steal_target = targetinfo.targetitem
+
+
+
datum/objective/download
dangerrating = 10
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index f2b5eb9ebbf..15fefb2695d 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -75,6 +75,10 @@ datum/objective_item/steal/reactive
difficulty = 5
excludefromjob = list("Research Director")
+datum/objective_item/steal/documents
+ name = "a set of secret documents"
+ targetitem = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
+ difficulty = 5
//Items with special checks!
datum/objective_item/steal/plasma
@@ -128,6 +132,16 @@ datum/objective_item/slime/check_special_completion(var/obj/item/slime_extract/E
return 1
return 0
+//Unique Objectives
+datum/objective_item/unique/docs_red
+ name = "the \"Red\" secret documents"
+ targetitem = /obj/item/documents/syndicate/red
+ difficulty = 10
+
+datum/objective_item/unique/docs_blue
+ name = "the \"Blue\" secret documents"
+ targetitem = /obj/item/documents/syndicate/blue
+ difficulty = 10
//Old ninja objectives.
datum/objective_item/special/pinpointer
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 1b8f4ce1185..42d1fa7d398 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -3,6 +3,9 @@
var/traitor_name = "traitor"
var/list/datum/mind/traitors = list()
+ var/datum/mind/exchange_red
+ var/datum/mind/exchange_blue
+
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
@@ -104,8 +107,16 @@
traitor.objectives += block_objective
else
- switch(rand(1,100))
- if(1 to 50)
+ //Assign two traitors for exchange objective
+ if((traitors.len > 5) && !exchange_blue)
+ if(!exchange_red)
+ exchange_red = traitor
+ else
+ exchange_blue = traitor
+ assign_exchange_role(exchange_red,"red")
+ assign_exchange_role(exchange_blue,"blue")
+ else
+ if(prob(50))
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
@@ -115,13 +126,12 @@
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
- switch(rand(1,100))
- if(1 to 90)
+
+ if(prob(90))
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
-
else
if (!(locate(/datum/objective/hijack) in traitor.objectives))
var/datum/objective/hijack/hijack_objective = new
@@ -308,3 +318,49 @@
traitor_mob << "Unfortunately, the Syndicate did not provide you with a code response."
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
//End code phrase.
+ if(traitor_mob.mind == exchange_red || traitor_mob.mind == exchange_blue)
+ equip_exchange(traitor_mob)
+
+/datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner, var/faction)
+ var/datum/objective/steal/exchange/exchange_objective = new
+ exchange_objective.owner = owner
+ exchange_objective.set_faction(faction,(faction == "red" ? exchange_blue : exchange_red))
+ owner.objectives += exchange_objective
+
+ if(prob(20))
+ var/datum/objective/steal/exchange/backstab/backstab_objective = new
+ backstab_objective.owner = owner
+ backstab_objective.set_faction(faction)
+ owner.objectives += backstab_objective
+
+ var/datum/objective/escape_objective
+ if(90)
+ escape_objective = new/datum/objective/escape
+ else
+ escape_objective = new/datum/objective/hijack
+ escape_objective.owner = owner
+ owner.objectives += escape_objective
+
+/datum/game_mode/proc/equip_exchange(mob/living/carbon/human/mob)
+ if(!istype(mob))
+ return
+
+ var/obj/item/weapon/folder/syndicate/folder
+ if(mob.mind == exchange_red)
+ folder = new/obj/item/weapon/folder/syndicate/red(mob)
+ else
+ folder = new/obj/item/weapon/folder/syndicate/blue(mob)
+
+ var/list/slots = list (
+ "backpack" = slot_in_backpack,
+ "left pocket" = slot_l_store,
+ "right pocket" = slot_r_store,
+ "left hand" = slot_l_hand,
+ "right hand" = slot_r_hand,
+ )
+ var/where = mob.equip_in_one_of_slots(folder, slots)
+ if (!where)
+ mob << "Your Syndicate employer was unable to send you their secret documents."
+ else
+ mob << "In your [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile."
+ mob.update_icons()
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index d54a0cb1cb3..2c6c907084e 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -25,7 +25,7 @@
/*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
return ..()
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
transfer_soul("SHADE", M, user)
return*/
@@ -111,21 +111,21 @@
var/obj/item/device/soulstone/C = src
if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
if(iscultist(U))
- U << "\red The Geometer of blood wants this mortal sacrificed with the rune."
+ U << "The Geometer of blood wants this mortal sacrificed with the rune."
else
- U << "\red The soul stone doesn't work for no apparent reason."
+ U << "The soul stone doesn't work for no apparent reason."
return 0
if(C.imprinted != "empty")
- U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
+ U << "Capture failed!: The soul stone has already been imprinted with [C.imprinted]'s mind!"
else
if (T.stat == 0)
- U << "\red Capture failed!: \black Kill or maim the victim first!"
+ U << "Capture failed!: Kill or maim the victim first!"
else
if(T.client == null)
- U << "\red Capture failed!: \black The soul has already fled it's mortal frame."
+ U << "Capture failed!: The soul has already fled it's mortal frame."
else
if(C.contents.len)
- U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room."
+ U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
else
for(var/obj/item/W in T)
T.unEquip(W)
@@ -135,13 +135,13 @@
var/mob/living/simple_animal/shade/T = target
var/obj/item/device/soulstone/C = src
if (T.stat == DEAD)
- U << "\red Capture failed!: \black The shade has already been banished!"
+ U << "Capture failed!: The shade has already been banished!"
else
if(C.contents.len)
- U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room."
+ U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
else
if(T.name != C.imprinted)
- U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
+ U << "Capture failed!: The soul stone has already been imprinted with [C.imprinted]'s mind!"
else
T.loc = C //put shade in stone
T.status_flags |= GODMODE
@@ -150,7 +150,7 @@
C.icon_state = "soulstone2"
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
if(U != T)
- U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone."
+ U << "Capture successful!: [T.name]'s has been recaptured and stored within the soul stone."
if("CONSTRUCT")
var/obj/structure/constructshell/T = target
var/obj/item/device/soulstone/C = src
@@ -203,31 +203,32 @@
Z.cancel_camera()
qdel(C)
else
- U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!"
+ U << "Creation failed!: The soul stone is empty! Go kill someone!"
return
obj/item/proc/init_shade(var/obj/item/device/soulstone/C, var/mob/living/carbon/human/T, var/mob/U as mob, var/vic = 0)
- new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
- T.invisibility = 101
- var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = T
- flick("dust-h", animation)
- qdel(animation)
- var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
- S.loc = C //put shade in stone
- S.status_flags |= GODMODE //So they won't die inside the stone somehow
- S.canmove = 0//Can't move out of the soul stone
- S.name = "Shade of [T.real_name]"
- S.real_name = "Shade of [T.real_name]"
- S.key = T.key
+ new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
+ T.invisibility = 101
+ var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = T
+ flick("dust-h", animation)
+ qdel(animation)
+ var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
+ S.loc = C //put shade in stone
+ S.status_flags |= GODMODE //So they won't die inside the stone somehow
+ S.canmove = 0//Can't move out of the soul stone
+ S.name = "Shade of [T.real_name]"
+ S.real_name = "Shade of [T.real_name]"
+ S.key = T.key
+ if(iscultist(U))
ticker.mode.add_cultist(S.mind,2)
- S.cancel_camera()
- C.icon_state = "soulstone2"
- C.name = "Soul Stone: [S.real_name]"
- S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
- C.imprinted = "[S.name]"
- if(vic)
- U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
- U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
+ S.cancel_camera()
+ C.icon_state = "soulstone2"
+ C.name = "Soul Stone: [S.real_name]"
+ S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
+ C.imprinted = "[S.name]"
+ if(vic)
+ U << "Capture successful!: [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
+ U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index e86415a7a11..076ed86da5d 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -154,7 +154,7 @@
qdel(wizard_mob.l_store)
wizard_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(wizard_mob), slot_ears)
- wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(wizard_mob), slot_w_uniform)
+ wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index dff5243922f..d23c954f352 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -15,7 +15,7 @@ Assistant
/datum/job/assistant/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
/datum/job/assistant/get_access()
if(config.jobs_have_maint_access & ASSISTANTS_HAVE_MAINT_ACCESS) //Config has assistant maint access set
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 9beb962774a..dde8292119d 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -25,11 +25,10 @@ Captain
/datum/job/captain/equip_items(var/mob/living/carbon/human/H)
var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
- U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
+ U.attachTie(new /obj/item/clothing/tie/medal/gold/captain())
H.equip_to_slot_or_del(U, slot_w_uniform)
-
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
@@ -85,7 +84,7 @@ Head of Personnel
/datum/job/hop/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hopcap(H), slot_head)
//Equip ID box
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 65dc569ecc9..c7286a95faa 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -39,7 +39,7 @@ Bartender
H.equip_to_slot_or_del(BPK, slot_back,1)
/datum/job/bartender/equip_items(var/mob/living/carbon/human/H)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
@@ -72,7 +72,7 @@ Chef
/datum/job/chef/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
/*
@@ -97,7 +97,7 @@ Botanist
/datum/job/hydro/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
@@ -124,7 +124,7 @@ Quartermaster
/datum/job/qm/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
@@ -150,7 +150,7 @@ Cargo Technician
/datum/job/cargo_tech/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
/*
Shaft Miner
@@ -177,7 +177,7 @@ Shaft Miner
/datum/job/mining/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
@@ -253,7 +253,7 @@ Mime
/datum/job/mime/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
@@ -295,7 +295,7 @@ Janitor
/datum/job/janitor/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
/*
Librarian
@@ -318,7 +318,7 @@ Librarian
/datum/job/librarian/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 9556b0b9410..b68e514ef6e 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -27,7 +27,7 @@ Chaplain
//Bible itemstates
var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "bible", "bible", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon")
-/datum/job/chaplain/proc/setupbiblespecifics(var/obj/item/weapon/storage/bible/B, var/mob/living/carbon/human/H)
+/datum/job/chaplain/proc/setupbiblespecifics(var/obj/item/weapon/storage/book/bible/B, var/mob/living/carbon/human/H)
switch(B.icon_state)
if("honk1","honk2")
new /obj/item/weapon/grown/bananapeel(B)
@@ -62,7 +62,7 @@ Chaplain
var/iconi = text2num(href_list["seticon"])
var/biblename = biblenames[iconi]
- var/obj/item/weapon/storage/bible/B = locate(href_list["bible"])
+ var/obj/item/weapon/storage/book/bible/B = locate(href_list["bible"])
B.icon_state = biblestates[iconi]
B.item_state = bibleitemstates[iconi]
@@ -82,9 +82,9 @@ Chaplain
/datum/job/chaplain/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible/booze(H)
+ var/obj/item/weapon/storage/book/bible/B = new /obj/item/weapon/storage/book/bible/booze(H)
spawn(0)
var/religion_name = "Christianity"
var/new_religion = copytext(sanitize(input(H, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 1e24c1260f8..72c39e1f707 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -33,7 +33,7 @@ Chief Engineer
/datum/job/chief_engineer/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
@@ -66,7 +66,7 @@ Station Engineer
/datum/job/engineer/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/orange(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
@@ -96,6 +96,6 @@ Atmospheric Technician
/datum/job/atmos/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
\ No newline at end of file
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 9aeb3fc2c40..d800f2a9adc 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -29,7 +29,7 @@ Chief Medical Officer
/datum/job/cmo/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
@@ -59,7 +59,7 @@ Medical Doctor
/datum/job/doctor/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
@@ -86,7 +86,7 @@ Chemist
/datum/job/chemist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/chemist(H), slot_wear_suit)
/*
@@ -111,7 +111,7 @@ Geneticist
/datum/job/geneticist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
@@ -140,7 +140,7 @@ Virologist
/datum/job/virologist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index c1ab6726a52..51134d5d86e 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -30,7 +30,7 @@ Research Director
access_tech_storage, access_minisat)
/datum/job/rd/equip_items(var/mob/living/carbon/human/H)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
@@ -58,7 +58,7 @@ Scientist
/datum/job/scientist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/science(H), slot_wear_suit)
/*
@@ -83,6 +83,6 @@ Roboticist
/datum/job/roboticist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
\ No newline at end of file
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index f9bc80aa797..e31a9a17ea0 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -122,7 +122,7 @@ Detective
/datum/job/detective/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 657997e2506..31a6bcab760 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -52,7 +52,7 @@
return 0
/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user)
- if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !iscarbon(target))
+ if(stat || user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !iscarbon(target))
return
close_machine(target)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index d807b005d5e..4f0df133f3b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -916,7 +916,6 @@ FIRE ALARM
icon = 'icons/obj/monitors.dmi'
icon_state = "fire0"
var/detecting = 1.0
- var/working = 1.0
var/time = 10.0
var/timing = 0.0
var/lockdownbyai = 0
@@ -1136,7 +1135,7 @@ FIRE ALARM
src.updateUsrDialog()
/obj/machinery/firealarm/proc/reset()
- if (!( src.working ))
+ if (stat & (NOPOWER|BROKEN)) // can't reset alarm if it's unpowered or broken.
return
var/area/A = src.loc
A = A.loc
@@ -1148,7 +1147,7 @@ FIRE ALARM
return
/obj/machinery/firealarm/proc/alarm()
- if (!( src.working ))
+ if (stat & (NOPOWER|BROKEN)) // can't activate alarm if it's unpowered or broken.
return
var/area/A = src.loc
A = A.loc
@@ -1282,7 +1281,7 @@ Code shamelessly copied from apc_frame
return
/obj/machinery/firealarm/partyalarm/reset()
- if (!( src.working ))
+ if (stat & (NOPOWER|BROKEN))
return
var/area/A = src.loc
A = A.loc
@@ -1293,7 +1292,7 @@ Code shamelessly copied from apc_frame
return
/obj/machinery/firealarm/partyalarm/alarm()
- if (!( src.working ))
+ if (stat & (NOPOWER|BROKEN))
return
var/area/A = src.loc
A = A.loc
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 4c2c0bfbde1..152b25fd4ff 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -204,11 +204,6 @@ update_flag
healthcheck()
..()
-/obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj)
- src.health = 0
- healthcheck()
- return
-
/obj/machinery/portable_atmospherics/canister/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 6628fd712ee..299c700808e 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -108,10 +108,6 @@
healthcheck()
return
-/obj/machinery/bot/meteorhit()
- src.explode()
- return
-
/obj/machinery/bot/blob_act()
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 481ba304c38..45fd0d6feda 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -25,8 +25,6 @@
health = 25
maxhealth = 25
var/cleaning = 0
- var/screwloose = 0
- var/oddbutton = 0
var/blood = 1
var/list/target_types = list()
var/obj/effect/decal/cleanable/target
@@ -92,12 +90,12 @@ text("[src.on ? "On" : "Off"]"))
dat += text({"
Cleans Blood: []
"}, text("[src.blood ? "Yes" : "No"]"))
dat += text({"
Patrol station: []
"}, text("[src.should_patrol ? "Yes" : "No"]"))
// dat += text({"
Beacon frequency: []
"}, text("[src.beacon_freq]"))
- if(src.open && !src.locked)
+/* if(src.open && !src.locked)
dat += text({"
Odd looking screw twiddled: []
Weird button pressed: []"},
text("[src.screwloose ? "Yes" : "No"]"),
-text("[src.oddbutton ? "Yes" : "No"]"))
+text("[src.oddbutton ? "Yes" : "No"]"))*/
user << browse("Cleaner v1.0 controls[dat]", "window=autocleaner")
onclose(user, "autocleaner")
@@ -123,22 +121,21 @@ text("[src.oddbutton ? "Yes" : "No"
src.patrol_path = null
src.updateUsrDialog()
if("freq")
- var/freq = text2num(input("Select frequency for navigation beacons", "Frequnecy", num2text(beacon_freq / 10))) * 10
+ var/freq = text2num(input("Select frequency for navigation beacons", "Frequency", num2text(beacon_freq / 10))) * 10
if (freq > 0)
src.beacon_freq = freq
src.updateUsrDialog()
- if("screw")
+/* if("screw")
src.screwloose = !src.screwloose
usr << "You press the weird button."
- src.updateUsrDialog()
+ src.updateUsrDialog() */
if("hack")
- if(!src.oddbutton)
- src.emagged = 2 //Cleanbots are odd, this is here to ensure the "compromised" status updates properly.
- src.oddbutton = 1
+ if(!src.emagged)
+ src.emagged = 2
src.hacked = 1
usr << "You corrupt [src]'s cleaning software."
else if(!src.hacked)
@@ -146,7 +143,6 @@ text("[src.oddbutton ? "Yes" : "No"
else
src.hacked = 0
src.emagged = 0
- src.oddbutton = 0
usr << "[src]'s software has been reset!"
src.updateUsrDialog()
@@ -168,9 +164,8 @@ text("[src.oddbutton ? "Yes" : "No"
/obj/machinery/bot/cleanbot/Emag(mob/user as mob)
..()
if(open && !locked)
- if(user) user << "The [src] buzzes and beeps."
- src.oddbutton = 1
- src.screwloose = 1
+ if(user) user << "[src] buzzes and beeps."
+ src.emagged = 2
/obj/machinery/bot/cleanbot/process()
set background = BACKGROUND_ENABLED
@@ -181,19 +176,18 @@ text("[src.oddbutton ? "Yes" : "No"
return
var/list/cleanbottargets = list()
- if(!src.screwloose && !src.oddbutton && prob(5))
+ if(!src.emagged && prob(5))
visible_message("[src] makes an excited beeping booping sound!")
- if(src.screwloose && prob(5))
+ if(src.emagged && prob(10)) //Wets floors randomly
if(istype(loc,/turf/simulated))
var/turf/simulated/T = src.loc
T.MakeSlippery()
- if(src.oddbutton && prob(5))
- visible_message("Something flies out of [src]. He seems to be acting oddly.")
- var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(src.loc)
- //gib.streak(list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
- src.oldtarget = gib
+ if(src.emagged && prob(5)) //Spawns foam!
+ visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
+ new /obj/effect/effect/foam(src.loc)
+
if(!src.target || src.target == null)
for (var/obj/effect/decal/cleanable/D in view(7,src))
for(var/T in src.target_types)
@@ -322,7 +316,7 @@ text("[src.oddbutton ? "Yes" : "No"
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
src.anchored = 1
src.icon_state = "cleanbot-c"
- visible_message("\red [src] begins to clean up [target]")
+ visible_message("[src] begins to clean up [target]")
src.cleaning = 1
spawn(50)
src.cleaning = 0
@@ -333,7 +327,7 @@ text("[src.oddbutton ? "Yes" : "No"
/obj/machinery/bot/cleanbot/explode()
src.on = 0
- src.visible_message("\red [src] blows apart!", 1)
+ src.visible_message("[src] blows apart!", 1)
var/turf/Tsec = get_turf(src)
new /obj/item/weapon/reagent_containers/glass/bucket(Tsec)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index c701f672c9f..13ecb80f601 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -347,9 +347,8 @@
//If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS.
if((src.reagent_glass) && (src.use_beaker) && ((C.getBruteLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getOxyLoss() >= (heal_threshold + 15))))
for(var/datum/reagent/R in src.reagent_glass.reagents.reagent_list)
- if(!C.reagents.has_reagent(R))
+ if(!C.reagents.has_reagent(R.id))
return 1
- continue
//They're injured enough for it!
if((C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(src.treatment_brute)))
@@ -395,36 +394,40 @@
var/reagent_id = null
- //Use whatever is inside the loaded beaker. If there is one.
- if((src.use_beaker) && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume))
- reagent_id = "internal_beaker"
-
if(src.emagged == 2) //Emagged! Time to poison everybody.
reagent_id = "toxin"
- var/virus = 0
- for(var/datum/disease/D in C.viruses)
- virus = 1
+ else
+ var/virus = 0
+ for(var/datum/disease/D in C.viruses)
+ virus = 1
- if (!reagent_id && (virus))
- if(!C.reagents.has_reagent(src.treatment_virus))
- reagent_id = src.treatment_virus
+ if (!reagent_id && (virus))
+ if(!C.reagents.has_reagent(src.treatment_virus))
+ reagent_id = src.treatment_virus
- if (!reagent_id && (C.getBruteLoss() >= heal_threshold))
- if(!C.reagents.has_reagent(src.treatment_brute))
- reagent_id = src.treatment_brute
+ if (!reagent_id && (C.getBruteLoss() >= heal_threshold))
+ if(!C.reagents.has_reagent(src.treatment_brute))
+ reagent_id = src.treatment_brute
- if (!reagent_id && (C.getOxyLoss() >= (15 + heal_threshold)))
- if(!C.reagents.has_reagent(src.treatment_oxy))
- reagent_id = src.treatment_oxy
+ if (!reagent_id && (C.getOxyLoss() >= (15 + heal_threshold)))
+ if(!C.reagents.has_reagent(src.treatment_oxy))
+ reagent_id = src.treatment_oxy
- if (!reagent_id && (C.getFireLoss() >= heal_threshold))
- if(!C.reagents.has_reagent(src.treatment_fire))
- reagent_id = src.treatment_fire
+ if (!reagent_id && (C.getFireLoss() >= heal_threshold))
+ if(!C.reagents.has_reagent(src.treatment_fire))
+ reagent_id = src.treatment_fire
- if (!reagent_id && (C.getToxLoss() >= heal_threshold))
- if(!C.reagents.has_reagent(src.treatment_tox))
- reagent_id = src.treatment_tox
+ if (!reagent_id && (C.getToxLoss() >= heal_threshold))
+ if(!C.reagents.has_reagent(src.treatment_tox))
+ reagent_id = src.treatment_tox
+
+ //If the patient is injured but doesn't have our special reagent in them then we should give it to them first
+ if(reagent_id && src.use_beaker && src.reagent_glass && src.reagent_glass.reagents.total_volume)
+ for(var/datum/reagent/R in src.reagent_glass.reagents.reagent_list)
+ if(!C.reagents.has_reagent(R.id))
+ reagent_id = "internal_beaker"
+ break
if(!reagent_id) //If they don't need any of that they're probably cured!
src.oldpatient = src.patient
@@ -453,7 +456,6 @@
src.currently_healing = 0
return
-// src.speak(reagent_id)
reagent_id = null
return
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 61a9ce0d7b7..e14f870ce67 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -37,6 +37,11 @@
var/beacon_freq = 1445 // navigation beacon frequency
var/control_freq = 1447 // bot control frequency
+ //List of weapons that secbots will not arrest for
+ var/safe_weapons = list(\
+ /obj/item/weapon/gun/energy/laser/bluetag,\
+ /obj/item/weapon/gun/energy/laser/redtag,\
+ /obj/item/weapon/gun/energy/laser/practice)
var/turf/patrol_target // this is turf to navigate to (location of beacon)
var/new_destination // pending new destination (waiting for beacon response)
@@ -581,10 +586,8 @@ Auto Patrol: []"},
if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100))
continue
- if(istype(C, /mob/living/carbon/human))
+ if(istype(C, /mob/living/carbon))
src.threatlevel = src.assess_perp(C)
- else if((src.idcheck) && (istype(C, /mob/living/carbon/monkey)))
- src.threatlevel = 4
if(!src.threatlevel)
continue
@@ -605,49 +608,51 @@ Auto Patrol: []"},
//If the security records say to arrest them, arrest them
//Or if they have weapons and aren't security, arrest them.
-/obj/machinery/bot/secbot/proc/assess_perp(mob/living/carbon/human/perp as mob)
+/obj/machinery/bot/secbot/proc/assess_perp(mob/living/carbon/perp as mob)
var/threatcount = 0
if(src.emagged == 2) return 10 //Everyone is a criminal!
if(src.idcheck && !src.allowed(perp))
- if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee))
- if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
+ if(check_for_weapons(perp.l_hand))
+ threatcount += 4
+ if(check_for_weapons(perp.r_hand))
+ threatcount += 4
- if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee))
- if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
+ if(istype(perp, /mob/living/carbon/human))
+ var/mob/living/carbon/human/humanperp = perp
- if(istype(perp:belt, /obj/item/weapon/gun) || istype(perp:belt, /obj/item/weapon/melee))
- if(!istype(perp:belt, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp:belt, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp:belt, /obj/item/weapon/gun/energy/laser/practice))
+ if(src.idcheck && !src.allowed(perp))
+ if(check_for_weapons(humanperp.belt))
threatcount += 2
- if(istype(perp:wear_suit, /obj/item/clothing/suit/wizrobe))
+ if(istype(humanperp.head, /obj/item/clothing/head/wizard) || istype(humanperp.head, /obj/item/clothing/head/helmet/space/rig/wizard))
threatcount += 2
- if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
+ if(humanperp.dna && humanperp.dna.mutantrace && humanperp.dna.mutantrace != "none")
threatcount += 2
//Agent cards lower threatlevel.
- if(perp.wear_id && istype(perp:wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
+ if(humanperp.wear_id && istype(humanperp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
threatcount -= 2
- if(check_records) //check if they are set to *Arrest* on records
- var/perpname = perp.get_face_name(perp.get_id_name())
- var/datum/data/record/R = find_record("name", perpname, data_core.security)
- if(R && (R.fields["criminal"] == "*Arrest*"))
- threatcount += 4
+ if(check_records) //check if they are set to *Arrest* on records
+ var/perpname = humanperp.get_face_name(humanperp.get_id_name())
+ var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ if(R && (R.fields["criminal"] == "*Arrest*"))
+ threatcount += 4
+ else
+ threatcount += 2
return threatcount
+/obj/machinery/bot/secbot/proc/check_for_weapons(var/obj/item/slot_item)
+ if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee))
+ if(!(slot_item.type in safe_weapons))
+ return 1
+ return 0
+
/obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened!
if((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index e95d6c5b50d..8d5385d11f7 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -14,6 +14,7 @@
var/c_tag_order = 999
var/status = 1.0
anchored = 1.0
+ var/start_active = 0 //If it ignores the random chance to start broken on round start
var/invuln = null
var/obj/item/device/camera_bug/bug = null
var/obj/item/weapon/camera_assembly/assembly = null
@@ -45,7 +46,7 @@
..()
/obj/machinery/camera/initialize()
- if(z == 1 && prob(3))
+ if(z == 1 && prob(3) && !start_active)
deactivate()
/obj/machinery/camera/Destroy()
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index b0fe45d3696..cc1139e511d 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -1,6 +1,8 @@
// PRESETS
// EMP
+/obj/machinery/camera/emp_proof
+ start_active = 1
/obj/machinery/camera/emp_proof/New()
..()
@@ -9,6 +11,7 @@
// X-RAY
/obj/machinery/camera/xray
+ start_active = 1
icon_state = "xraycam" // Thanks to Krutchen for the icons.
/obj/machinery/camera/xray/New()
@@ -17,6 +20,7 @@
// MOTION
/obj/machinery/camera/motion
+ start_active = 1
name = "motion-sensitive security camera"
/obj/machinery/camera/motion/New()
@@ -24,6 +28,8 @@
upgradeMotion()
// ALL UPGRADES
+/obj/machinery/camera/all
+ start_active = 1
/obj/machinery/camera/all/New()
..()
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 6b8b7001005..80575928ebf 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -140,10 +140,6 @@
emergencyShutdown()
..()
-/obj/machinery/computer/HolodeckControl/meteorhit(var/obj/O as obj)
- emergencyShutdown()
- ..()
-
/obj/machinery/computer/HolodeckControl/emp_act(severity)
emergencyShutdown()
@@ -426,6 +422,7 @@
desc = "Used for playing the most violent and degrading of childhood games."
/obj/item/weapon/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom)
+ ..()
if((ishuman(hit_atom)))
var/mob/living/carbon/M = hit_atom
playsound(src, 'sound/items/dodgeball.ogg', 50, 1)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 6099980a45a..0bd24d7fb1b 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -11,6 +11,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
circuit = /obj/item/weapon/circuitboard/communications
var/prints_intercept = 1
var/authenticated = 0
+ var/auth_id = "Unknown" //Who is currently logged in?
var/list/messagetitle = list()
var/list/messagetext = list()
var/currmsg = 0
@@ -18,6 +19,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/state = STATE_DEFAULT
var/aistate = STATE_DEFAULT
var/message_cooldown = 0
+ var/ai_message_cooldown = 0
var/centcom_message_cooldown = 0
var/tmp_alertlevel = 0
var/const/STATE_DEFAULT = 1
@@ -69,8 +71,12 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if (I && istype(I))
if(src.check_access(I))
authenticated = 1
- if((20 in I.access) || src.emagged)
+ auth_id = "[I.registered_name] ([I.assignment])"
+ if((20 in I.access))
+ authenticated = 2
+ if(src.emagged)
authenticated = 2
+ auth_id = "Unknown"
if("logout")
authenticated = 0
@@ -105,17 +111,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
usr << "You need to swipe your ID."
if("announce")
- if(src.authenticated==2)
- if(message_cooldown) return
- var/input = stripped_input(usr, "Please choose a message to announce to the station crew.", "What?")
- if(!input || !(usr in view(1,src)))
- return
- captain_announce(input)//This should really tell who is, IE HoP, CE, HoS, RD, Captain
- log_say("[key_name(usr)] has made a captain announcement: [input]")
- message_admins("[key_name_admin(usr)] has made a captain announcement.", 1)
- message_cooldown = 1
- spawn(600)//One minute cooldown
- message_cooldown = 0
+ if(src.authenticated==2 && !message_cooldown)
+ make_announcement(usr)
if("callshuttle")
src.state = STATE_DEFAULT
@@ -273,7 +270,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
src.aistate = STATE_MESSAGELIST
if("ai-status")
src.aistate = STATE_STATUSDISPLAY
-
+ if("ai-announce")
+ if(!ai_message_cooldown)
+ make_announcement(usr, 1)
if("ai-securitylevel")
src.tmp_alertlevel = text2num( href_list["newalertlevel"] )
if(!tmp_alertlevel) tmp_alertlevel = 0
@@ -359,6 +358,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
dat += "
Latest emergency signal trace attempt successful.
Last signal origin: [format_text(emergency_shuttle.last_call_loc.name)].
"
else
dat += "
Latest emergency signal trace attempt failed.
"
+ dat += "Logged in as: [auth_id]"
dat += "
\[ Log Out \]
"
dat += "
General Functions"
dat += "
\[ Message List \]"
@@ -371,7 +371,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
dat += "
\[ Set Status Display \]"
if (src.authenticated==2)
dat += "
Captain Functions"
- dat += "
\[ Make a Priority Announcement \]"
+ dat += "
\[ Make a Captain's Announcement \]"
dat += "
\[ Change Alert Level \]"
dat += "
\[ Emergency Maintenance Access \]"
if(src.emagged == 0)
@@ -487,11 +487,17 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
dat += "
Latest emergency signal trace attempt successful.
Last signal origin: [format_text(emergency_shuttle.last_call_loc.name)].
"
else
dat += "
Latest emergency signal trace attempt failed.
"
-
+ if(authenticated)
+ dat += "Current login: [auth_id]"
+ else
+ dat += "Current login: None"
+ dat += "
General Functions"
dat += "
\[ Message List \]"
if(emergency_shuttle.location==0 && !emergency_shuttle.online)
dat += "
\[ Call Emergency Shuttle \]"
dat += "
\[ Set Status Display \]"
+ dat += "
Special Functions"
+ dat += "
\[ Make a Priority Announcement \]"
dat += "
\[ Change Alert Level \]"
dat += "
\[ Emergency Maintenance Access \]"
if(STATE_CALLSHUTTLE)
@@ -547,6 +553,22 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
dat += "
\[ [(src.aistate != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]"
return dat
+/obj/machinery/computer/communications/proc/make_announcement(var/mob/living/user, var/is_silicon)
+ var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?")
+ if(!input || !user.canUseTopic(src))
+ return
+ if(is_silicon)
+ priority_announce(input, null, null, "Priority")
+ ai_message_cooldown = 1
+ spawn(600)//One minute cooldown
+ ai_message_cooldown = 0
+ else
+ priority_announce(input, null, 'sound/misc/announce.ogg', "Captain")
+ message_cooldown = 1
+ spawn(600)//One minute cooldown
+ message_cooldown = 0
+ log_say("[key_name(user)] has made a priority announcement: [input]")
+ message_admins("[key_name_admin(user)] has made a priority announcement.", 1)
/proc/call_shuttle_proc(var/mob/user, var/call_reason)
if ((!( ticker ) || emergency_shuttle.location))
@@ -573,14 +595,13 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
if (seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
emergency_shuttle.incall(0.6, signal_origin)
- captain_announce("The emergency shuttle has been called. Red Alert state confirmed: Dispatching priority shuttle. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]")
+ priority_announce("The emergency shuttle has been called. Red Alert state confirmed: Dispatching priority shuttle. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
else
emergency_shuttle.incall(1, signal_origin)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]")
+ priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
log_game("[key_name(user)] has called the shuttle.")
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
- world << sound('sound/AI/shuttlecalled.ogg')
return
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 738def55fe9..99c19755b5c 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -21,15 +21,6 @@
return 0
return 1
-/obj/machinery/computer/meteorhit(var/obj/O as obj)
- verbs.Cut()
- set_broken()
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(5, 0, src)
- smoke.start()
- return
-
-
/obj/machinery/computer/emp_act(severity)
if(prob(20/severity)) set_broken()
..()
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index d43833b955f..73bf7b1eb11 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -36,11 +36,11 @@
if (src.auth_need - src.authorized.len > 0)
message_admins("[key_name(user.client)](?) has authorized early shuttle launch in ([x],[y],[z] - JMP)",0,1)
log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])")
- world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)
+ priority_announce("[src.auth_need - src.authorized.len] more authorization(s) needed until shuttle is launched early", null, null, "Priority")
else
message_admins("[key_name(user.client)](?) has launched the emergency shuttle in ([x],[y],[z] - JMP)",0,1)
log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z])")
- world << "\blue Alert: Shuttle launch time shortened to 10 seconds!"
+ priority_announce("The emergency shuttle will launch in 10 seconds", null, null, "Priority")
emergency_shuttle.online = 1
emergency_shuttle.settimeleft(10)
//src.authorized = null
@@ -49,10 +49,10 @@
if("Repeal")
src.authorized -= W:registered_name
- world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)
+ priority_announce("[src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early", null, null, "Priority")
if("Abort")
- world << "\blue All authorizations to shorting time for shuttle launch have been revoked!"
+ priority_announce("All authorizations to launch the shuttle early have been revoked.", null, null, "Priority")
src.authorized.len = 0
src.authorized = list( )
@@ -64,7 +64,7 @@
if("Launch")
message_admins("[key_name(user.client)](?) has emagged the emergency shuttle in ([x],[y],[z] - JMP)",0,1)
log_game("[user.ckey]([user]) has emagged the emergency shuttle in ([x],[y],[z])")
- world << "\blue Alert: Shuttle launch time shortened to 10 seconds!"
+ priority_announce("System Error: The emergency shuttle will launch in 10 seconds", null, null, "Priority")
emergency_shuttle.settimeleft( 10 )
emagged = 1
if("Cancel")
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 9a96425c488..0f772a4baba 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -106,14 +106,6 @@ for reference:
qdel(src)
return
- meteorhit()
- visible_message("\red The barricade is smashed apart!")
- new /obj/item/stack/sheet/mineral/wood(get_turf(src))
- new /obj/item/stack/sheet/mineral/wood(get_turf(src))
- new /obj/item/stack/sheet/mineral/wood(get_turf(src))
- qdel(src)
- return
-
blob_act()
src.health -= 25
if (src.health <= 0)
@@ -235,10 +227,6 @@ for reference:
anchored = !anchored
icon_state = "barrier[src.locked]"
- meteorhit()
- src.explode()
- return
-
blob_act()
src.health -= 25
if (src.health <= 0)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index d71b255df22..352231c2116 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -92,10 +92,6 @@
else flick("door_deny", src)
return
-/obj/machinery/door/meteorhit(obj/M as obj)
- src.open()
- return
-
/obj/machinery/door/attack_ai(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index c1f556da1d7..c2e928783aa 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -25,33 +25,50 @@
playsound(src, "shatter", 70, 1)
..()
+
+/obj/machinery/door/window/proc/open_and_close()
+ open()
+ if(src.check_access(null))
+ sleep(50)
+ else //secure doors close faster
+ sleep(20)
+ close()
+
/obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj)
+ if( operating || !src.density )
+ return
if (!( ismob(AM) ))
var/obj/machinery/bot/bot = AM
if(istype(bot))
- if(density && src.check_access(bot.botcard))
- open()
- sleep(50)
- close()
+ if(src.check_access(bot.botcard))
+ open_and_close()
+ else
+ flick(text("[]deny", src.base_state), src)
else if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
- if(density)
- if(mecha.occupant && src.allowed(mecha.occupant))
- open()
- sleep(50)
- close()
+ if(mecha.occupant && src.allowed(mecha.occupant))
+ open_and_close()
+ else
+ flick(text("[]deny", src.base_state), src)
return
if (!( ticker ))
return
- if (src.operating)
+ var/mob/M = AM
+ if(!M.restrained())
+ bumpopen(M)
+ return
+
+/obj/machinery/door/window/bumpopen(mob/user as mob)
+ if( operating || !src.density )
return
- if (src.density && src.allowed(AM))
- open()
- if(src.check_access(null))
- sleep(50)
- else //secure doors close faster
- sleep(20)
- close()
+ src.add_fingerprint(user)
+ if(!src.requiresID())
+ user = null
+
+ if(allowed(user))
+ open_and_close()
+ else
+ flick(text("[]deny", src.base_state), src)
return
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -77,11 +94,17 @@
else
return 1
-/obj/machinery/door/window/open()
+/obj/machinery/door/window/open(var/forced=0)
if (src.operating == 1) //doors can still open when emag-disabled
return 0
if (!ticker)
return 0
+ if(!forced)
+ if(stat & NOPOWER)
+ return 0
+ if(forced < 2)
+ if(emagged)
+ return 0
if(!src.operating) //in case of emag
src.operating = 1
flick(text("[]opening", src.base_state), src)
@@ -99,9 +122,15 @@
src.operating = 0
return 1
-/obj/machinery/door/window/close()
- if (src.operating || emagged)
+/obj/machinery/door/window/close(var/forced=0)
+ if (src.operating)
return 0
+ if(!forced)
+ if(stat & NOPOWER)
+ return 0
+ if(forced < 2)
+ if(emagged)
+ return 0
src.operating = 1
flick(text("[]closing", src.base_state), src)
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
@@ -122,8 +151,9 @@
src.health = max(0, src.health - damage)
if (src.health <= 0)
new /obj/item/weapon/shard(src.loc)
- var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
- CC.amount = 2
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/stack/rods(src.loc, 2)
+ new /obj/item/stack/cable_coil(src.loc, 2)
src.density = 0
qdel(src)
return
@@ -153,23 +183,36 @@
/obj/machinery/door/window/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/door/window/attack_paw(mob/user as mob)
- if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/))
- if(src.operating)
- return
- user.changeNext_move(8)
- src.health = max(0, src.health - 25)
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
- visible_message("\red [user] smashes against the [src.name].")
- if (src.health <= 0)
- new /obj/item/weapon/shard(src.loc)
- var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
- CC.amount = 2
- src.density = 0
- qdel(src)
- else
- return src.attack_hand(user)
+/obj/machinery/door/window/proc/attack_generic(mob/user as mob, damage = 0)
+ if(src.operating)
+ return
+ user.changeNext_move(8)
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ user.visible_message("[user] smashes against the [src.name].", \
+ "[user] smashes against the [src.name].")
+ take_damage(damage)
+/obj/machinery/door/window/attack_alien(mob/user as mob)
+ if(islarva(user))
+ return
+ attack_generic(user, 25)
+
+/obj/machinery/door/window/attack_animal(mob/user as mob)
+ if(!isanimal(user))
+ return
+ var/mob/living/simple_animal/M = user
+ if(M.melee_damage_upper <= 0)
+ return
+ attack_generic(M, M.melee_damage_upper)
+
+
+/obj/machinery/door/window/attack_slime(mob/living/carbon/slime/user as mob)
+ if(!user.is_adult)
+ return
+ attack_generic(user, 25)
+
+/obj/machinery/door/window/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
/obj/machinery/door/window/attack_hand(mob/user as mob)
return src.attackby(user, user)
@@ -183,35 +226,41 @@
//Emags and ninja swords? You may pass.
if (src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
src.operating = -1
+ flick("[src.base_state]spark", src)
+ sleep(6)
if(istype(I, /obj/item/weapon/melee/energy/blade))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
playsound(src.loc, "sparks", 50, 1)
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
- visible_message("\blue The glass door was sliced open by [user]!")
- flick("[src.base_state]spark", src)
- sleep(6)
+ visible_message(" The glass door was sliced open by [user]!")
+ open(2)
+ emagged = 1
+ return 1
open()
+ emagged = 1
return 1
+
+ //If windoor is unpowered, crowbar, fireaxe and armblade can force it.
+ if(istype(I, /obj/item/weapon/crowbar) || istype(I, /obj/item/weapon/twohanded/fireaxe) || istype(I, /obj/item/weapon/melee/arm_blade) )
+ if(stat & NOPOWER)
+ if(src.density)
+ open(2)
+ else
+ close(2)
+ return
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
- if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
+ if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card) )
user.changeNext_move(8)
var/aforce = I.force
- if(I.damtype == BRUTE || I.damtype == BURN)
- src.health = max(0, src.health - aforce)
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("\The [src] has been hit by [user] with [I].")
- if (src.health <= 0)
- new /obj/item/weapon/shard(src.loc)
- var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
- CC.amount = 2
- src.density = 0
- qdel(src)
+ if(I.damtype == BURN || I.damtype == BRUTE)
+ take_damage(aforce)
return
-
-
+
src.add_fingerprint(user)
if (!src.requiresID())
//don't care who they are or what they have, act as if they're NOTHING
@@ -303,4 +352,3 @@
dir = SOUTH
icon_state = "rightsecure"
base_state = "rightsecure"
-
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index c1b0248ac3c..6222d05dd32 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -174,10 +174,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
qdel(src)
return
-/obj/machinery/hologram/meteorhit()
- qdel(src)
- return
-
/obj/machinery/hologram/holopad/Destroy()
if(hologram)
clear_holo()
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index 540bfeeec26..30db305568b 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -59,14 +59,15 @@
********************/
/obj/machinery/microwave/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(!broken && !dirty && !operating)
+ if(operating)
+ return
+ if(!broken && dirty<100)
if(default_deconstruction_screwdriver(user, "mw-o", "mw", O))
return
if(default_unfasten_wrench(user, O))
return
-
- if(exchange_parts(user, O))
- return
+ if(exchange_parts(user, O))
+ return
default_deconstruction_crowbar(O)
@@ -171,7 +172,7 @@
user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
return 1
else
- user << "\red You have no idea what you can cook with this [O]."
+ user << "\red You have no idea what you can cook with this."
return 1
src.updateUsrDialog()
@@ -190,7 +191,7 @@
********************/
/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
- if(panel_open)
+ if(panel_open || !anchored)
return
var/dat = ""
if(src.broken > 0)
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index a2b378ba426..cdf626112ff 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -60,15 +60,6 @@
if(accept_check(G))
load(G)
loaded++
- else if(istype(O, /obj/item/weapon/tray))
- var/obj/item/weapon/tray/T = O
- for(var/obj/item/snack in T)
- if(contents.len >= max_n_of_items)
- break
- if(accept_check(snack))
- T.carrying -= snack
- load(snack)
- loaded++
else
user << "
\The [src] smartly refuses [O]."
updateUsrDialog()
@@ -300,8 +291,17 @@ obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay
/obj/machinery/smartfridge/extract/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/slime_extract))
return 1
+ if(istype(O,/obj/item/device/slime_scanner))
+ return 1
return 0
+/obj/machinery/smartfridge/extract/New()
+ ..()
+ var/obj/item/device/slime_scanner/I = new /obj/item/device/slime_scanner(src)
+ load(I)
+ var/obj/item/device/slime_scanner/T = new /obj/item/device/slime_scanner(src)
+ load(T)
+
// -----------------------------
// Chemistry Medical Smartfridge
// -----------------------------
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 92a5430bc39..2f5cb7d54b6 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -202,30 +202,41 @@ Class Procs:
..()
if(!interact_offline && stat & (NOPOWER|BROKEN))
return 1
- if(usr.restrained() || usr.lying || usr.stat)
+ if(!usr.canUseTopic(src))
return 1
- if(!(ishuman(usr) || issilicon(usr)))
- usr << "
You don't have the dexterity to do this!"
- return 1
-
- var/norange = 0
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.l_hand, /obj/item/tk_grab))
- norange = 1
- else if(istype(H.r_hand, /obj/item/tk_grab))
- norange = 1
-
- if(!norange)
- if(!issilicon(usr))
- if(!in_range(src, usr))
- return 1
- if(!isturf(loc))
- return 1
-
add_fingerprint(usr)
return 0
+/mob/proc/canUseTopic() //TODO: once finished, place these procs on the respective mob files
+ return
+
+/mob/dead/observer/canUseTopic()
+ if(check_rights(R_ADMIN))
+ return
+
+/mob/living/canUseTopic()
+ src << "
You don't have the dexterity to do this!"
+ return
+
+/mob/living/carbon/human/canUseTopic(atom/movable/M)
+ if(restrained() || lying || stat || stunned || weakened)
+ return
+ if(!in_range(M, src))
+ return
+ if(!isturf(M.loc) && M.loc != src)
+ return
+ return 1
+
+/mob/living/silicon/ai/canUseTopic()
+ if(stat)
+ return
+ return 1
+
+/mob/living/silicon/robot/canUseTopic()
+ if(stat || lockcharge || stunned || weakened)
+ return
+ return 1
+
/obj/machinery/attack_ai(mob/user as mob)
if(isrobot(user))
// For some reason attack_robot doesn't work
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 174c80104e1..71d44429c2e 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -197,7 +197,7 @@
name = "magnetic control console"
icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING!
icon_state = "airlock_control_standby"
- density = 1
+ density = 0
anchored = 1.0
use_power = 1
idle_power_usage = 45
@@ -208,7 +208,7 @@
var/autolink = 0 // if set to 1, can't probe for other magnets!
var/pathpos = 1 // position in the path
- var/path = "NULL" // text path of the magnet
+ var/path = "w;e;e;w;s;n;n;s" // text path of the magnet
var/speed = 1 // lowest = 1, highest = 10
var/list/rpath = list() // real path of the magnet, used in iterator
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index afaca2f0e76..1ea98bb5c4b 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -44,7 +44,7 @@
var/datum/feed_message/wanted_issue
/datum/feed_network/New()
- CreateFeedChannel("Central Command", "Centcom Official", 1)
+ CreateFeedChannel("Station Announcements", "SS13", 1)
/datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0)
var/datum/feed_channel/newChannel = new /datum/feed_channel
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 9a4f1c6c9d8..851fd8c7055 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -283,6 +283,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player))
M << "
[department] announcement: [message]"
+ news_network.SubmitArticle(message, department, "Station Announcements", null)
announceAuth = 0
message = ""
screen = 0
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 855ca45dc7b..439ae820cb1 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -52,21 +52,8 @@
opacity = 1
spawn(20) if(src) opacity = 0
-
..()
-/obj/machinery/shield/meteorhit()
- src.health -= max_health*0.75 //3/4 health as damage
-
- if(src.health <= 0)
- visible_message("\blue The [src] dissapates")
- qdel(src)
- return
-
- opacity = 1
- spawn(20) if(src) opacity = 0
- return
-
/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
@@ -194,13 +181,6 @@
update_icon()
return
-/obj/machinery/shieldgen/meteorhit(obj/O as obj)
- src.health -= max_health*0.25 //A quarter of the machine's health
- if (prob(5))
- src.malfunction = 1
- src.checkhp()
- return
-
/obj/machinery/shieldgen/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 64b81956da8..933c1f3b089 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -10,13 +10,15 @@
icon_state = "close"
anchored = 1
density = 1
- var/mob/living/carbon/human/OCCUPANT = null
+ var/mob/living/OCCUPANT = null
var/obj/item/clothing/suit/space/SUIT = null
var/SUIT_TYPE = null
var/obj/item/clothing/head/helmet/space/HELMET = null
var/HELMET_TYPE = null
var/obj/item/clothing/mask/MASK = null //All the stuff that's gonna be stored insiiiiiiiiiiiiiiiiiiide, nyoro~n
var/MASK_TYPE = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself.
+ var/obj/item/STORAGE = null //One-slot storage slot for anything... food not recommended
+ var/STORAGE_TYPE = null
var/isopen = 0
var/islocked = 0
var/isUV = 0
@@ -35,6 +37,38 @@
HELMET_TYPE = /obj/item/clothing/head/helmet/space
MASK_TYPE = /obj/item/clothing/mask/breath
+/obj/machinery/suit_storage_unit/captain
+ SUIT_TYPE = /obj/item/clothing/suit/space/captain
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/capspace
+ MASK_TYPE = /obj/item/clothing/mask/gas
+ STORAGE_TYPE = /obj/item/weapon/tank/jetpack/oxygen
+
+/obj/machinery/suit_storage_unit/engine
+ SUIT_TYPE = /obj/item/clothing/suit/space/rig
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig
+ MASK_TYPE = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/ce
+ SUIT_TYPE = /obj/item/clothing/suit/space/rig/elite
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/elite
+ MASK_TYPE = /obj/item/clothing/mask/breath
+ STORAGE_TYPE= /obj/item/clothing/shoes/magboots/advance
+
+/obj/machinery/suit_storage_unit/security
+ SUIT_TYPE = /obj/item/clothing/suit/space/rig/security
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/security
+ MASK_TYPE = /obj/item/clothing/mask/gas/sechailer
+
+/obj/machinery/suit_storage_unit/atmos
+ SUIT_TYPE = /obj/item/clothing/suit/space/rig/atmos
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/atmos
+ MASK_TYPE = /obj/item/clothing/mask/gas
+ STORAGE_TYPE = /obj/item/weapon/watertank/atmos
+
+/obj/machinery/suit_storage_unit/mining
+ SUIT_TYPE = /obj/item/clothing/suit/space/rig/mining
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/mining
+ MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/New()
src.update_icon()
@@ -44,6 +78,8 @@
HELMET = new HELMET_TYPE(src)
if(MASK_TYPE)
MASK = new MASK_TYPE(src)
+ if(STORAGE_TYPE)
+ STORAGE = new STORAGE_TYPE(src)
/obj/machinery/suit_storage_unit/update_icon() //overlays yaaaay - Jordie
src.overlays = 0
@@ -60,28 +96,22 @@
overlays += "super"
if(isopen)
overlays += "open"
- if(SUIT && isopen)
- overlays += "suit"
- if(HELMET && isopen)
- overlays += "helm"
- if(isbroken && isopen)
- overlays += "broken"
+ if(SUIT)
+ overlays += "suit"
+ if(HELMET)
+ overlays += "helm"
+ if(STORAGE)
+ overlays += "storage"
+ if(isbroken)
+ overlays += "broken"
return
/obj/machinery/suit_storage_unit/power_change()
- if( powered() )
- src.ispowered = 1
- stat &= ~NOPOWER
- src.update_icon()
- else
- spawn(rand(0, 15))
- src.ispowered = 0
- stat |= NOPOWER
- src.islocked = 0
- src.isopen = 1
- src.dump_everything()
- src.update_icon()
-
+ ..()
+ ispowered = !(stat & NOPOWER)
+ if((stat & NOPOWER) && isopen)
+ dump_everything()
+ update_icon()
/obj/machinery/suit_storage_unit/ex_act(severity)
switch(severity)
@@ -108,10 +138,10 @@
return
if(src.panelopen) //The maintenance panel is open. Time for some shady stuff
dat+= "
Suit storage unit: Maintenance panel"
- dat+= "
Maintenance panel controls
"
- dat+= "
The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
you cannot understand. Probably the manufactoring world's language.
Among other things, a few controls catch your eye.
"
- dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads [].
Turn towards []
",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
- dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
Press button",(src.safetieson? "GREEN" : "RED"),src)
+ dat+= "Maintenance panel controls
"
+ dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
you cannot understand. Probably the manufactoring world's language.
Among other things, a few controls catch your eye.
"
+ dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads [].
Turn towards []
",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
+ dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
Press button",(src.safetieson? "GREEN" : "RED"),src)
dat+= text("
Close panel", user)
//user << browse(dat, "window=ssu_m_panel;size=400x500")
//onclose(user, "ssu_m_panel")
@@ -125,21 +155,24 @@
else
if(!src.isbroken)
dat+= "Suit storage unit"
- dat+= "U-Stor-It Suit Storage Unit, model DS1900
"
+ dat+= "U-Stor-It Suit Storage Unit, model DS1900
"
dat+= "Welcome to the Unit control panel.
"
- dat+= text("Helmet storage compartment: []
",(src.HELMET ? HELMET.name : "No helmet detected.") )
+ dat+= text("Helmet storage compartment: []
",(src.HELMET ? HELMET.name : "No helmet detected.") )
if(HELMET && src.isopen)
dat+=text("Dispense helmet
",src)
- dat+= text("Suit storage compartment: []
",(src.SUIT ? SUIT.name : "No exosuit detected.") )
+ dat+= text("Suit storage compartment: []
",(src.SUIT ? SUIT.name : "No exosuit detected.") )
if(SUIT && src.isopen)
dat+=text("Dispense suit
",src)
- dat+= text("Breathmask storage compartment: []
",(src.MASK ? MASK.name : "No breathmask detected.") )
+ dat+= text("Breathmask storage compartment: []
",(src.MASK ? MASK.name : "No breathmask detected.") )
if(MASK && src.isopen)
dat+=text("Dispense mask
",src)
+ dat+= text("Auxiliary storage compartment: []
",(src.STORAGE ? STORAGE.name : "Contents empty.") )
+ if(STORAGE && src.isopen)
+ dat+=text("Eject contents
",src)
if(src.OCCUPANT)
dat+= "
WARNING: Biological entity detected inside the Unit's storage. Please remove.
"
dat+= "Eject extra load"
- dat+= text("
Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),src,(src.isopen ? "Close" : "Open"))
+ dat+= text("
Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),src,(src.isopen ? "Close" : "Open"))
if(src.isopen)
dat+="
"
else
@@ -151,57 +184,47 @@
//onclose(user, "Suit Storage Unit")
else //Ohhhh shit it's dirty or broken! Let's inform the guy.
dat+= "Suit storage unit"
- dat+= "Unit chamber is too contaminated to continue usage. Please call for a qualified individual to perform maintenance.
"
+ dat+= "Unit chamber is too contaminated to continue usage. Please call for a qualified individual to perform maintenance.
"
dat+= text("
Close control panel", user)
//user << browse(dat, "window=suit_storage_unit;size=400x500")
//onclose(user, "suit_storage_unit")
- user << browse(dat, "window=suit_storage_unit;size=400x500")
- onclose(user, "suit_storage_unit")
+ var/datum/browser/popup = new(user, "suit_storage_unit", "Suit Storage Unit", 440, 500)
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
return
/obj/machinery/suit_storage_unit/Topic(href, href_list) //I fucking HATE this proc
if(..())
return
+ if(usr == src.OCCUPANT) //No unlocking yourself out!
+ return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.set_machine(src)
if (href_list["toggleUV"])
src.toggleUV(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["togglesafeties"])
src.togglesafeties(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["dispense_helmet"])
src.dispense_helmet(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["dispense_suit"])
src.dispense_suit(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["dispense_mask"])
src.dispense_mask(usr)
- src.updateUsrDialog()
- src.update_icon()
+ if (href_list["eject_storage"])
+ src.eject_storage(usr)
if (href_list["toggle_open"])
src.toggle_open(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["toggle_lock"])
src.toggle_lock(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["start_UV"])
src.start_UV(usr)
- src.updateUsrDialog()
- src.update_icon()
if (href_list["eject_guy"])
src.eject_occupant(usr)
- src.updateUsrDialog()
- src.update_icon()
+ src.updateUsrDialog()
+ src.update_icon()
/*if (href_list["refresh"])
src.updateUsrDialog()*/
src.add_fingerprint(usr)
@@ -255,44 +278,32 @@
src.safetieson = !src.safetieson
-/obj/machinery/suit_storage_unit/proc/dispense_helmet(mob/user as mob)
- if(!src.HELMET)
- return //Do I even need this sanity check? Nyoro~n
- else
- src.HELMET.loc = src.loc
- src.HELMET = null
- return
+/obj/machinery/suit_storage_unit/proc/dispense_helmet()
+ eject(HELMET)
+ HELMET = null
+/obj/machinery/suit_storage_unit/proc/dispense_suit()
+ eject(SUIT)
+ SUIT = null
-/obj/machinery/suit_storage_unit/proc/dispense_suit(mob/user as mob)
- if(!src.SUIT)
- return
- else
- src.SUIT.loc = src.loc
- src.SUIT = null
- return
+/obj/machinery/suit_storage_unit/proc/dispense_mask()
+ eject(MASK)
+ MASK = null
+/obj/machinery/suit_storage_unit/proc/eject_storage()
+ eject(STORAGE)
+ STORAGE = null
-/obj/machinery/suit_storage_unit/proc/dispense_mask(mob/user as mob)
- if(!src.MASK)
- return
- else
- src.MASK.loc = src.loc
- src.MASK = null
- return
-
+/obj/machinery/suit_storage_unit/proc/eject(atom/movable/ITEM)
+ ITEM.loc = src.loc
/obj/machinery/suit_storage_unit/proc/dump_everything()
- src.islocked = 0 //locks go free
- if(src.SUIT)
- src.SUIT.loc = src.loc
- src.SUIT = null
- if(src.HELMET)
- src.HELMET.loc = src.loc
- src.HELMET = null
- if(src.MASK)
- src.MASK.loc = src.loc
- src.MASK = null
+ for(var/obj/item/ITEM in src)
+ eject(ITEM)
+ src.SUIT = null
+ src.HELMET = null
+ src.MASK = null
+ src.STORAGE = null
if(src.OCCUPANT)
src.eject_occupant(OCCUPANT)
return
@@ -301,12 +312,12 @@
/obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob)
if(src.islocked || src.isUV)
user << "Unable to open unit."
- return
+ return 0
if(src.OCCUPANT)
src.eject_occupant(user)
- return // eject_occupant opens the door, so we need to return
+ return 1 // eject_occupant opens the door, so we need to return
src.isopen = !src.isopen
- return
+ return 1
/obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob)
@@ -325,7 +336,7 @@
if(src.OCCUPANT && src.safetieson)
user << "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle."
return
- if(!src.HELMET && !src.MASK && !src.SUIT && !src.OCCUPANT ) //shit's empty yo
+ if(!src.HELMET && !src.MASK && !src.SUIT && !src.STORAGE && !src.OCCUPANT ) //shit's empty yo
user << "Unit storage bays empty. Nothing to disinfect -- Aborting."
return
user << "You start the Unit's cauterisation cycle."
@@ -337,65 +348,38 @@
src.updateUsrDialog()
var/i //our counter
- for(i=0,i<4,i++)
- sleep(50)
- if(src.OCCUPANT)
- if(src.issuperUV)
- var/burndamage = rand(28,35)
- OCCUPANT.take_organ_damage(0,burndamage)
- OCCUPANT.emote("scream")
- else
+ spawn(0)
+ for(i=0,i<4,++i)
+ sleep(50)
+ if(src.OCCUPANT)
var/burndamage = rand(6,10)
- OCCUPANT.take_organ_damage(0,burndamage)
- OCCUPANT.emote("scream")
- if(i==3) //End of the cycle
- if(!src.issuperUV)
- if(src.HELMET)
- HELMET.clean_blood()
- if(src.SUIT)
- SUIT.clean_blood()
- if(src.MASK)
- MASK.clean_blood()
- else //It was supercycling, destroy everything
- if(src.HELMET)
+ if(src.issuperUV)
+ burndamage = rand(28,35)
+ if(iscarbon(OCCUPANT))
+ OCCUPANT.take_organ_damage(0,burndamage)
+ OCCUPANT.emote("scream")
+ else
+ OCCUPANT.take_organ_damage(burndamage)
+ if(i==3) //End of the cycle
+ if(!src.issuperUV)
+ for(var/obj/item/ITEM in src)
+ ITEM.clean_blood()
+ if(istype(STORAGE, /obj/item/weapon/reagent_containers/food))
+ del(STORAGE)
+ else //It was supercycling, destroy everything
src.HELMET = null
- if(src.SUIT)
src.SUIT = null
- if(src.MASK)
src.MASK = null
- visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
- src.isbroken = 1
- src.isopen = 1
- src.islocked = 0
- src.eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT.
- src.isUV = 0 //Cycle ends
- src.update_icon()
- src.updateUsrDialog()
- return
-
-/* spawn(200) //Let's clean dat shit after 20 secs //Eh, this doesn't work
- if(src.HELMET)
- HELMET.clean_blood()
- if(src.SUIT)
- SUIT.clean_blood()
- if(src.MASK)
- MASK.clean_blood()
- src.isUV = 0 //Cycle ends
+ del(STORAGE)
+ visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
+ src.isbroken = 1
+ src.isopen = 1
+ src.islocked = 0
+ src.eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT.
+ src.isUV = 0 //Cycle ends
src.update_icon()
src.updateUsrDialog()
-
- var/i
- for(i=0,i<4,i++) //Gradually give the guy inside some damaged based on the intensity
- spawn(50)
- if(src.OCCUPANT)
- if(src.issuperUV)
- OCCUPANT.take_organ_damage(0,40)
- user << "Test. You gave him 40 damage"
- else
- OCCUPANT.take_organ_damage(0,8)
- user << "Test. You gave him 8 damage"
- return*/
-
+ return
/obj/machinery/suit_storage_unit/proc/cycletimeleft()
if(src.cycletime_left >= 1)
@@ -454,96 +438,72 @@
return
-/obj/machinery/suit_storage_unit/verb/move_inside()
- set name = "Hide in Suit Storage Unit"
- set category = "Object"
- set src in oview(1)
+/obj/machinery/suit_storage_unit/MouseDrop_T(mob/M as mob, mob/user as mob)
+ store_mob(M, user)
- if (usr.stat != 0)
+/obj/machinery/suit_storage_unit/proc/store_mob(mob/living/M as mob, mob/user as mob)
+ if(!istype(M))
+ return
+ if (user.stat != 0)
return
if (!src.isopen)
- usr << "The unit's doors are shut."
+ user << "The unit's doors are shut."
return
if (!src.ispowered || src.isbroken)
- usr << "The unit is not operational."
+ user << "The unit is not operational."
return
- if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) )
- usr << "It's too cluttered inside for you to fit in!"
+ if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) || (src.STORAGE))
+ user << "It's too cluttered inside to fit in!"
return
- visible_message("[usr] starts squeezing into the suit storage unit!", 3)
- if(do_after(usr, 10))
- usr.stop_pulling()
- usr.client.perspective = EYE_PERSPECTIVE
- usr.client.eye = src
- usr.loc = src
-// usr.metabslow = 1
- src.OCCUPANT = usr
+ if(M == user)
+ visible_message("[user] starts squeezing into the suit storage unit!", 3)
+ else
+ visible_message("[user] starts putting [M.name] into the Suit Storage Unit.", 3)
+ if(do_mob(user, M, 10))
+ user.stop_pulling()
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ src.OCCUPANT = M
src.isopen = 0 //Close the thing after the guy gets inside
src.update_icon()
-// for(var/obj/O in src)
-// qdel(O)
-
- src.add_fingerprint(usr)
+ src.add_fingerprint(user)
src.updateUsrDialog()
return
- else
- src.OCCUPANT = null //Testing this as a backup sanity test
return
/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob)
if(!src.ispowered)
+ if(istype(I, /obj/item/weapon/crowbar) && !isopen)
+ if(toggle_open(user))
+ dump_everything()
+ user << text("You pry the [src] open.")
+ update_icon()
return
if(istype(I, /obj/item/weapon/screwdriver))
src.panelopen = !src.panelopen
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- user << text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )
+ user << text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )
src.updateUsrDialog()
return
if ( istype(I, /obj/item/weapon/grab) )
var/obj/item/weapon/grab/G = I
- if( !(ismob(G.affecting)) )
- return
- if (!src.isopen)
- usr << "The unit's doors are shut."
- return
- if (!src.ispowered || src.isbroken)
- usr << "The unit is not operational."
- return
- if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty
- user << "The unit's storage area is too cluttered."
- return
- visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
- if(do_after(user, 20))
- if(!G || !G.affecting) return //derpcheck
- var/mob/M = G.affecting
- if (M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.OCCUPANT = M
- src.isopen = 0 //close ittt
-
- //for(var/obj/O in src)
- // O.loc = src.loc
- src.add_fingerprint(user)
- qdel(G)
- src.updateUsrDialog()
- src.update_icon()
- return
+ store_mob(G.affecting, user)
return
if( istype(I,/obj/item/clothing/suit/space) )
if(!src.isopen || src.isbroken)
return
var/obj/item/clothing/suit/space/S = I
if(src.SUIT)
- user << "The unit already contains a suit."
+ user << "The unit already contains a suit."
return
if(!user.drop_item())
user << "\The [S] is stuck to your hand, you cannot put it in the Suit Storage Unit!"
return
- user << "You load the [S.name] into the storage compartment."
+ user << "You load the [S.name] into the suit storage compartment."
S.loc = src
src.SUIT = S
src.update_icon()
@@ -559,7 +519,7 @@
if(!user.drop_item())
user << "\The [H] is stuck to your hand, you cannot put it in the Suit Storage Unit!"
return
- user << "You load the [H.name] into the storage compartment."
+ user << "You load the [H.name] into the helmet storage compartment."
H.loc = src
src.HELMET = H
src.update_icon()
@@ -575,12 +535,25 @@
if(!user.drop_item())
user << "\The [M] is stuck to your hand, you cannot put it in the Suit Storage Unit!"
return
- user << "You load the [M.name] into the storage compartment."
+ user << "You load the [M.name] into the mask storage compartment."
M.loc = src
src.MASK = M
src.update_icon()
src.updateUsrDialog()
return
+ if( istype(I,/obj/item) )
+ if(!src.isopen || src.isbroken)
+ return
+ var/obj/item/ITEM = I
+ if(src.STORAGE)
+ user << "The auxiliary storage compartment is full."
+ return
+ if(!user.drop_item())
+ user << "\The [ITEM] is stuck to your hand, you cannot put it in the Suit Storage Unit!"
+ return
+ user << "You load the [ITEM.name] into the auxiliary storage compartment."
+ ITEM.loc = src
+ src.STORAGE = ITEM
src.update_icon()
src.updateUsrDialog()
return
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 9bd6a7a1ee5..478785aac7b 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -506,10 +506,6 @@
/obj/machinery/gun_turret/emp_act() //Can't emp an mechanical turret.
return
-/obj/machinery/gun_turret/meteorhit()
- die()
- return
-
/obj/machinery/gun_turret/update_icon()
if(state > 2 || state < 0) //someone fucked up the vars so fix them
take_damage(0)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ec83db9dcee..e02188a5fb3 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -724,7 +724,7 @@
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
icon_deny = "nutri-deny"
- products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 45,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 25,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 15,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
+ products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
@@ -803,7 +803,7 @@
desc = "A kitchen and restaurant equipment vendor"
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5)
+ products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5)
contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
/obj/machinery/vending/sovietsoda
@@ -842,7 +842,7 @@
icon_state = "engi"
icon_deny = "engi-deny"
req_access_txt = "11"
- products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
+ products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/sneakers/orange = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
/obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index cb4dcfb179c..2d56897af8d 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -70,8 +70,8 @@
var/new_softcap_icon_state = ""
var/new_softcap_name = ""
var/new_desc = "The colors are a bit dodgy."
- for(var/T in typesof(/obj/item/clothing/under))
- var/obj/item/clothing/under/J = new T
+ for(var/T in typesof(/obj/item/clothing/under/color))
+ var/obj/item/clothing/under/color/J = new T
//world << "DEBUG: [wash_color] == [J.item_color]"
if(wash_color == J.item_color)
new_jumpsuit_icon_state = J.icon_state
@@ -92,8 +92,8 @@
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(G)
- for(var/T in typesof(/obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/S = new T
+ for(var/T in typesof(/obj/item/clothing/shoes/sneakers))
+ var/obj/item/clothing/shoes/sneakers/S = new T
//world << "DEBUG: [wash_color] == [J.item_color]"
if(wash_color == S.item_color)
new_shoe_icon_state = S.icon_state
@@ -123,7 +123,7 @@
break
qdel(H)
if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name)
- for(var/obj/item/clothing/under/J in contents)
+ for(var/obj/item/clothing/under/color/J in contents)
//world << "DEBUG: YUP! FOUND IT!"
J.item_state = new_jumpsuit_item_state
J.icon_state = new_jumpsuit_icon_state
@@ -139,7 +139,7 @@
G.name = new_glove_name
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
- for(var/obj/item/clothing/shoes/S in contents)
+ for(var/obj/item/clothing/shoes/sneakers/S in contents)
//world << "DEBUG: YUP! FOUND IT!"
if (S.chained == 1)
S.chained = 0
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index e7f1039c528..6b2fa70ee3a 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -16,6 +16,7 @@
step_energy_drain = 3
color = "#87878715"
stepsound = null
+ turnsound = null
/obj/mecha/combat/reticence/loaded/New()
..()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 628ee7b645e..5e4fc703326 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -264,7 +264,7 @@
energy_drain = 250
range = MELEE|RANGED
construction_time = 1200
- construction_cost = list("metal"=30000,"plasma"=25000,"silver"=20000,"gold"=20000)
+ construction_cost = list("metal"=30000,"gold"=20000,"plasma"=25000,"silver"=20000)
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
var/disabled = 0 //malf
@@ -632,7 +632,7 @@
equip_cooldown = 20
energy_drain = 100
range = 0
- construction_cost = list("metal"=10000,"gold"=1000,"silver"=2000,"glass"=5000)
+ construction_cost = list("metal"=10000,"glass"=5000,"gold"=1000,"silver"=2000)
var/health_boost = 2
var/datum/global_iterator/pr_repair_droid
var/icon/droid_overlay
@@ -722,7 +722,7 @@
equip_cooldown = 10
energy_drain = 0
range = 0
- construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000)
+ construction_cost = list("metal"=10000,"glass"=2000,"gold"=2000,"silver"=3000)
var/datum/global_iterator/pr_energy_relay
var/coeff = 100
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
@@ -834,7 +834,7 @@
equip_cooldown = 10
energy_drain = 0
range = MELEE
- construction_cost = list("metal"=10000,"silver"=500,"glass"=1000)
+ construction_cost = list("metal"=10000,"glass"=1000,"silver"=500)
var/datum/global_iterator/pr_mech_generator
var/coeff = 100
var/obj/item/stack/sheet/fuel
@@ -971,7 +971,7 @@
desc = "An exosuit module that generates power using uranium as fuel. Pollutes the environment."
icon_state = "tesla"
origin_tech = "powerstorage=3;engineering=3"
- construction_cost = list("metal"=10000,"silver"=500,"glass"=1000)
+ construction_cost = list("metal"=10000,"glass"=1000,"silver"=500)
max_fuel = 50000
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 6fef8f0e1e5..de0aee86fe8 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -67,7 +67,7 @@
energy_drain = 120
projectile = /obj/item/projectile/ion
fire_sound = 'sound/weapons/Laser.ogg'
- construction_cost = list("silver" = 6000, "metal" = 20000, "uranium" = 2000)
+ construction_cost = list("metal"=20000,"silver"=6000,"uranium"=2000)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
@@ -319,7 +319,7 @@
equip_cooldown = 60
var/missile_speed = 2
var/missile_range = 30
- construction_cost = list("silver" = 8000, "metal" = 22000, "gold" = 6000)
+ construction_cost = list("metal"=22000,"gold"=6000,"silver"=8000)
action(target)
if(!action_checks(target)) return
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index d7c7771f4cc..8d6397df867 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -20,12 +20,12 @@
var/list/resources = list(
"metal"=0,
"glass"=0,
- "gold"=0,
- "silver"=0,
+ "bananium"=0,
"diamond"=0,
+ "gold"=0,
"plasma"=0,
- "uranium"=0,
- "bananium"=0
+ "silver"=0,
+ "uranium"=0
)
var/res_max_amount = 200000
var/datum/research/files
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index e0c2c72e051..df02cb26e81 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -68,7 +68,8 @@
var/max_equip = 3
var/datum/events/events
- var/stepsound = 'sound/mecha/mechturn.ogg'
+ var/stepsound = 'sound/mecha/mechstep.ogg'
+ var/turnsound = 'sound/mecha/mechturn.ogg'
/obj/mecha/New()
@@ -310,8 +311,8 @@
/obj/mecha/proc/mechturn(direction)
dir = direction
- if(stepsound)
- playsound(src,stepsound,40,1)
+ if(turnsound)
+ playsound(src,turnsound,40,1)
return 1
/obj/mecha/proc/mechstep(direction)
@@ -613,10 +614,6 @@
take_damage(30, "brute")
return
-//TODO
-/obj/mecha/meteorhit()
- return ex_act(rand(1,3))//should do for now
-
/obj/mecha/emp_act(severity)
if(get_charge())
use_power((cell.charge/2)/severity)
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 2a1f13e2340..2ea991543fa 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -17,11 +17,15 @@
anchored = 1
/obj/effect/decal/cleanable/greenglow
+ name = "green glow"
- New()
- ..()
- spawn(1200)// 2 minutes
- qdel(src)
+/obj/effect/decal/cleanable/greenglow/New()
+ ..()
+ spawn(1200)// 2 minutes
+ qdel(src)
+
+/obj/effect/decal/cleanable/greenglow/ex_act()
+ return
/obj/effect/decal/cleanable/dirt
name = "dirt"
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 1a163e0ece7..bd605edfc5a 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -136,7 +136,7 @@
/obj/effect/landmark/costume/scratch/New()
new /obj/item/clothing/gloves/white(src.loc)
- new /obj/item/clothing/shoes/white(src.loc)
+ new /obj/item/clothing/shoes/sneakers/white(src.loc)
new /obj/item/clothing/under/scratch(src.loc)
if (prob(30))
new /obj/item/clothing/head/cueball(src.loc)
@@ -152,7 +152,7 @@
new /obj/item/clothing/glasses/monocle(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that)
new CHOICE(src.loc)
- new /obj/item/clothing/shoes/black(src.loc)
+ new /obj/item/clothing/shoes/sneakers/black(src.loc)
new /obj/item/weapon/cane(src.loc)
new /obj/item/clothing/under/sl_suit(src.loc)
new /obj/item/clothing/mask/fakemoustache(src.loc)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2425331ded6..ff296e1dfec 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -208,9 +208,9 @@
success = 1
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
if(success && !failure)
- user << "You put everything in [S]."
+ user << "You put everything [S.preposition] [S]."
else if(success)
- user << "You put some things in [S]."
+ user << "You put some things [S.preposition] [S]."
else
user << "You fail to pick anything up with [S]."
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index fe774ccf435..996ce6ff0b1 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -300,4 +300,48 @@ MASS SPECTROMETER
name = "advanced mass-spectrometer"
icon_state = "adv_spectrometer"
details = 1
- origin_tech = "magnets=4;biotech=2"
\ No newline at end of file
+ origin_tech = "magnets=4;biotech=2"
+
+/obj/item/device/slime_scanner
+ name = "slime scanner"
+ icon_state = "adv_spectrometer"
+ item_state = "analyzer"
+ origin_tech = "biotech=1"
+ w_class = 2.0
+ flags = CONDUCT
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+ m_amt = 30
+ g_amt = 20
+
+/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
+ if (!isslime(M))
+ user << "This device can only scan slimes!"
+ return
+ var/mob/living/carbon/slime/T = M
+ user.show_message("Slime scan results:")
+ user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"))
+ user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()))
+ if (T.nutrition < T.get_starve_nutrition())
+ user.show_message("Warning: slime is starving!")
+ else if (T.nutrition < T.get_hunger_nutrition())
+ user.show_message("Warning: slime is hungry")
+ user.show_message("Electric change strength: [T.powerlevel]")
+ user.show_message("Health: [T.health]")
+ if (T.slime_mutation[4] == T.colour)
+ user.show_message("This slime does not evolve any further")
+ else
+ if (T.slime_mutation[3] == T.slime_mutation[4])
+ if (T.slime_mutation[2] == T.slime_mutation[1])
+ user.show_message(text("Possible mutation: []", T.slime_mutation[3]))
+ user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting")
+ else
+ user.show_message(text("Possible mutations: [], [], [] (x2)", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3]))
+ user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
+ else
+ user.show_message(text("Possible mutations: [], [], [], []", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3], T.slime_mutation[4]))
+ user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
+ if (T.cores > 1)
+ user.show_message("Anomalious slime core amount detected")
+ user.show_message("Growth progress: [T.amount_grown]/10")
\ No newline at end of file
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
new file mode 100644
index 00000000000..b0761167d4e
--- /dev/null
+++ b/code/game/objects/items/documents.dm
@@ -0,0 +1,29 @@
+/obj/item/documents
+ name = "secret documents"
+ desc = "\"Top Secret\" documents printed on special copy-protected paper."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "docs_generic"
+ item_state = "paper"
+ throwforce = 0
+ w_class = 1.0
+ throw_range = 1
+ throw_speed = 1
+ layer = 4
+ pressure_resistance = 1
+
+/obj/item/documents/nanotrasen
+ desc = "\"Top Secret\" Nanotrasen documents printed on special copy-protected paper. It is filled with complex diagrams and lists of names, dates and coordinates."
+ icon_state = "docs_verified"
+
+/obj/item/documents/syndicate
+ desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence."
+
+/obj/item/documents/syndicate/red
+ name = "'Red' secret documents"
+ desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Red\"."
+ icon_state = "docs_red"
+
+/obj/item/documents/syndicate/blue
+ name = "'Blue' secret documents"
+ desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
+ icon_state = "docs_blue"
\ No newline at end of file
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index bd34595c8a1..ef64a6f0d56 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -6,8 +6,8 @@
//Might want to move this into several files later but for now it works here
/obj/item/borg/stun
name = "electrified arm"
- icon = 'icons/obj/decals.dmi'
- icon_state = "shock"
+ icon = 'icons/mob/robot_items.dmi'
+ icon_state = "elecarm"
attack(mob/M as mob, mob/living/silicon/robot/user as mob)
@@ -45,14 +45,14 @@
/obj/item/borg/sight/thermal
name = "\proper thermal vision"
sight_mode = BORGTHERM
- icon = 'icons/obj/clothing/glasses.dmi'
+ icon = 'icons/mob/robot_items.dmi'
icon_state = "thermal"
/obj/item/borg/sight/meson
name = "\proper meson vision"
sight_mode = BORGMESON
- icon = 'icons/obj/clothing/glasses.dmi'
+ icon = 'icons/mob/robot_items.dmi'
icon_state = "meson"
@@ -63,7 +63,7 @@
/obj/item/borg/sight/hud/med
name = "medical hud"
- icon = 'icons/obj/clothing/glasses.dmi'
+ icon = 'icons/mob/robot_items.dmi'
icon_state = "healthhud"
@@ -75,7 +75,7 @@
/obj/item/borg/sight/hud/sec
name = "security hud"
- icon = 'icons/obj/clothing/glasses.dmi'
+ icon = 'icons/mob/robot_items.dmi'
icon_state = "securityhud"
New()
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index b76de88d628..299677c2a17 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -251,10 +251,10 @@
hitsound = 'sound/weapons/bladeslice.ogg'
var/cooldown = 0
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.")
- return (BRUTELOSS)
+/obj/item/weapon/shard/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide."))
+ return (BRUTELOSS)
/obj/item/weapon/shard/New()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 71e978a4529..5321ba32820 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -121,48 +121,48 @@
attack_verb = list("struck", "pistol whipped", "hit", "bashed")
var/bullets = 7.0
- examine()
- set src in usr
+/obj/item/toy/gun/examine()
+ set src in usr
- src.desc = text("There are [] cap\s left. Looks almost like the real thing! Ages 8 and up.", src.bullets)
- ..()
- return
+ src.desc = text("There are [] cap\s left. Looks almost like the real thing! Ages 8 and up.", src.bullets)
+ ..()
+ return
- attackby(obj/item/toy/ammo/gun/A as obj, mob/user as mob)
+/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A as obj, mob/user as mob)
- if (istype(A, /obj/item/toy/ammo/gun))
- if (src.bullets >= 7)
- user << "\blue It's already fully loaded!"
- return 1
- if (A.amount_left <= 0)
- user << "\red There are no more caps!"
- return 1
- if (A.amount_left < (7 - src.bullets))
- src.bullets += A.amount_left
- user << text("\red You reload [] cap\s!", A.amount_left)
- A.amount_left = 0
- else
- user << text("\red You reload [] cap\s!", 7 - src.bullets)
- A.amount_left -= 7 - src.bullets
- src.bullets = 7
- A.update_icon()
+ if (istype(A, /obj/item/toy/ammo/gun))
+ if (src.bullets >= 7)
+ user << "\blue It's already fully loaded!"
return 1
- return
+ if (A.amount_left <= 0)
+ user << "\red There are no more caps!"
+ return 1
+ if (A.amount_left < (7 - src.bullets))
+ src.bullets += A.amount_left
+ user << text("\red You reload [] cap\s!", A.amount_left)
+ A.amount_left = 0
+ else
+ user << text("\red You reload [] cap\s!", 7 - src.bullets)
+ A.amount_left -= 7 - src.bullets
+ src.bullets = 7
+ A.update_icon()
+ return 1
+ return
- afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if (flag)
- return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "\red You don't have the dexterity to do this!"
- return
- src.add_fingerprint(user)
- if (src.bullets < 1)
- user.show_message("\red *click* *click*", 2)
- return
- playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1)
- src.bullets--
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\red [] fires the [src] at []!", user, target), 1, "\red You hear a gunshot", 2)
+/obj/item/toy/gun/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
+ if (flag)
+ return
+ if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ usr << "\red You don't have the dexterity to do this!"
+ return
+ src.add_fingerprint(user)
+ if (src.bullets < 1)
+ user.show_message("\red *click* *click*", 2)
+ return
+ playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1)
+ src.bullets--
+ for(var/mob/O in viewers(user, null))
+ O.show_message(text("\red [] fires the [src] at []!", user, target), 1, "\red You hear a gunshot", 2)
/obj/item/toy/ammo/gun
name = "ammo-caps"
@@ -174,10 +174,10 @@
m_amt = 10
var/amount_left = 7.0
- update_icon()
- src.icon_state = text("357-[]", src.amount_left)
- src.desc = text("There are [] cap\s left! Make sure to recycle the box in an autolathe when it gets empty.", src.amount_left)
- return
+/obj/item/toy/ammo/gun/update_icon()
+ src.icon_state = text("357-[]", src.amount_left)
+ src.desc = text("There are [] cap\s left! Make sure to recycle the box in an autolathe when it gets empty.", src.amount_left)
+ return
/*
* Toy crossbow
@@ -193,91 +193,91 @@
attack_verb = list("attacked", "struck", "hit")
var/bullets = 5
- examine()
- set src in view(2)
- ..()
- if (bullets)
- usr << "\blue It is loaded with [bullets] foam darts!"
+/obj/item/toy/crossbow/examine()
+ set src in view(2)
+ ..()
+ if (bullets)
+ usr << "\blue It is loaded with [bullets] foam darts!"
- attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 4)
- user.drop_item()
- qdel(I)
- bullets++
- user << "\blue You load the foam dart into the crossbow."
- else
- usr << "\red It's already fully loaded."
+/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/toy/ammo/crossbow))
+ if(bullets <= 4)
+ user.drop_item()
+ qdel(I)
+ bullets++
+ user << "\blue You load the foam dart into the crossbow."
+ else
+ usr << "\red It's already fully loaded."
- afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!isturf(target.loc) || target == user) return
- if(flag) return
+/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
+ if(!isturf(target.loc) || target == user) return
+ if(flag) return
- if (locate (/obj/structure/table, src.loc))
- return
- else if (bullets)
- var/turf/trg = get_turf(target)
- var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
- bullets--
- D.icon_state = "foamdart"
- D.name = "foam dart"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
+ if (locate (/obj/structure/table, src.loc))
+ return
+ else if (bullets)
+ var/turf/trg = get_turf(target)
+ var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
+ bullets--
+ D.icon_state = "foamdart"
+ D.name = "foam dart"
+ playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- for(var/i=0, i<6, i++)
- if (D)
- if(D.loc == trg) break
- step_towards(D,trg)
+ for(var/i=0, i<6, i++)
+ if (D)
+ if(D.loc == trg) break
+ step_towards(D,trg)
- for(var/mob/living/M in D.loc)
- if(!istype(M,/mob/living)) continue
- if(M == user) continue
- for(var/mob/O in viewers(world.view, D))
- O.show_message(text("\red [] was hit by the foam dart!", M), 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- qdel(D)
- return
-
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density)
- new /obj/item/toy/ammo/crossbow(A.loc)
- qdel(D)
-
- sleep(1)
-
- spawn(10)
- if(D)
- new /obj/item/toy/ammo/crossbow(D.loc)
+ for(var/mob/living/M in D.loc)
+ if(!istype(M,/mob/living)) continue
+ if(M == user) continue
+ for(var/mob/O in viewers(world.view, D))
+ O.show_message(text("\red [] was hit by the foam dart!", M), 1)
+ new /obj/item/toy/ammo/crossbow(M.loc)
qdel(D)
+ return
- return
- else if (bullets == 0)
- user.Weaken(5)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] realized they were out of ammo and starting scrounging for some!", user), 1)
+ for(var/atom/A in D.loc)
+ if(A == user) continue
+ if(A.density)
+ new /obj/item/toy/ammo/crossbow(A.loc)
+ qdel(D)
+
+ sleep(1)
+
+ spawn(10)
+ if(D)
+ new /obj/item/toy/ammo/crossbow(D.loc)
+ qdel(D)
+
+ return
+ else if (bullets == 0)
+ user.Weaken(5)
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] realized they were out of ammo and starting scrounging for some!", user), 1)
- attack(mob/M as mob, mob/user as mob)
- src.add_fingerprint(user)
+/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
+ src.add_fingerprint(user)
// ******* Check
- if (src.bullets > 0 && M.lying)
+ if (src.bullets > 0 && M.lying)
- for(var/mob/O in viewers(M, null))
- if(O.client)
- O.show_message(text("\red [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "\red You hear the sound of foam against skull", 2)
- O.show_message(text("\red [] was hit in the head by the foam dart!", M), 1)
+ for(var/mob/O in viewers(M, null))
+ if(O.client)
+ O.show_message(text("\red [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "\red You hear the sound of foam against skull", 2)
+ O.show_message(text("\red [] was hit in the head by the foam dart!", M), 1)
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- src.bullets--
- else if (M.lying && src.bullets == 0)
- for(var/mob/O in viewers(M, null))
- if (O.client) O.show_message(text("\red [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "\red You hear someone fall", 2)
- user.Weaken(5)
- return
+ playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
+ new /obj/item/toy/ammo/crossbow(M.loc)
+ src.bullets--
+ else if (M.lying && src.bullets == 0)
+ for(var/mob/O in viewers(M, null))
+ if (O.client) O.show_message(text("\red [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "\red You hear someone fall", 2)
+ user.Weaken(5)
+ return
/obj/item/toy/ammo/crossbow
name = "foam dart"
@@ -310,26 +310,26 @@
attack_verb = list("attacked", "struck", "hit")
var/hacked = 0
- attack_self(mob/user as mob)
- active = !( active )
- if (active)
- user << "\blue You extend the plastic blade with a quick flick of your wrist."
- playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
- if(hacked)
- icon_state = "swordrainbow"
- item_state = "swordrainbow"
- else
- icon_state = "swordblue"
- item_state = "swordblue"
- w_class = 4
+/obj/item/toy/sword/attack_self(mob/user as mob)
+ active = !( active )
+ if (active)
+ user << "\blue You extend the plastic blade with a quick flick of your wrist."
+ playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
+ if(hacked)
+ icon_state = "swordrainbow"
+ item_state = "swordrainbow"
else
- user << "\blue You push the plastic blade back down into the handle."
- playsound(user, 'sound/weapons/saberoff.ogg', 20, 1)
- icon_state = "sword0"
- item_state = "sword0"
- w_class = 2
- add_fingerprint(user)
- return
+ icon_state = "swordblue"
+ item_state = "swordblue"
+ w_class = 4
+ else
+ user << "\blue You push the plastic blade back down into the handle."
+ playsound(user, 'sound/weapons/saberoff.ogg', 20, 1)
+ icon_state = "sword0"
+ item_state = "sword0"
+ w_class = 2
+ add_fingerprint(user)
+ return
// Copied from /obj/item/weapon/melee/energy/sword/attackby
/obj/item/toy/sword/attackby(obj/item/weapon/W, mob/living/user)
@@ -418,12 +418,12 @@
var/uses = 30 //0 for unlimited uses
var/instant = 0
var/colourName = "red" //for updateIcon purposes
- suicide_act(mob/user)
- viewers(user) << "[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide."
- return (BRUTELOSS|OXYLOSS)
- New()
- ..()
- name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
+/obj/item/toy/crayon/suicide_act(mob/user)
+ user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS|OXYLOSS)
+/obj/item/toy/crayon/New()
+ ..()
+ name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
/*
* Snap pops
*/
@@ -434,15 +434,15 @@
icon_state = "snappop"
w_class = 1
- throw_impact(atom/hit_atom)
- ..()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("\red The [src.name] explodes!","\red You hear a snap!")
- playsound(src, 'sound/effects/snap.ogg', 50, 1)
- qdel(src)
+/obj/item/toy/snappop/throw_impact(atom/hit_atom)
+ ..()
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ src.visible_message(" The [src.name] explodes!"," You hear a snap!")
+ playsound(src, 'sound/effects/snap.ogg', 50, 1)
+ qdel(src)
/obj/item/toy/snappop/Crossed(H as mob|obj)
if((ishuman(H))) //i guess carp and shit shouldn't set them off
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 9ff6e7bfd03..c5c2f83e071 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -23,7 +23,7 @@
/obj/item/weapon/plastique/suicide_act(var/mob/user)
. = (BRUTELOSS)
- viewers(user) << "[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!"
+ user.visible_message("[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!")
var/message_say = "FOR NO RAISIN!"
if(user.mind)
if(user.mind.special_role)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 54433b17d90..8f6eab792de 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -3,7 +3,7 @@
#define READY 2
/obj/item/weapon/grenade/chem_grenade
- name = "grenade casing"
+ name = "grenade"
desc = "A do it yourself grenade casing!"
icon_state = "chemg"
item_state = "flashbang"
@@ -18,6 +18,7 @@
/obj/item/weapon/grenade/chem_grenade/New()
create_reagents(1000)
+ name = "[initial(name)] casing" // By adding the " casing" part here we can use initial(name) to get the final name, making it nice to say "large grenade" when it is a large grenade.
/obj/item/weapon/grenade/chem_grenade/examine()
@@ -50,12 +51,11 @@
if(istype(I, /obj/item/weapon/screwdriver))
if(stage == WIRED)
if(beakers.len)
- user << "You lock the assembly."
+ stage_change(READY)
+ user << "You lock the [initial(name)] assembly."
playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3)
- icon_state = initial(icon_state) +"_locked"
- stage = READY
else
- user << "You need to add at least one beaker before locking the assembly."
+ user << "You need to add at least one beaker before locking the [initial(name)] assembly."
else if(stage == READY && !nadeassembly)
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
user << "You modify the time delay. It's set for [det_time / 10] second\s."
@@ -68,7 +68,7 @@
return
else
if(I.reagents.total_volume)
- user << "You add [I] to the assembly."
+ user << "You add [I] to the [initial(name)] assembly."
user.drop_item()
I.loc = src
beakers += I
@@ -88,37 +88,52 @@
A.loc = src
assemblyattacher = user.ckey
- stage = WIRED
- icon_state = initial(icon_state) + "_ass"
- user << "You add [A] to [src]!"
+ stage_change(WIRED)
+ user << "You add [A] to the [initial(name)] assembly!"
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = I
C.use(1)
-
- stage = WIRED
- icon_state = initial(icon_state) + "_ass"
- user << "You rig [src]."
+ det_time = 50 // In case the cable_coil was removed and readded.
+ stage_change(WIRED)
+ user << "You rig the [initial(name)] assembly."
else if(stage == READY && istype(I, /obj/item/weapon/wirecutters))
- user << "You unlock the assembly."
- icon_state = initial(icon_state) + "_ass"
- stage = WIRED
+ stage_change(WIRED)
+ user << "You unlock the [initial(name)] assembly."
else if(stage == WIRED && istype(I, /obj/item/weapon/wrench))
- user << "You open the grenade and remove the contents."
- icon_state = initial(icon_state)
- stage = EMPTY
- if(nadeassembly)
- nadeassembly.loc = get_turf(src)
- nadeassembly.master = null
- nadeassembly = null
if(beakers.len)
for(var/obj/O in beakers)
O.loc = get_turf(src)
beakers = list()
+ user << "You open the [initial(name)] assembly and remove the payload."
+ return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism.
+ if(nadeassembly)
+ nadeassembly.loc = get_turf(src)
+ nadeassembly.master = null
+ nadeassembly = null
+ else // If "nadeassembly = null && stage == WIRED", then it most have been cable_coil that was used.
+ new /obj/item/stack/cable_coil(get_turf(src),1)
+ stage_change(EMPTY)
+ user << "You remove the activation mechanism from the [initial(name)] assembly."
+/obj/item/weapon/grenade/chem_grenade/proc/stage_change(var/N)
+ stage = N
+ if (stage == EMPTY)
+ name = "[initial(name)] casing"
+ desc = initial(desc)
+ icon_state = initial(icon_state)
+ else if (stage == WIRED)
+ name = "unsecured [initial(name)]"
+ desc = "An unsecured [initial(name)] assembly."
+ icon_state = "[initial(icon_state)]_ass"
+ else if (stage == READY)
+ name = initial(name)
+ desc = "A custom made [initial(name)]."
+ icon_state = "[initial(icon_state)]_locked"
+
//assembly stuff
/obj/item/weapon/grenade/chem_grenade/receive_signal()
@@ -190,8 +205,8 @@
//Large chem grenades accept slime cores and use the appropriately.
/obj/item/weapon/grenade/chem_grenade/large
- name = "large chem grenade"
- desc = "An oversized grenade that affects a larger area."
+ name = "large grenade"
+ desc = "An oversized grenade casing."
icon_state = "large_grenade"
allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment,
/obj/item/weapon/reagent_containers/food/drinks)
@@ -217,7 +232,7 @@
//make a special case you might as well do it explicitly. -Sayu
/obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/slime_extract) && stage == WIRED)
- user << "You add [I] to the assembly."
+ user << "You add [I] to the [initial(name)] assembly."
user.drop_item()
I.loc = src
beakers += I
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index e576db99e45..18b9563867c 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -139,15 +139,13 @@
return dat
-/obj/item/weapon/implant/loyalty/implanted(mob/M)
- if(!ishuman(M)) return 0
- var/mob/living/carbon/human/H = M
- if(H.mind in ticker.mode.head_revolutionaries)
- H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!")
+/obj/item/weapon/implant/loyalty/implanted(mob/target)
+ if(target.mind in ticker.mode.head_revolutionaries)
+ target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!")
return 0
- else if(H.mind in ticker.mode:revolutionaries)
- ticker.mode:remove_revolutionary(H.mind)
- H << "You feel a surge of loyalty towards Nanotrasen."
+ if(target.mind in ticker.mode.revolutionaries)
+ ticker.mode.remove_revolutionary(target.mind)
+ target << "You feel a surge of loyalty towards Nanotrasen."
return 1
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 2db80a1c890..cbb3ac81efa 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -82,11 +82,11 @@
force = 10.0
throwforce = 10.0
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
+/obj/item/weapon/kitchen/utensil/knife/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."))
+ return (BRUTELOSS)
/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
@@ -114,11 +114,11 @@
origin_tech = "materials=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
+/obj/item/weapon/kitchenknife/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."))
+ return (BRUTELOSS)
/obj/item/weapon/kitchenknife/ritual
name = "ritual knife"
@@ -158,264 +158,6 @@
throw_speed = 3
throw_range = 7
w_class = 3.0
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
-/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(2)
- return
-
- add_logs(user, M, "attacked", object="[src.name]")
-
- var/t = user:zone_sel.selecting
- if (t == "head")
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if (H.stat < 2 && H.health < 50 && prob(90))
- // ******* Check
- if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
- H << " The helmet protects you from being hit hard in the head!"
- return
- var/time = rand(2, 6)
- if (prob(75))
- H.Paralyse(time)
- else
- H.Stun(time)
- if(H.stat != 2) H.stat = 1
- user.visible_message("[H] has been knocked unconscious!", "You knock [H] unconscious!")
- return
- else
- H.visible_message(" [user] tried to knock [H] unconscious!", " [user] tried to knock you unconscious!")
- H.eye_blurry += 3
-
- return ..()
-
-/*
- * Trays - Agouri
- */
-/obj/item/weapon/tray
- name = "tray"
- icon = 'icons/obj/food.dmi'
- icon_state = "tray"
- desc = "A metal tray to lay food on."
- throwforce = 10.0
- throw_speed = 3
- throw_range = 5
- w_class = 3.0
- flags = CONDUCT
- m_amt = 3000
- var/list/carrying = list() // List of things on the tray. - Doohl
- var/max_carry = 10 // w_class = 1 -- takes up 1
- // w_class = 2 -- takes up 3
- // w_class = 3 -- takes up 5
-
-/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
-
- // Drop all the things. All of them.
- overlays.Cut()
- for(var/obj/item/I in carrying)
- I.loc = M.loc
- carrying.Remove(I)
- if(isturf(I.loc))
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
-
-
- if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
- user << " You accidentally slam yourself with the [src]!"
- user.Weaken(1)
- user.take_organ_damage(2)
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- return
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
- return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
-
- add_logs(user, M, "attacked", object="[src.name]")
-
- if(istype(M, /mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
-
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1)
-
-
- if(prob(33))
- src.add_blood(H)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor.
- location.add_blood(H)
-
- if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
-
- H.visible_message("[user] slams [H] with the tray!", \
- "[user] slams [H] with the tray!")
-
- if(prob(15))
- M.Weaken(3)
- M.take_organ_damage(3)
- return
- else
- M.take_organ_damage(5)
- return
-
-
- if((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))
- if(prob(33))
- if (H.wear_mask)
- H.wear_mask.add_blood(H) //adding blood on the items.
- if (H.head)
- H.head.add_blood(H)
- if (H.glasses && prob(33))
- H.glasses.add_blood(H)
-
-
- M.visible_message("[user] slams [M] in the face with the tray!", \
- "[user] slams [M] in the face with the tray, against your mask!")
-
- if(prob(10))
- M.Stun(rand(1,3))
- M.take_organ_damage(3)
- return
- else
- M.take_organ_damage(5)
- return
-
- else //No eye or head protection, tough luck!
-
- M.visible_message("[user] slams [M] in the face with the tray!", \
- "[user] slams [M] in the face with the tray!")
- if(prob(30))
- M.Stun(rand(2,4))
- M.take_organ_damage(4)
- return
- else
- M.take_organ_damage(8)
- if(prob(30))
- M.Weaken(2)
- return
- return
-
- else
- ..()
-
-
-/*
-===============~~~~~================================~~~~~====================
-= =
-= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
-= =
-===============~~~~~================================~~~~~====================
-*/
-/obj/item/weapon/tray/proc/calc_carry()
- // calculate the weight of the items on the tray
- var/val = 0 // value to return
-
- for(var/obj/item/I in carrying)
- if(I.w_class == 1.0)
- val ++
- else if(I.w_class == 2.0)
- val += 3
- else
- val += 5
-
- return val
-
-/obj/item/weapon/tray/pickup(mob/user)
-
- if(!isturf(loc))
- return
-
- for(var/obj/item/I in loc)
- if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
- var/add = 0
- if(I.w_class == 1.0)
- add = 1
- else if(I.w_class == 2.0)
- add = 3
- else
- add = 5
- if(calc_carry() + add >= max_carry)
- break
-
- I.loc = src
- carrying.Add(I)
- overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
-
-/obj/item/weapon/tray/dropped(mob/user)
-
- var/mob/living/M
- for(M in src.loc) //to handle hand switching
- return
-
- var/foundtable = 0
- for(var/obj/structure/table/T in loc)
- foundtable = 1
- break
-
- overlays.Cut()
-
- for(var/obj/item/I in carrying)
- I.loc = loc
- carrying.Remove(I)
- if(!foundtable && isturf(loc))
- // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
-
-
-
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-//Enough with the violent stuff, here's what happens if you try putting food on it
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-/*/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/kitchen/utensil/fork))
- if (W.icon_state == "forkloaded")
- user << "\red You already have omelette on your fork."
- return
- W.icon = 'icons/obj/kitchen.dmi'
- W.icon_state = "forkloaded"
- viewers(3,user) << "[user] takes a piece of omelette with his fork!"
- reagents.remove_reagent("nutriment", 1)
- if (reagents.total_volume <= 0)
- qdel(src)*/
-
-
-/* if (prob(33))
- var/turf/location = H.loc
- if (istype(location, /turf/simulated))
- location.add_blood(H)
- if (H.wear_mask)
- H.wear_mask.add_blood(H)
- if (H.head)
- H.head.add_blood(H)
- if (H.glasses && prob(33))
- H.glasses.add_blood(H)
- if (istype(user, /mob/living/carbon/human))
- var/mob/living/carbon/human/user2 = user
- if (user2.gloves)
- user2.gloves.add_blood(H)
- else
- user2.add_blood(H)
- if (prob(15))
- if (user2.wear_suit)
- user2.wear_suit.add_blood(H)
- else if (user2.w_uniform)
- user2.w_uniform.add_blood(H)*/
+/* Trays moved to /obj/item/weapon/storage/bag */
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 6683467952a..27cae71883b 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -2,8 +2,8 @@
var/active = 0
/obj/item/weapon/melee/energy/suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \
- "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message(pick("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \
+ "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."))
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/rejects_blood()
@@ -24,7 +24,7 @@
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
- viewers(user) << "[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide."
+ user.visible_message("[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.")
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/axe/attack_self(mob/user)
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index c9ee6618903..5faf9b065c3 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -13,7 +13,7 @@
hitsound = 'sound/weapons/slash.ogg' //pls replace
/obj/item/weapon/melee/chainofcommand/suicide_act(mob/user)
- viewers(user) << "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide."
+ user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.")
return (OXYLOSS)
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 1d2e273aaee..31ce903d56c 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -19,9 +19,9 @@
var/construction_cost = list("metal"=750,"glass"=75)
var/construction_time=100
- suicide_act(mob/user)
- viewers(user) << "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide."
- return (FIRELOSS)
+/obj/item/weapon/stock_parts/cell/suicide_act(mob/user)
+ user.visible_message("[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.")
+ return (FIRELOSS)
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index d10a7e3963b..3eb49debd48 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -262,3 +262,58 @@
max_w_class = 3
w_class = 4 //Bigger than a book because physics
can_hold = list(/obj/item/weapon/book, /obj/item/weapon/spellbook) //No bibles, consistent with bookcase
+
+/*
+ * Trays - Agouri
+ */
+/obj/item/weapon/storage/bag/tray
+ name = "tray"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "tray"
+ desc = "A metal tray to lay food on."
+ force = 5
+ throwforce = 10.0
+ throw_speed = 3
+ throw_range = 5
+ w_class = 4.0
+ flags = CONDUCT
+ m_amt = 3000
+ preposition = "on"
+
+/obj/item/weapon/storage/bag/tray/attack(mob/living/M as mob, mob/living/user as mob)
+ ..()
+ // Drop all the things. All of them.
+ var/list/obj/item/oldContents = contents.Copy()
+ quick_empty()
+
+ // Make each item scatter a bit
+ for(var/obj/item/I in oldContents)
+ spawn()
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
+
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1)
+
+ if(ishuman(M) || ismonkey(M))
+ if(prob(10))
+ M.Weaken(2)
+
+/obj/item/weapon/storage/bag/tray/proc/rebuild_overlays()
+ overlays.Cut()
+ for(var/obj/item/I in contents)
+ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
+
+/obj/item/weapon/storage/bag/tray/remove_from_storage(obj/item/W as obj, atom/new_location)
+ ..()
+ rebuild_overlays()
+
+/obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0)
+ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
+ ..()
+
+
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/book.dm
similarity index 81%
rename from code/game/objects/items/weapons/storage/bible.dm
rename to code/game/objects/items/weapons/storage/book.dm
index 4645aea2613..fbb71c3c486 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -1,121 +1,134 @@
-/obj/item/weapon/storage/bible
- name = "bible"
- desc = "Apply to head repeatedly."
- icon_state ="bible"
- throw_speed = 2
- throw_range = 5
- w_class = 3.0
- var/mob/affecting = null
- var/deity_name = "Christ"
-
-/obj/item/weapon/storage/bible/booze
- name = "bible"
- desc = "To be applied to the head repeatedly."
- icon_state ="bible"
-
-/obj/item/weapon/storage/bible/booze/New()
- ..()
- new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
-
-/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/heal_amt = 10
- for(var/obj/item/organ/limb/affecting in H.organs)
- if(affecting.status == ORGAN_ORGANIC) //No Bible can heal a robotic arm!
- if(affecting.heal_damage(heal_amt, heal_amt, 0))
- H.update_damage_overlays(0)
- return
-
-/obj/item/weapon/storage/bible/attack(mob/living/M as mob, mob/living/user as mob)
-
- var/chaplain = 0
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- chaplain = 1
-
- add_logs(user, M, "attacked", object="[src.name]")
-
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "\red You don't have the dexterity to do this!"
- return
- if(!chaplain)
- user << "\red The book sizzles in your hands."
- user.take_organ_damage(0,10)
- return
-
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(20)
- return
-
-// if(..() == BLOCKED)
-// return
-
- if (M.stat !=2)
- if(M.mind && (M.mind.assigned_role == "Chaplain"))
- user << "\red You can't heal yourself!"
- return
- /*if((M.mind in ticker.mode.cult) && (prob(20)))
- M << "\red The power of [src.deity_name] clears your mind of heresy!"
- user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
- ticker.mode.remove_cultist(M.mind)*/
- if ((istype(M, /mob/living/carbon/human) && prob(60)))
- bless(M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/message_halt = 0
- for(var/obj/item/organ/limb/affecting in H.organs)
- if(affecting.status == ORGAN_ORGANIC)
- if(message_halt == 0)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1)
- M << "\red May the power of [src.deity_name] compel you to be healed!"
- playsound(src.loc, "punch", 25, 1, -1)
- message_halt = 1
- else
- src << "[src.deity_name] refuses to heal this metalic taint!"
- return
-
-
-
-
- else
- if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
- M.adjustBrainLoss(10)
- M << "\red You feel dumber."
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1)
- playsound(src.loc, "punch", 25, 1, -1)
-
- else if(M.stat == 2)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1)
- playsound(src.loc, "punch", 25, 1, -1)
- return
-
-/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob, proximity)
- if(!proximity) return
- if (istype(A, /turf/simulated/floor))
- user << "\blue You hit the floor with the bible."
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- call(/obj/effect/rune/proc/revealrunes)(src)
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
- user << "\blue You bless [A]."
- var/water2holy = A.reagents.get_reagent_amount("water")
- A.reagents.del_reagent("water")
- A.reagents.add_reagent("holywater",water2holy)
- if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me
- user << "\blue You purify [A]."
- var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
- A.reagents.del_reagent("unholywater")
- A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat...
-
-/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
- playsound(src.loc, "rustle", 50, 1, -5)
- ..()
+/obj/item/weapon/storage/book
+ name = "hollowed book"
+ desc = "I guess someone didn't like it."
+ icon = 'icons/obj/library.dmi'
+ icon_state ="book"
+ throw_speed = 2
+ throw_range = 5
+ w_class = 3.0
+ var/title = "book"
+/obj/item/weapon/storage/book/attack_self(mob/user)
+ user << "The pages of [title] have been cut out!"
+
+/obj/item/weapon/storage/book/bible
+ name = "bible"
+ desc = "Apply to head repeatedly."
+ icon = 'icons/obj/storage.dmi'
+ icon_state ="bible"
+ var/mob/affecting = null
+ var/deity_name = "Christ"
+
+/obj/item/weapon/storage/book/bible/booze
+ name = "bible"
+ desc = "To be applied to the head repeatedly."
+ icon_state ="bible"
+
+/obj/item/weapon/storage/book/bible/booze/New()
+ ..()
+ new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
+ new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
+ new /obj/item/weapon/spacecash(src)
+ new /obj/item/weapon/spacecash(src)
+ new /obj/item/weapon/spacecash(src)
+
+/obj/item/weapon/storage/book/bible/attack_self(mob/user)
+ return
+
+/obj/item/weapon/storage/book/bible/proc/bless(mob/living/carbon/M as mob)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/heal_amt = 10
+ for(var/obj/item/organ/limb/affecting in H.organs)
+ if(affecting.status == ORGAN_ORGANIC) //No Bible can heal a robotic arm!
+ if(affecting.heal_damage(heal_amt, heal_amt, 0))
+ H.update_damage_overlays(0)
+ return
+
+/obj/item/weapon/storage/book/bible/attack(mob/living/M as mob, mob/living/user as mob)
+
+ var/chaplain = 0
+ if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ chaplain = 1
+
+ add_logs(user, M, "attacked", object="[src.name]")
+
+ if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ user << "\red You don't have the dexterity to do this!"
+ return
+ if(!chaplain)
+ user << "\red The book sizzles in your hands."
+ user.take_organ_damage(0,10)
+ return
+
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red The [src] slips out of your hand and hits your head."
+ user.take_organ_damage(10)
+ user.Paralyse(20)
+ return
+
+// if(..() == BLOCKED)
+// return
+
+ if (M.stat !=2)
+ if(M.mind && (M.mind.assigned_role == "Chaplain"))
+ user << "\red You can't heal yourself!"
+ return
+ /*if((M.mind in ticker.mode.cult) && (prob(20)))
+ M << "\red The power of [src.deity_name] clears your mind of heresy!"
+ user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
+ ticker.mode.remove_cultist(M.mind)*/
+ if ((istype(M, /mob/living/carbon/human) && prob(60)))
+ bless(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/message_halt = 0
+ for(var/obj/item/organ/limb/affecting in H.organs)
+ if(affecting.status == ORGAN_ORGANIC)
+ if(message_halt == 0)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1)
+ M << "\red May the power of [src.deity_name] compel you to be healed!"
+ playsound(src.loc, "punch", 25, 1, -1)
+ message_halt = 1
+ else
+ src << "[src.deity_name] refuses to heal this metallic taint!"
+ return
+
+
+
+
+ else
+ if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
+ M.adjustBrainLoss(10)
+ M << "\red You feel dumber."
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1)
+ playsound(src.loc, "punch", 25, 1, -1)
+
+ else if(M.stat == 2)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1)
+ playsound(src.loc, "punch", 25, 1, -1)
+ return
+
+/obj/item/weapon/storage/book/bible/afterattack(atom/A, mob/user as mob, proximity)
+ if(!proximity) return
+ if (istype(A, /turf/simulated/floor))
+ user << "\blue You hit the floor with the bible."
+ if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ call(/obj/effect/rune/proc/revealrunes)(src)
+ if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
+ user << "\blue You bless [A]."
+ var/water2holy = A.reagents.get_reagent_amount("water")
+ A.reagents.del_reagent("water")
+ A.reagents.add_reagent("holywater",water2holy)
+ if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me
+ user << "\blue You purify [A]."
+ var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
+ A.reagents.del_reagent("unholywater")
+ A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat...
+
+/obj/item/weapon/storage/book/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ playsound(src.loc, "rustle", 50, 1, -5)
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 11a730b576e..94ce4c9fb7b 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -19,34 +19,3 @@
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(src)
-
-/obj/item/weapon/storage/briefcase/attack(mob/living/M as mob, mob/living/user as mob)
- //..()
-
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(2)
- return
-
- add_logs(user, M, "attacked", object="[src.name]")
-
- if (M.stat < 2 && M.health < 50 && prob(90))
- var/mob/H = M
- // ******* Check
- if ((istype(H, /mob/living/carbon/human) && istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80)))
- M << "\red The helmet protects you from being hit hard in the head!"
- return
- var/time = rand(2, 6)
- if (prob(75))
- M.Paralyse(time)
- else
- M.Stun(time)
- if(M.stat != 2) M.stat = 1
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] has been knocked unconscious!", M), 1, "\red You hear someone fall.", 2)
- else
- M << text("\red [] tried to knock you unconcious!",user)
- M.eye_blurry += 3
-
- return
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 5cfb8cb1178..d4789e638c6 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -17,57 +17,59 @@
var/icon_broken = "lockbox+b"
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/card/id))
- if(src.broken)
- user << "\red It appears to be broken."
- return
- if(src.allowed(user))
- src.locked = !( src.locked )
- if(src.locked)
- src.icon_state = src.icon_locked
- user << "\red You lock the [src.name]!"
- return
- else
- src.icon_state = src.icon_closed
- user << "\red You unlock the [src.name]!"
- return
- else
- user << "\red Access Denied."
- return
- else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
- broken = 1
- locked = 0
- desc = "It appears to be broken."
- icon_state = src.icon_broken
- if(istype(W, /obj/item/weapon/melee/energy/blade))
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, src.loc)
- spark_system.start()
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
- playsound(src.loc, "sparks", 50, 1)
- for(var/mob/O in viewers(user, 3))
- O.show_message(text("\blue \The [src] has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
+/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/card/id))
+ if(src.broken)
+ user << "\red It appears to be broken."
+ return
+ if(src.allowed(user))
+ src.locked = !( src.locked )
+ if(src.locked)
+ src.icon_state = src.icon_locked
+ user << "\red You lock the [src.name]!"
return
else
- for(var/mob/O in viewers(user, 3))
- O.show_message(text("\blue \The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2)
+ src.icon_state = src.icon_closed
+ user << "\red You unlock the [src.name]!"
return
-
- if(!locked)
- ..()
else
- user << "\red It's locked!"
- return
-
-
- show_to(mob/user as mob)
- if(locked)
- user << "\red It's locked!"
+ user << "\red Access Denied."
+ return
+ else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
+ broken = 1
+ locked = 0
+ desc = "It appears to be broken."
+ icon_state = src.icon_broken
+ if(istype(W, /obj/item/weapon/melee/energy/blade))
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, src.loc)
+ spark_system.start()
+ playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src.loc, "sparks", 50, 1)
+ for(var/mob/O in viewers(user, 3))
+ O.show_message(text("\blue \The [src] has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
+ return
else
- ..()
- return
+ for(var/mob/O in viewers(user, 3))
+ O.show_message(text("\blue \The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2)
+ return
+ if(!locked)
+ ..()
+ else
+ user << "\red It's locked!"
+ return
+/obj/item/weapon/storage/lockbox/show_to(mob/user as mob)
+ if(locked)
+ user << "\red It's locked!"
+ else
+ ..()
+ return
+
+/obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W, stop_messages = 0)
+ if(locked)
+ return 0
+ return ..()
/obj/item/weapon/storage/lockbox/loyalty
name = "lockbox of loyalty implants"
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 7eec058615b..ba36a039749 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -137,6 +137,12 @@
return
return
+/obj/item/weapon/storage/secure/can_be_inserted(obj/item/W, stop_messages = 0)
+ if(locked)
+ return 0
+ return ..()
+
+
// -----------------------------
// Secure Briefcase
// -----------------------------
@@ -175,42 +181,6 @@
src.add_fingerprint(user)
return
- //I consider this worthless but it isn't my code so whatever. Remove or uncomment.
- /*attack(mob/M as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(2)
- return
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
-
- log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
-
- var/t = user:zone_sel.selecting
- if (t == "head")
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if (H.stat < 2 && H.health < 50 && prob(90))
- // ******* Check
- if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
- H << "\red The helmet protects you from being hit hard in the head!"
- return
- var/time = rand(2, 6)
- if (prob(75))
- H.Paralyse(time)
- else
- H.Stun(time)
- if(H.stat != 2) H.stat = 1
- for(var/mob/O in viewers(H, null))
- O.show_message(text("\red [] has been knocked unconscious!", H), 1, "\red You hear someone fall.", 2)
- else
- H << text("\red [] tried to knock you unconcious!",user)
- H.eye_blurry += 3
-
- return*/
-
// -----------------------------
// Secure Safe
// -----------------------------
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 85da667cd4c..728ec9fe470 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -21,6 +21,7 @@
var/allow_quick_empty //Set this variable to allow the object to have the 'empty' verb, which dumps all the contents on the floor.
var/allow_quick_gather //Set this variable to allow the object to have the 'toggle mode' verb, which quickly collects all items from a tile.
var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile, 2 = pick all of a type
+ var/preposition = "in" // You put things 'in' a bag, but trays need 'on'.
/obj/item/weapon/storage/MouseDrop(obj/over_object)
@@ -218,7 +219,7 @@
if(W.w_class > max_w_class)
if(!stop_messages)
- usr << "[W] is too big for this [src]."
+ usr << "[W] is too big for [src]."
return 0
var/sum_w_class = W.w_class
@@ -262,11 +263,11 @@
if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/crossbow))
for(var/mob/M in viewers(usr, null))
if(M == usr)
- usr << "You put [W] into [src]."
+ usr << "You put [W] [preposition]to [src]."
else if(in_range(M, usr)) //If someone is standing close enough, they can tell what it is...
- M.show_message("[usr] puts [W] into [src].")
+ M.show_message("[usr] puts [W] [preposition]to [src].")
else if(W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
- M.show_message("[usr] puts [W] into [src].")
+ M.show_message("[usr] puts [W] [preposition]to [src].")
orient2hud(usr)
if(usr.s_active)
@@ -321,12 +322,6 @@
if(!can_be_inserted(W))
return 0
- if(istype(W, /obj/item/weapon/tray)) //THIS ISN'T HOW OOP WORKS
- var/obj/item/weapon/tray/T = W
- if(T.calc_carry() > 0)
- user << "[T] won't fit in [src]."
- return 1
-
handle_item_insertion(W)
return 1
@@ -376,7 +371,7 @@
if(0)
usr << "[src] now picks up one item at a time."
-
+// Empty all the contents onto the current turf
/obj/item/weapon/storage/verb/quick_empty()
set name = "Empty Contents"
set category = "Object"
@@ -384,8 +379,13 @@
if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained())
return
+ do_quick_empty()
+
+// Empty all the contents onto the current turf, without checking the user's status.
+/obj/item/weapon/storage/proc/do_quick_empty()
var/turf/T = get_turf(src)
- hide_from(usr)
+ if(usr)
+ hide_from(usr)
for(var/obj/item/I in contents)
remove_from_storage(I, T)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 0adf5b56b9c..6faf4926fe5 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/storage/box/syndicate/
New()
..()
- switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
+ switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
if("bloodyspai")
new /obj/item/clothing/under/chameleon(src)
new /obj/item/clothing/mask/gas/voice(src)
@@ -15,6 +15,14 @@
new /obj/item/device/chameleon(src)
return
+ if("bond")
+ new /obj/item/weapon/gun/projectile/automatic/pistol(src)
+ new /obj/item/weapon/silencer(src)
+ new /obj/item/ammo_box/magazine/m10mm(src)
+ new /obj/item/ammo_box/magazine/m10mm(src)
+ new /obj/item/clothing/under/chameleon(src)
+ return
+
if("screwed")
new /obj/item/device/sbeacondrop/bomb(src)
new /obj/item/weapon/grenade/syndieminibomb(src)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 45cff3703d0..bc37ba6662f 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -14,9 +14,9 @@
var/obj/item/weapon/stock_parts/cell/high/bcell = null
var/hitcost = 1000
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide."
- return (FIRELOSS)
+/obj/item/weapon/melee/baton/suicide_act(mob/user)
+ user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.")
+ return (FIRELOSS)
/obj/item/weapon/melee/baton/New()
..()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 07c08f3f4f2..385115c97a8 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -49,10 +49,10 @@
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
- suicide_act(mob/user)
- viewers(user) << pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \
- "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.")
- return(BRUTELOSS)
+/obj/item/weapon/screwdriver/suicide_act(mob/user)
+ user.visible_message(pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \
+ "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide."))
+ return(BRUTELOSS)
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 2ee57d057d8..3b0ba69ed11 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -214,9 +214,8 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
..()
- if((CLUMSY in user.mutations) && (wielded) &&prob(40))
- user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]."
- user.take_organ_damage(20,25)
+ if((CLUMSY in user.mutations) && (wielded) && prob(40))
+ impale(user)
return
if((wielded) && prob(50))
spawn(0)
@@ -224,6 +223,13 @@ obj/item/weapon/twohanded/
user.dir = i
sleep(1)
+/obj/item/weapon/twohanded/dualsaber/proc/impale(mob/living/user as mob)
+ user << "You twirl around a bit before losing your balance and impaling yourself on the [src]."
+ if (force_wielded)
+ user.take_organ_damage(20,25)
+ else
+ user.adjustStaminaLoss(25)
+
/obj/item/weapon/twohanded/dualsaber/IsShield()
if(wielded)
return 1
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index da07f221a55..3edaf0d1358 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -11,7 +11,7 @@
attack_verb = list("banned")
/obj/item/weapon/banhammer/suicide_act(mob/user)
- viewers(user) << "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life."
+ user.visible_message("[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life.")
return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS)
/obj/item/weapon/banhammer/attack(mob/M, mob/user)
@@ -32,9 +32,9 @@
throwforce = 10
w_class = 1
- suicide_act(mob/user)
- viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide."
- return (BRUTELOSS|FIRELOSS)
+/obj/item/weapon/nullrod/suicide_act(mob/user)
+ user.visible_message("[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/sord
name = "\improper SORD"
@@ -48,9 +48,9 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- suicide_act(mob/user)
- viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide."
- return(BRUTELOSS)
+/obj/item/weapon/sord/suicide_act(mob/user)
+ user.visible_message("[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ return(BRUTELOSS)
/obj/item/weapon/claymore
name = "claymore"
@@ -65,12 +65,12 @@
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- IsShield()
- return 1
+/obj/item/weapon/claymore/IsShield()
+ return 1
- suicide_act(mob/user)
- viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."
- return(BRUTELOSS)
+/obj/item/weapon/claymore/suicide_act(mob/user)
+ user.visible_message("[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.")
+ return(BRUTELOSS)
/obj/item/weapon/katana
name = "katana"
@@ -85,9 +85,9 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- suicide_act(mob/user)
- viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."
- return(BRUTELOSS)
+/obj/item/weapon/katana/suicide_act(mob/user)
+ user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
+ return(BRUTELOSS)
/obj/item/weapon/katana/IsShield()
return 1
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index dc81ffab22d..8952a88a1b5 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -15,14 +15,4 @@ obj/structure/ex_act(severity)
qdel(src)
return
if(3.0)
- return
-
-obj/structure/meteorhit(obj/O as obj)
- qdel(src)
-
-
-
-
-
-
-
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 5083689c6c4..97d55bedaab 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -163,12 +163,6 @@
A.loc = src.loc
qdel(src)
-/obj/structure/closet/meteorhit(obj/O as obj)
- if(O.icon_state == "flaming")
- for(var/mob/M in src)
- M.meteorhit(O)
- src.dump_contents()
- qdel(src)
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened)
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 0bdd968c852..4452056525f 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -29,8 +29,8 @@
new /obj/item/clothing/tie/waistcoat(src)
new /obj/item/clothing/head/soft/black(src)
new /obj/item/clothing/head/soft/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
/*
* Chef
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 979c03b2686..28e73053299 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -12,7 +12,7 @@
..()
sleep(2)
new /obj/item/clothing/under/rank/cargotech(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/soft(src)
@@ -33,7 +33,7 @@
..()
sleep(2)
new /obj/item/clothing/under/rank/cargo(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/black(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index c839164a1bf..a08dd717f8e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -21,7 +21,7 @@
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/head/welding(src)
new /obj/item/clothing/gloves/yellow(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/cartridge/ce(src)
new /obj/item/device/radio/headset/heads/ce(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
@@ -32,8 +32,6 @@
new /obj/item/device/flash(src)
return
-
-
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
req_access = list(access_engine_equip)
@@ -106,7 +104,7 @@
else
new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
// new /obj/item/weapon/cartridge/engineering(src)
new /obj/item/device/radio/headset/headset_eng(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index c3e0a77f0cb..5416820a21e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -86,7 +86,7 @@
new /obj/item/clothing/under/rank/medical/purple(src)
new /obj/item/clothing/under/rank/medical(src)
new /obj/item/clothing/suit/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
// new /obj/item/weapon/cartridge/medical(src)
new /obj/item/device/radio/headset/headset_med(src)
new /obj/item/weapon/storage/belt/medical(src)
@@ -117,7 +117,7 @@
new /obj/item/clothing/suit/labcoat/cmo(src)
new /obj/item/weapon/cartridge/cmo(src)
new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/shoes/brown (src)
+ new /obj/item/clothing/shoes/sneakers/brown (src)
new /obj/item/device/radio/headset/heads/cmo(src)
new /obj/item/weapon/storage/belt/medical(src)
new /obj/item/device/flash(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 1dad4811ea5..ebdcba771d8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -21,7 +21,7 @@
..()
contents.Cut()
new /obj/item/clothing/under/color/white( src )
- new /obj/item/clothing/shoes/white( src )
+ new /obj/item/clothing/shoes/sneakers/white( src )
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index a8be524be1c..7a06549d669 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -13,7 +13,7 @@
sleep(2)
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/suit/labcoat/science(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
// new /obj/item/weapon/cartridge/signal/toxins(src)
new /obj/item/device/radio/headset/headset_sci(src)
new /obj/item/weapon/tank/air(src)
@@ -40,7 +40,7 @@
new /obj/item/clothing/under/rank/research_director(src)
new /obj/item/clothing/suit/labcoat(src)
new /obj/item/weapon/cartridge/rd(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/clothing/gloves/latex(src)
new /obj/item/device/radio/headset/heads/rd(src)
new /obj/item/weapon/tank/air(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 9708aeb96f4..185310e5e80 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -22,14 +22,12 @@
new /obj/item/clothing/suit/armor/vest/capcarapace(src)
new /obj/item/weapon/cartridge/captain(src)
new /obj/item/clothing/head/helmet/swat(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/clothing/gloves/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
return
-
-
/obj/structure/closet/secure_closet/hop
name = "\proper head of personnel's locker"
req_access = list(access_hop)
@@ -47,7 +45,7 @@
new /obj/item/clothing/head/hopcap(src)
new /obj/item/weapon/cartridge/hop(src)
new /obj/item/device/radio/headset/heads/hop(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/clothing/suit/armor/vest(src)
@@ -203,7 +201,7 @@
new /obj/item/clothing/suit/det_suit(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/det_hat(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/device/radio/headset/headset_sec(src)
@@ -248,7 +246,7 @@
New()
new /obj/item/clothing/under/color/orange( src )
- new /obj/item/clothing/shoes/orange( src )
+ new /obj/item/clothing/shoes/sneakers/orange( src )
return
@@ -260,7 +258,7 @@
New()
..()
sleep(2)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/paper/Court (src)
new /obj/item/weapon/paper/Court (src)
new /obj/item/weapon/paper/Court (src)
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 31aff82fff5..04c1f737b46 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -121,12 +121,6 @@
for(var/mob/M in src)
shatter(M)
-/obj/structure/closet/statue/meteorhit(obj/O as obj)
- if(O.icon_state == "flaming")
- for(var/mob/M in src)
- M.meteorhit(O)
- shatter(M)
-
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob)
health -= I.force
visible_message("\red [user] strikes [src] with [I].")
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 4e0462c63f3..d9f4944a19b 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -168,7 +168,7 @@
sleep(2)
new /obj/item/clothing/suit/bomb_suit( src )
new /obj/item/clothing/under/color/black( src )
- new /obj/item/clothing/shoes/black( src )
+ new /obj/item/clothing/shoes/sneakers/black( src )
new /obj/item/clothing/head/bomb_hood( src )
@@ -184,7 +184,7 @@
sleep(2)
new /obj/item/clothing/suit/bomb_suit/security( src )
new /obj/item/clothing/under/rank/security( src )
- new /obj/item/clothing/shoes/brown( src )
+ new /obj/item/clothing/shoes/sneakers/brown( src )
new /obj/item/clothing/head/bomb_hood/security( src )
/*
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index c468a732251..b0aa0ed0f45 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -8,9 +8,9 @@
new /obj/item/clothing/under/color/blue(src)
new /obj/item/clothing/under/color/blue(src)
new /obj/item/clothing/under/color/blue(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
return
@@ -58,9 +58,9 @@
new /obj/item/clothing/under/color/pink(src)
new /obj/item/clothing/under/color/pink(src)
new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
return
/obj/structure/closet/wardrobe/black
@@ -72,9 +72,9 @@
new /obj/item/clothing/under/color/black(src)
new /obj/item/clothing/under/color/black(src)
new /obj/item/clothing/under/color/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/head/that(src)
new /obj/item/clothing/head/that(src)
new /obj/item/clothing/head/that(src)
@@ -92,7 +92,7 @@
/obj/structure/closet/wardrobe/chaplain_black/New()
new /obj/item/clothing/under/rank/chaplain(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/suit/nun(src)
new /obj/item/clothing/head/nun_hood(src)
new /obj/item/clothing/suit/chaplain_hoodie(src)
@@ -113,9 +113,9 @@
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
return
@@ -129,9 +129,9 @@
new /obj/item/clothing/under/color/orange(src)
new /obj/item/clothing/under/color/orange(src)
new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
return
@@ -144,9 +144,9 @@
new /obj/item/clothing/under/color/yellow(src)
new /obj/item/clothing/under/color/yellow(src)
new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
return
@@ -162,9 +162,9 @@
new /obj/item/device/analyzer(src)
new /obj/item/device/analyzer(src)
new /obj/item/device/analyzer(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
return
@@ -178,9 +178,9 @@
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/sneakers/orange(src)
return
@@ -193,9 +193,9 @@
new /obj/item/clothing/under/color/white(src)
new /obj/item/clothing/under/color/white(src)
new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
return
@@ -209,10 +209,10 @@
new /obj/item/clothing/under/pj/red(src)
new /obj/item/clothing/under/pj/blue(src)
new /obj/item/clothing/under/pj/blue(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
return
@@ -228,9 +228,9 @@
new /obj/item/clothing/suit/labcoat(src)
new /obj/item/clothing/suit/labcoat(src)
new /obj/item/clothing/suit/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
return
@@ -244,8 +244,8 @@
new /obj/item/clothing/under/rank/roboticist(src)
new /obj/item/clothing/suit/labcoat(src)
new /obj/item/clothing/suit/labcoat(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/soft/black(src)
@@ -261,8 +261,8 @@
/obj/structure/closet/wardrobe/chemistry_white/New()
new /obj/item/clothing/under/rank/chemist(src)
new /obj/item/clothing/under/rank/chemist(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/clothing/suit/labcoat/chemist(src)
new /obj/item/clothing/suit/labcoat/chemist(src)
return
@@ -276,8 +276,8 @@
/obj/structure/closet/wardrobe/genetics_white/New()
new /obj/item/clothing/under/rank/geneticist(src)
new /obj/item/clothing/under/rank/geneticist(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/clothing/suit/labcoat/genetics(src)
new /obj/item/clothing/suit/labcoat/genetics(src)
return
@@ -291,8 +291,8 @@
/obj/structure/closet/wardrobe/virology_white/New()
new /obj/item/clothing/under/rank/virologist(src)
new /obj/item/clothing/under/rank/virologist(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/clothing/suit/labcoat/virologist(src)
new /obj/item/clothing/suit/labcoat/virologist(src)
new /obj/item/clothing/mask/surgical(src)
@@ -309,9 +309,9 @@
new /obj/item/clothing/under/color/grey(src)
new /obj/item/clothing/under/color/grey(src)
new /obj/item/clothing/under/color/grey(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
@@ -334,7 +334,7 @@
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/orange(src)
new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/brown(src)
+ new /obj/item/clothing/shoes/sneakers/white(src)
return
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index c182bb2833f..a7752c65025 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -45,12 +45,6 @@
qdel(src)
-/obj/structure/displaycase/meteorhit(obj/O as obj)
- new /obj/item/weapon/shard( src.loc )
- new /obj/item/weapon/gun/energy/laser/captain( src.loc )
- qdel(src)
-
-
/obj/structure/displaycase/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 4e503a71961..ff59707bbed 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -18,10 +18,6 @@
/obj/structure/grille/blob_act()
qdel(src)
-/obj/structure/grille/meteorhit(var/obj/M)
- qdel(src)
-
-
/obj/structure/grille/Bumped(atom/user)
if(ismob(user)) shock(user, 70)
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index d4c2e68a8e8..28e4bf516de 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -40,12 +40,6 @@
qdel(src)
-/obj/structure/lamarr/meteorhit(obj/O as obj)
- new /obj/item/weapon/shard( src.loc )
- Break()
- qdel(src)
-
-
/obj/structure/lamarr/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 13f86a3785c..fd879cd10f2 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -174,7 +174,7 @@
/datum/song/Topic(href, href_list)
- if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
+ if(usr.canUseTopic(src))
usr << browse(null, "window=instrument")
usr.unset_machine()
return
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index 2554a7a76c3..33a08d1b6de 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -165,15 +165,10 @@ FLOOR SAFES
obj/structure/safe/blob_act()
return
-
obj/structure/safe/ex_act(severity)
return
-obj/structure/safe/meteorhit(obj/O as obj)
- return
-
-
//FLOOR SAFES
/obj/structure/safe/floor
name = "floor safe"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 924c0fa7864..879fdba84cc 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -39,13 +39,20 @@
buckle_mob(M, user)
return
+/obj/structure/stool/bed/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled
+ return
+
/obj/structure/stool/bed/proc/unbuckle()
if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
+
+ var/M = buckled_mob
buckled_mob = null
+
+ afterbuckle(M)
return
/obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob)
@@ -104,6 +111,8 @@
M.update_canmove()
src.buckled_mob = M
src.add_fingerprint(user)
+
+ afterbuckle(M)
return
/*
@@ -116,30 +125,18 @@
anchored = 0
var/const/buckled_pixel_y_offset = 6 //Mobs buckled will have their pixel_y offset by this much
+/obj/structure/stool/bed/roller/afterbuckle(mob/M as mob)
+ if(buckled_mob)
+ density = 1
+ icon_state = "up"
+ M.pixel_y += buckled_pixel_y_offset
+ else
+ density = 0
+ icon_state = "down"
+ M.pixel_y -= buckled_pixel_y_offset
+
/obj/structure/stool/bed/roller/Move()
..()
if(buckled_mob)
if(buckled_mob.buckled == src)
buckled_mob.loc = src.loc
-
-/obj/structure/stool/bed/roller/buckle_mob(mob/M as mob, mob/user as mob)
- if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || istype(usr, /mob/living/silicon/pai) )
- return
- M.pixel_y += buckled_pixel_y_offset
- density = 1
- icon_state = "up"
- ..()
- return
-
-/obj/structure/stool/bed/roller/manual_unbuckle(mob/user as mob)
- if(buckled_mob)
- if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
- buckled_mob.pixel_y -= buckled_pixel_y_offset
- buckled_mob.anchored = initial(buckled_mob.anchored)
- buckled_mob.buckled = null
- buckled_mob.update_canmove()
- buckled_mob = null
- density = 0
- icon_state = "down"
- ..()
- return
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 4bc9a507fc5..381e14b33bd 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -96,25 +96,40 @@
/obj/structure/stool/bed/chair/comfy
name = "comfy chair"
desc = "It looks comfy."
+ icon_state = "comfychair"
+ color = rgb(255,255,255)
+ var/image/armrest = null
+
+/obj/structure/stool/bed/chair/comfy/New()
+ armrest = image("icons/obj/objects.dmi", "comfychair_armrest")
+ armrest.layer = MOB_LAYER + 0.1
+
+ return ..()
+
+/obj/structure/stool/bed/chair/comfy/afterbuckle()
+ if(buckled_mob)
+ overlays += armrest
+ else
+ overlays -= armrest
/obj/structure/stool/bed/chair/comfy/brown
- icon_state = "comfychair_brown"
+ color = rgb(255,113,0)
/obj/structure/stool/bed/chair/comfy/beige
- icon_state = "comfychair_beige"
+ color = rgb(255,253,195)
/obj/structure/stool/bed/chair/comfy/teal
- icon_state = "comfychair_teal"
+ color = rgb(0,255,255)
+
+/obj/structure/stool/bed/chair/comfy/black
+ color = rgb(167,164,153)
+
+/obj/structure/stool/bed/chair/comfy/lime
+ color = rgb(255,251,0)
/obj/structure/stool/bed/chair/office
anchored = 0
-/obj/structure/stool/bed/chair/comfy/black
- icon_state = "comfychair_black"
-
-/obj/structure/stool/bed/chair/comfy/lime
- icon_state = "comfychair_lime"
-
/obj/structure/stool/bed/chair/office/Move()
..()
handle_rotation()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index bc44ecd7791..79ccd28eec3 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -559,6 +559,19 @@
if (istype(I, /obj/item/weapon/wrench))
table_destroy(2, user)
return
+
+ if (istype(I, /obj/item/weapon/storage/bag/tray))
+ var/obj/item/weapon/storage/bag/tray/T = I
+ if(T.contents.len > 0) // If the tray isn't empty
+ var/list/obj/item/oldContents = T.contents.Copy()
+ T.quick_empty()
+
+ for(var/obj/item/C in oldContents)
+ C.loc = src.loc
+
+ user.visible_message("[user] empties [I] on [src].")
+ return
+ // If the tray IS empty, continue on (tray will be placed on the table like other items)
if(isrobot(user))
return
@@ -730,9 +743,6 @@ Destroy type values:
if(W && W.loc) W.loc = src.loc
return 1
-/obj/structure/rack/meteorhit(obj/O as obj)
- qdel(src)
-
/obj/structure/rack/attack_hand(mob/user)
if(HULK in user.mutations)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 923e254f2cf..a2a5bf5e030 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -11,6 +11,7 @@
var/ini_dir = null
var/state = 0
var/reinf = 0
+ var/disassembled = 0
// var/silicate = 0 // number of units of silicate
// var/icon/silicateIcon = null // the silicated icon
@@ -50,12 +51,6 @@
qdel(src)
-/obj/structure/window/meteorhit()
- //world << "glass at [x],[y],[z] Mhit"
- new /obj/item/weapon/shard( loc )
- if(reinf) new /obj/item/stack/rods( loc)
- qdel(src)
-
/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
@@ -192,6 +187,7 @@
G = new (user.loc)
G.add_fingerprint(user)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ disassembled = 1
qdel(src)
else
if(I.damtype == BRUTE || I.damtype == BURN)
@@ -310,7 +306,8 @@
/obj/structure/window/Destroy()
density = 0
air_update_turf(1)
- playsound(src, "shatter", 70, 1)
+ if(!disassembled)
+ playsound(src, "shatter", 70, 1)
update_nearby_icons()
..()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index a578458d2b1..7c02b232b65 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -7,7 +7,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
"asteroid","asteroid_dug",
"asteroid0","asteroid1","asteroid2","asteroid3","asteroid4",
"asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12",
- "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "wood-broken", "carpet",
+ "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "wood-broken",
"carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5",
"ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11",
"ironsand12", "ironsand13", "ironsand14", "ironsand15")
@@ -113,46 +113,48 @@ turf/simulated/floor/proc/update_icon()
icon_state = "grass[pick("1","2","3","4")]"
else if(is_carpet_floor())
if(!broken && !burnt)
- if(icon_state == "carpet")
- var/connectdir = 0
- for(var/direction in cardinal)
- if(istype(get_step(src,direction),/turf/simulated/floor))
- var/turf/simulated/floor/FF = get_step(src,direction)
- if(FF.is_carpet_floor())
- connectdir |= direction
+ if(icon_state == "carpetsymbol") //le snowflake :^)
+ return
- //Check the diagonal connections for corners, where you have, for example, connections both north and east. In this case it checks for a north-east connection to determine whether to add a corner marker or not.
- var/diagonalconnect = 0 //1 = NE; 2 = SE; 4 = NW; 8 = SW
+ var/connectdir = 0
+ for(var/direction in cardinal)
+ if(istype(get_step(src,direction),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,direction)
+ if(FF.is_carpet_floor())
+ connectdir |= direction
- //Northeast
- if(connectdir & NORTH && connectdir & EAST)
- if(istype(get_step(src,NORTHEAST),/turf/simulated/floor))
- var/turf/simulated/floor/FF = get_step(src,NORTHEAST)
- if(FF.is_carpet_floor())
- diagonalconnect |= 1
+ //Check the diagonal connections for corners, where you have, for example, connections both north and east. In this case it checks for a north-east connection to determine whether to add a corner marker or not.
+ var/diagonalconnect = 0 //1 = NE; 2 = SE; 4 = NW; 8 = SW
- //Southeast
- if(connectdir & SOUTH && connectdir & EAST)
- if(istype(get_step(src,SOUTHEAST),/turf/simulated/floor))
- var/turf/simulated/floor/FF = get_step(src,SOUTHEAST)
- if(FF.is_carpet_floor())
- diagonalconnect |= 2
+ //Northeast
+ if(connectdir & NORTH && connectdir & EAST)
+ if(istype(get_step(src,NORTHEAST),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,NORTHEAST)
+ if(FF.is_carpet_floor())
+ diagonalconnect |= 1
- //Northwest
- if(connectdir & NORTH && connectdir & WEST)
- if(istype(get_step(src,NORTHWEST),/turf/simulated/floor))
- var/turf/simulated/floor/FF = get_step(src,NORTHWEST)
- if(FF.is_carpet_floor())
- diagonalconnect |= 4
+ //Southeast
+ if(connectdir & SOUTH && connectdir & EAST)
+ if(istype(get_step(src,SOUTHEAST),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,SOUTHEAST)
+ if(FF.is_carpet_floor())
+ diagonalconnect |= 2
- //Southwest
- if(connectdir & SOUTH && connectdir & WEST)
- if(istype(get_step(src,SOUTHWEST),/turf/simulated/floor))
- var/turf/simulated/floor/FF = get_step(src,SOUTHWEST)
- if(FF.is_carpet_floor())
- diagonalconnect |= 8
+ //Northwest
+ if(connectdir & NORTH && connectdir & WEST)
+ if(istype(get_step(src,NORTHWEST),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,NORTHWEST)
+ if(FF.is_carpet_floor())
+ diagonalconnect |= 4
- icon_state = "carpet[connectdir]-[diagonalconnect]"
+ //Southwest
+ if(connectdir & SOUTH && connectdir & WEST)
+ if(istype(get_step(src,SOUTHWEST),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,SOUTHWEST)
+ if(FF.is_carpet_floor())
+ diagonalconnect |= 8
+
+ icon_state = "carpet[connectdir]-[diagonalconnect]"
else if(is_wood_floor())
if(!broken && !burnt)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 026c4abd212..4fd11515506 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -288,30 +288,29 @@
/turf/simulated/wall/proc/thermitemelt(mob/user as mob)
if(mineral == "diamond")
return
+
+ overlays = list()
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
- O.name = "Thermite"
+ O.name = "thermite"
O.desc = "Looks hot."
O.icon = 'icons/effects/fire.dmi'
O.icon_state = "2"
O.anchored = 1
+ O.opacity = 1
O.density = 1
O.layer = 5
- var/turf/simulated/floor/F = ChangeTurf(/turf/simulated/floor/plating)
- F.burn_tile()
- F.icon_state = "wall_thermite"
- user << "The thermite melts through the wall."
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
- spawn(100)
- if(O) qdel(O)
-// F.sd_LumReset() //TODO: ~Carn
- return
-
-/turf/simulated/wall/meteorhit(obj/M as obj)
- if (prob(15))
- dismantle_wall()
- else if(prob(70))
- ChangeTurf(/turf/simulated/floor/plating)
+ if(thermite >= 50)
+ var/turf/simulated/floor/F = ChangeTurf(/turf/simulated/floor/plating)
+ F.burn_tile()
+ F.icon_state = "wall_thermite"
+ F.add_hiddenprint(user)
+ spawn(max(100,300-thermite))
+ if(O) qdel(O)
else
- ReplaceWithLattice()
- return 0
\ No newline at end of file
+ thermite = 0
+ spawn(50)
+ if(O) qdel(O)
+ return
\ No newline at end of file
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index c26bc1e88c9..7f743f88f04 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -58,7 +58,7 @@
// if(ticker.mode.name == "nuclear emergency") return
if(A.z > 6) return
if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
- if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
+ if(istype(A, /obj/effect/meteor))
qdel(A)
return
@@ -135,7 +135,7 @@
var/list/y_arr
if(src.x <= 1)
- if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
+ if(istype(A, /obj/effect/meteor))
qdel(A)
return
@@ -210,7 +210,7 @@
A.loc.Entered(A)
else if (src.y >= world.maxy)
- if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
+ if(istype(A, /obj/effect/meteor))
qdel(A)
return
var/list/cur_pos = src.get_global_map_pos()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index d0150d440d2..0073ac1f40f 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -20,7 +20,6 @@
var/blocks_air = 0
var/icon_old = null
- var/pathweight = 1
flags = 0
@@ -271,8 +270,7 @@
/turf/proc/Distance(turf/t)
if(get_dist(src,t) == 1)
var/cost = (src.x - t.x) * (src.x - t.x) + (src.y - t.y) * (src.y - t.y)
- cost *= (pathweight+t.pathweight)/2
- return cost
+ return sqrt(cost)
else
return get_dist(src,t)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 23d91fbdbf2..49e7bcbd3a1 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -65,10 +65,10 @@
return
- viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
+ visible_message(pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
"\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
"\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
- "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.")
+ "\red [src] is holding \his breath! It looks like \he's trying to commit suicide."))
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 54209b4b4b4..384b2171c29 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -13,7 +13,9 @@ var/list/admin_verbs_default = list(
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
- /client/proc/reload_admins
+ /client/proc/reload_admins,
+ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
+ /client/proc/cmd_admin_pm_panel /*admin-pm list*/
)
var/list/admin_verbs_admin = list(
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
@@ -33,8 +35,6 @@ var/list/admin_verbs_admin = list(
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
- /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
- /client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm
index 5b5f926e4b1..7306af6e4ff 100644
--- a/code/modules/admin/create_object.dm
+++ b/code/modules/admin/create_object.dm
@@ -15,7 +15,7 @@
var/quick_create_object_html = null
var/pathtext = null
- pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/item/weapon","/obj/machinery")
+ pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/item/clothing","/obj/item/weapon/reagent_containers/food","/obj/item/weapon","/obj/machinery")
var path = text2path(pathtext)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index de8d3aad943..f9fcfb99bf8 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -157,7 +157,7 @@
if ((!( ticker ) || emergency_shuttle.location))
return
emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
+ priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null,'sound/AI/shuttlecalled.ogg', "Priority")
log_admin("[key_name(usr)] called the Emergency Shuttle")
message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
@@ -167,7 +167,7 @@
switch(emergency_shuttle.direction)
if(-1)
emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
+ priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlerecalled.ogg', "Priority")
log_admin("[key_name(usr)] called the Emergency Shuttle")
message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
if(1)
@@ -182,7 +182,7 @@
emergency_shuttle.settimeleft( input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", emergency_shuttle.timeleft() ) as num )
log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]")
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
+ priority_announce("The emergency shuttle will reach its destination in [round(emergency_shuttle.timeleft()/60)] minutes.", null, null, "Priority")
message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1)
href_list["secretsadmin"] = "check_antagonist"
@@ -1076,7 +1076,7 @@
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/observer = M
observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(observer), slot_w_uniform)
- observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(observer), slot_shoes)
+ observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), slot_shoes)
M.Paralyse(5)
sleep(5)
M.loc = pick(tdomeobserve)
@@ -1203,7 +1203,7 @@
show_player_panel(M)
else if(href_list["adminplayerobservejump"])
- if(!check_rights(R_ADMIN)) return
+ if(!isobserver(usr) && !check_rights(R_ADMIN)) return
var/mob/M = locate(href_list["adminplayerobservejump"])
@@ -1213,7 +1213,7 @@
C.jumptomob(M)
else if(href_list["adminplayerobservecoodjump"])
- if(!check_rights(R_ADMIN)) return
+ if(!isobserver(usr) && !check_rights(R_ADMIN)) return
var/x = text2num(href_list["X"])
var/y = text2num(href_list["Y"])
@@ -1372,7 +1372,7 @@
H << "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\""
else if(href_list["jumpto"])
- if(!check_rights(R_ADMIN)) return
+ if(!isobserver(usr) && !check_rights(R_ADMIN)) return
var/mob/M = locate(href_list["jumpto"])
usr.client.jumptomob(M)
@@ -1854,8 +1854,7 @@
if(W.z == 1 && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- command_alert("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.")
- world << sound('sound/AI/commandreport.ogg')
+ priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
if("guns")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","SG")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 69fb4233213..b15af9b48cc 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -662,7 +662,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(BPK, slot_back,1)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
var/obj/item/weapon/card/id/W = new(M)
W.assignment = "Assistant"
@@ -677,7 +677,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("standard space gear")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
@@ -692,7 +692,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
else
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
@@ -704,7 +704,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
@@ -716,7 +716,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("tournament chef") //Steven Seagal FTW
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
@@ -726,7 +726,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
var/obj/item/weapon/storage/backpack/backpack = new(M)
for(var/obj/item/I in backpack)
qdel(I)
@@ -749,7 +749,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("lasertag red")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/red(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/red(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/red(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/redtaghelm(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
@@ -760,7 +760,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("lasertag blue")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/blue(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/blue(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/blue(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/blue(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/bluetaghelm(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
@@ -771,14 +771,14 @@ var/global/list/g_fancy_list_of_safe_types = null
if ("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
if ("space pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
@@ -788,7 +788,7 @@ var/global/list/g_fancy_list_of_safe_types = null
/*
if ("soviet soldier")
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
*/
@@ -816,7 +816,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if("masked killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
@@ -834,12 +834,13 @@ var/global/list/g_fancy_list_of_safe_types = null
carried_item.add_blood(M)//Oh yes, there will be blood...
if("assassin")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ var/obj/item/clothing/under/U = new /obj/item/clothing/under/suit_jacket(M)
+ M.equip_to_slot_or_del(U, slot_w_uniform)
+ U.attachTie(new /obj/item/clothing/tie/waistcoat(M))
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/tie/waistcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
@@ -917,7 +918,7 @@ var/global/list/g_fancy_list_of_safe_types = null
*/
if("centcom official")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
@@ -989,7 +990,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
if("blue wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
@@ -1001,7 +1002,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("red wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
@@ -1013,7 +1014,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("marisa wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 6191f79fa22..643baf99c12 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -423,7 +423,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "Do you want to announce the contents of the report to the crew?", "Announce", "Yes", "No")
if(confirm == "Yes")
- command_alert(input);
+ priority_announce(input, null, 'sound/AI/commandreport.ogg');
for (var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
@@ -432,7 +432,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
else
- command_alert("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message");
+ priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg');
for (var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
@@ -441,7 +441,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
C.messagetitle.Add("Classified [command_name()] Update")
C.messagetext.Add(P.info)
- world << sound('sound/AI/commandreport.ogg')
log_admin("[key_name(src)] has created a command report: [input]")
message_admins("[key_name_admin(src)] has created a command report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -703,8 +702,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
+ priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority")
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-called the emergency shuttle.")
message_admins("\blue [key_name_admin(usr)] admin-called the emergency shuttle.", 1)
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
index 32fadf2eef7..16fcdb2f4b6 100644
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -40,7 +40,7 @@
if (usr.stat || usr.restrained()) return
if(src.reload < 180) return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- command_alert("Bluespace artillery fire detected. Brace for impact.")
+ priority_announce("Bluespace artillery fire detected. Brace for impact.")
message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1)
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
@@ -53,7 +53,7 @@
var/A
A = input("Area to jump bombard", "Open Fire", A) in teleportlocs
var/area/thearea = teleportlocs[A]
- command_alert("Bluespace artillery fire detected. Brace for impact.")
+ priority_announce("Bluespace artillery fire detected. Brace for impact.")
spawn(30)
var/list/L = list()
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 7d21b7bd80d..4810f26c8e6 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -161,7 +161,7 @@
name = "Chef"
corpseuniform = /obj/item/clothing/under/rank/chef
corpsesuit = /obj/item/clothing/suit/chef/classic
- corpseshoes = /obj/item/clothing/shoes/black
+ corpseshoes = /obj/item/clothing/shoes/sneakers/black
corpsehelmet = /obj/item/clothing/head/chefhat
corpseback = /obj/item/weapon/storage/backpack
corpseradio = /obj/item/device/radio/headset
@@ -177,7 +177,7 @@
corpsesuit = /obj/item/clothing/suit/labcoat
corpseback = /obj/item/weapon/storage/backpack/medic
corpsepocket1 = /obj/item/device/flashlight/pen
- corpseshoes = /obj/item/clothing/shoes/black
+ corpseshoes = /obj/item/clothing/shoes/sneakers/black
corpseid = 1
corpseidjob = "Medical Doctor"
corpseidaccess = "Medical Doctor"
@@ -187,7 +187,7 @@
corpseradio = /obj/item/device/radio/headset/headset_eng
corpseuniform = /obj/item/clothing/under/rank/engineer
corpseback = /obj/item/weapon/storage/backpack/industrial
- corpseshoes = /obj/item/clothing/shoes/orange
+ corpseshoes = /obj/item/clothing/shoes/sneakers/orange
corpsebelt = /obj/item/weapon/storage/belt/utility/full
corpsegloves = /obj/item/clothing/gloves/yellow
corpsehelmet = /obj/item/clothing/head/hardhat
@@ -218,7 +218,7 @@
corpseuniform = /obj/item/clothing/under/rank/scientist
corpsesuit = /obj/item/clothing/suit/labcoat/science
corpseback = /obj/item/weapon/storage/backpack
- corpseshoes = /obj/item/clothing/shoes/white
+ corpseshoes = /obj/item/clothing/shoes/sneakers/white
corpseid = 1
corpseidjob = "Scientist"
corpseidaccess = "Scientist"
@@ -228,7 +228,7 @@
corpseuniform = /obj/item/clothing/under/rank/miner
corpsegloves = /obj/item/clothing/gloves/black
corpseback = /obj/item/weapon/storage/backpack/industrial
- corpseshoes = /obj/item/clothing/shoes/black
+ corpseshoes = /obj/item/clothing/shoes/sneakers/black
corpseid = 1
corpseidjob = "Shaft Miner"
corpseidaccess = "Shaft Miner"
@@ -246,7 +246,7 @@
corpseradio = /obj/item/device/radio/headset/heads/hop
corpseuniform = /obj/item/clothing/under/rank/centcom_officer
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
- corpseshoes = /obj/item/clothing/shoes/black
+ corpseshoes = /obj/item/clothing/shoes/sneakers/black
corpseglasses = /obj/item/clothing/glasses/sunglasses
corpseid = 1
corpseidjob = "Bridge Officer"
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 2f4cdfb57ac..eeea744eb1b 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -47,7 +47,7 @@
name = "Safecode hint spawner"
/obj/effect/landmark/sc_bible_spawner/New()
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible/booze(src.loc)
+ var/obj/item/weapon/storage/book/bible/B = new /obj/item/weapon/storage/book/bible/booze(src.loc)
B.name = "The Holy book of the Geometer"
B.deity_name = "Narsie"
B.icon_state = "melted"
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index bd6eeafeead..b7a2e50ea42 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -82,6 +82,14 @@
holder.icon_state = "hudhealthy"
C.images += holder
+/obj/item/clothing/glasses/hud/health/night
+ name = "Night Vision Health Scanner HUD"
+ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ icon_state = "healthhudnight"
+ item_state = "glasses"
+ darkness_view = 8
+ invis_view = SEE_INVISIBLE_MINIMUM
+
/obj/item/clothing/glasses/hud/security
name = "Security HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
@@ -94,6 +102,12 @@
darkness_view = 1
flash_protect = 1
tint = 1
+/obj/item/clothing/glasses/hud/security/night
+ name = "Night Vision Security HUD"
+ desc = "An advanced heads-up display which provides id data and vision in complete darkness."
+ icon_state = "securityhudnight"
+ darkness_view = 8
+ invis_view = SEE_INVISIBLE_MINIMUM
/obj/item/clothing/glasses/hud/security/sunglasses/emp_act(severity)
if(emagged == 0)
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index 94827daf93c..e1ed80a3d65 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -1,4 +1,6 @@
-/obj/item/clothing/shoes/black
+/obj/item/clothing/shoes/sneakers
+
+/obj/item/clothing/shoes/sneakers/black
name = "black shoes"
icon_state = "black"
item_color = "black"
@@ -12,7 +14,7 @@
redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
-/obj/item/clothing/shoes/brown
+/obj/item/clothing/shoes/sneakers/brown
name = "brown shoes"
desc = "A pair of brown shoes."
icon_state = "brown"
@@ -31,55 +33,55 @@
cmo
item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
-/obj/item/clothing/shoes/blue
+/obj/item/clothing/shoes/sneakers/blue
name = "blue shoes"
icon_state = "blue"
item_color = "blue"
-/obj/item/clothing/shoes/green
+/obj/item/clothing/shoes/sneakers/green
name = "green shoes"
icon_state = "green"
item_color = "green"
-/obj/item/clothing/shoes/yellow
+/obj/item/clothing/shoes/sneakers/yellow
name = "yellow shoes"
icon_state = "yellow"
item_color = "yellow"
-/obj/item/clothing/shoes/purple
+/obj/item/clothing/shoes/sneakers/purple
name = "purple shoes"
icon_state = "purple"
item_color = "purple"
-/obj/item/clothing/shoes/brown
+/obj/item/clothing/shoes/sneakers/brown
name = "brown shoes"
icon_state = "brown"
item_color = "brown"
-/obj/item/clothing/shoes/red
+/obj/item/clothing/shoes/sneakers/red
name = "red shoes"
desc = "Stylish red shoes."
icon_state = "red"
item_color = "red"
-/obj/item/clothing/shoes/white
+/obj/item/clothing/shoes/sneakers/white
name = "white shoes"
icon_state = "white"
permeability_coefficient = 0.01
item_color = "white"
-/obj/item/clothing/shoes/rainbow
+/obj/item/clothing/shoes/sneakers/rainbow
name = "rainbow shoes"
desc = "Very gay shoes."
icon_state = "rain_bow"
item_color = "rainbow"
-/obj/item/clothing/shoes/orange
+/obj/item/clothing/shoes/sneakers/orange
name = "orange shoes"
icon_state = "orange"
item_color = "orange"
-/obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
+/obj/item/clothing/shoes/sneakers/orange/attack_self(mob/user as mob)
if (src.chained)
src.chained = null
src.slowdown = SHOES_SLOWDOWN
@@ -87,7 +89,7 @@
src.icon_state = "orange"
return
-/obj/item/clothing/shoes/orange/attackby(H as obj, loc)
+/obj/item/clothing/shoes/sneakers/orange/attackby(H as obj, loc)
..()
if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained )))
//H = null
@@ -98,7 +100,7 @@
src.icon_state = "orange1"
return
-/obj/item/clothing/shoes/orange/attack_hand(mob/user)
+/obj/item/clothing/shoes/sneakers/orange/attack_hand(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/C = user
if(C.shoes == src && src.chained == 1)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index dfccd9144bc..0638f943209 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -7,7 +7,7 @@
flags = NOSLIP
origin_tech = "syndicate=3"
-/obj/item/clothing/shoes/mime
+/obj/item/clothing/shoes/sneakers/mime
name = "mime shoes"
icon_state = "mime"
item_color = "mime"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index bb12a94f227..b8eeb858a6b 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -29,7 +29,7 @@
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
//Chaplain
/obj/item/clothing/suit/nun
@@ -39,7 +39,7 @@
item_state = "nun"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
flags_inv = HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
//Chef
/obj/item/clothing/suit/chef
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index d8e5aa92500..3209ec49b64 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -120,7 +120,7 @@
item_state = "imperium_monk"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
/obj/item/clothing/suit/chickensuit
@@ -148,7 +148,7 @@
item_state = "w_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index f4e54da38fd..8fa492d81b6 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -7,87 +7,88 @@
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
+ var/malfunctioning = 0
- New()
- ..()
- for(var/U in typesof(/obj/item/clothing/under/color)-(/obj/item/clothing/under/color))
- var/obj/item/clothing/under/V = new U
- src.clothing_choices += V
+/obj/item/clothing/under/chameleon/New()
+ ..()
+ for(var/U in typesof(/obj/item/clothing/under/color)-(/obj/item/clothing/under/color))
+ var/obj/item/clothing/under/V = new U
+ src.clothing_choices += V
- for(var/U in typesof(/obj/item/clothing/under/rank)-(/obj/item/clothing/under/rank))
- var/obj/item/clothing/under/V = new U
- src.clothing_choices += V
+ for(var/U in typesof(/obj/item/clothing/under/rank)-(/obj/item/clothing/under/rank))
+ var/obj/item/clothing/under/V = new U
+ src.clothing_choices += V
+ return
+
+
+/obj/item/clothing/under/chameleon/attackby(obj/item/clothing/under/U as obj, mob/user as mob)
+ ..()
+ if(istype(U, /obj/item/clothing/under/chameleon))
+ user << "\Nothing happens."
return
-
-
- attackby(obj/item/clothing/under/U as obj, mob/user as mob)
- ..()
- if(istype(U, /obj/item/clothing/under/chameleon))
- user << "\red Nothing happens."
+ if(istype(U, /obj/item/clothing/under))
+ if(src.clothing_choices.Find(U))
+ user << "Pattern is already recognised by the suit."
return
- if(istype(U, /obj/item/clothing/under))
- if(src.clothing_choices.Find(U))
- user << "\red Pattern is already recognised by the suit."
- return
- src.clothing_choices += U
- user << "\red Pattern absorbed by the suit."
+ src.clothing_choices += U
+ user << "Pattern absorbed by the suit."
- emp_act(severity)
- name = "psychedelic"
- desc = "Groovy!"
- icon_state = "psyche"
- item_color = "psyche"
+/obj/item/clothing/under/chameleon/emp_act(severity)
+ name = "psychedelic"
+ desc = "Groovy!"
+ icon_state = "psyche"
+ item_color = "psyche"
+ malfunctioning = 1
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_w_uniform()
+ M << "Your jumpsuit malfunctions!"
+ spawn(200)
+ name = "Black Jumpsuit"
+ icon_state = "black"
+ item_state = "bl_suit"
+ item_color = "black"
+ malfunctioning = 0
if(ismob(loc))
var/mob/M = loc
M.update_inv_w_uniform()
- M << "Your jumpsuit malfunctions!"
- spawn(200)
- name = "Black Jumpsuit"
- icon_state = "black"
- item_state = "bl_suit"
- item_color = "black"
- desc = null
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_w_uniform()
- M << "Your jumpsuit is functioning normally again."
- ..()
+ M << "Your jumpsuit is functioning normally again."
+ ..()
- verb/change()
- set name = "Change Color"
- set category = "Object"
- set src in usr
+/obj/item/clothing/under/chameleon/verb/change()
+ set name = "Change Color"
+ set category = "Object"
+ set src in usr
- var/obj/item/clothing/under/A
- A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices
- if(!A)
- return
+ var/obj/item/clothing/under/A
+ A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices
+ if(!A)
+ return
- if(usr.stat != CONSCIOUS)
- return
+ if(usr.stat != CONSCIOUS)
+ return
- if(icon_state == "psyche")
- usr << "\red Your suit is malfunctioning"
- return
+ if(malfunctioning)
+ usr << "Your jumpsuit is malfunctioning!"
+ return
- desc = null
- permeability_coefficient = 0.90
+ desc = null
+ permeability_coefficient = 0.90
- desc = A.desc
- name = A.name
- icon_state = A.icon_state
- item_state = A.item_state
- item_color = A.item_color
- usr.update_inv_w_uniform() //so our overlays update.
+ desc = A.desc
+ name = A.name
+ icon_state = A.icon_state
+ item_state = A.item_state
+ item_color = A.item_color
+ usr.update_inv_w_uniform() //so our overlays update.
/obj/item/clothing/under/chameleon/all/New()
..()
- var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all)
- //to prevent an infinite loop
+ var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) //to prevent an infinite loop
for(var/U in typesof(/obj/item/clothing/under)-blocked)
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index d07e8f27792..b55cd7c845e 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -63,80 +63,80 @@
item_state = "y_suit"
item_color = "yellow"
-/obj/item/clothing/under/psyche
+/obj/item/clothing/under/color/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_color = "psyche"
-/obj/item/clothing/under/lightblue
+/obj/item/clothing/under/color/lightblue
name = "lightblue jumpsuit"
desc = "lightblue"
icon_state = "lightblue"
item_color = "lightblue"
-/obj/item/clothing/under/aqua
+/obj/item/clothing/under/color/aqua
name = "aqua jumpsuit"
desc = "aqua"
icon_state = "aqua"
item_color = "aqua"
-/obj/item/clothing/under/purple
+/obj/item/clothing/under/color/purple
name = "purple jumpsuit"
desc = "purple"
icon_state = "purple"
item_state = "p_suit"
item_color = "purple"
-/obj/item/clothing/under/lightpurple
+/obj/item/clothing/under/color/lightpurple
name = "lightpurple jumpsuit"
desc = "lightpurple"
icon_state = "lightpurple"
item_color = "lightpurple"
-/obj/item/clothing/under/lightgreen
+/obj/item/clothing/under/color/lightgreen
name = "lightgreen jumpsuit"
desc = "lightgreen"
icon_state = "lightgreen"
item_color = "lightgreen"
-/obj/item/clothing/under/lightblue
+/obj/item/clothing/under/color/lightblue
name = "lightblue jumpsuit"
desc = "lightblue"
icon_state = "lightblue"
item_color = "lightblue"
-/obj/item/clothing/under/lightbrown
+/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
desc = "lightbrown"
icon_state = "lightbrown"
item_color = "lightbrown"
-/obj/item/clothing/under/brown
+/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
desc = "brown"
icon_state = "brown"
item_color = "brown"
-/obj/item/clothing/under/yellowgreen
+/obj/item/clothing/under/color/yellowgreen
name = "yellowgreen jumpsuit"
desc = "yellowgreen"
icon_state = "yellowgreen"
item_color = "yellowgreen"
-/obj/item/clothing/under/darkblue
+/obj/item/clothing/under/color/darkblue
name = "darkblue jumpsuit"
desc = "darkblue"
icon_state = "darkblue"
item_color = "darkblue"
-/obj/item/clothing/under/lightred
+/obj/item/clothing/under/color/lightred
name = "lightred jumpsuit"
desc = "lightred"
icon_state = "lightred"
item_color = "lightred"
-/obj/item/clothing/under/darkred
+/obj/item/clothing/under/color/darkred
name = "darkred jumpsuit"
desc = "darkred"
icon_state = "darkred"
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 7e2240a0df5..c4c82a9cf45 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -22,8 +22,7 @@
/datum/round_event/alien_infestation/announce()
if(successSpawn)
- command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
- world << sound('sound/AI/aliens.ogg')
+ priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/AI/aliens.ogg')
/datum/round_event/alien_infestation/start()
diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm
index f1f3cc44185..654c227e810 100644
--- a/code/modules/events/anomaly.dm
+++ b/code/modules/events/anomaly.dm
@@ -22,7 +22,7 @@
setup(safety_loop)
/datum/round_event/anomaly/announce()
- command_alert("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
+ priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 8adc6d88713..256a4322c81 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -11,7 +11,7 @@
/datum/round_event/anomaly/anomaly_bluespace/announce()
- command_alert("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/anomaly_bluespace/start()
@@ -40,7 +40,7 @@
var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
- command_alert("Massive bluespace translocation detected.", "Anomaly Alert")
+ priority_announce("Massive bluespace translocation detected.", "Anomaly Alert")
var/list/flashers = list()
for(var/mob/living/carbon/human/M in viewers(TO, null))
diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm
index 2c84d7fc70b..dc7e9d4b219 100644
--- a/code/modules/events/anomaly_flux.dm
+++ b/code/modules/events/anomaly_flux.dm
@@ -11,7 +11,7 @@
/datum/round_event/anomaly/anomaly_flux/announce()
- command_alert("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/anomaly_flux/start()
diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm
index 9d7ada2d60d..69d38c62231 100644
--- a/code/modules/events/anomaly_grav.dm
+++ b/code/modules/events/anomaly_grav.dm
@@ -11,7 +11,7 @@
/datum/round_event/anomaly/anomaly_grav/announce()
- command_alert("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/anomaly_grav/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index 270ebed2aed..49600a58136 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -11,7 +11,7 @@
/datum/round_event/anomaly/anomaly_pyro/announce()
- command_alert("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ priority_announce("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/anomaly_pyro/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm
index b97310c4ece..993bec48862 100644
--- a/code/modules/events/anomaly_vortex.dm
+++ b/code/modules/events/anomaly_vortex.dm
@@ -11,7 +11,7 @@
/datum/round_event/anomaly/anomaly_vortex/announce()
- command_alert("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
+ priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
/datum/round_event/anomaly/anomaly_vortex/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index e4846922a30..368172ebecd 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -14,8 +14,7 @@
/datum/round_event/blob/announce()
- command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- world << sound('sound/AI/outbreak5.ogg')
+ priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
/datum/round_event/blob/start()
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index d90b575acfc..1c63424387c 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -21,7 +21,7 @@
/datum/round_event/brand_intelligence/announce()
- command_alert("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
+ priority_announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
/datum/round_event/brand_intelligence/start()
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index d4ec0097553..4820806be23 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -13,7 +13,7 @@
startWhen = rand(40, 60)
/datum/round_event/carp_migration/announce()
- command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
+ priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
/datum/round_event/carp_migration/start()
diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm
index 37cc583a468..353b92a78b8 100644
--- a/code/modules/events/communications_blackout.dm
+++ b/code/modules/events/communications_blackout.dm
@@ -17,7 +17,7 @@
A << "
"
if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts.
- command_alert(alert)
+ priority_announce(alert)
/datum/round_event/communications_blackout/start()
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 8a33611d24f..142e58fa0f6 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -11,8 +11,7 @@
/datum/round_event/disease_outbreak/announce()
- command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- world << sound('sound/AI/outbreak7.ogg')
+ priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak7.ogg')
/datum/round_event/disease_outbreak/setup()
announceWhen = rand(15, 30)
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index cde70335756..d24b6cab401 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -1,108 +1,19 @@
-/datum/round_event_control/dust
+/datum/round_event_control/meteor_wave/dust
name = "Minor Space Dust"
- typepath = /datum/round_event/dust
- weight = 600
- max_occurrences = 10000
+ typepath = /datum/round_event/meteor_wave/dust
+ weight = 300
+ max_occurrences = 1000
earliest_start = 0
-/datum/round_event/dust
- var/qnty = 1
+/datum/round_event/meteor_wave/dust
+ startWhen = 1
+ endWhen = 2
-/datum/round_event/dust/setup()
- qnty = rand(1,5)
+/datum/round_event/meteor_wave/dust/announce()
+ return
-/datum/round_event/dust/start()
- while(qnty-- > 0)
- new /obj/effect/space_dust/weak()
+/datum/round_event/meteor_wave/dust/start()
+ spawn_meteors(1, meteorsC)
-
-/obj/effect/space_dust
- name = "Space Dust"
- desc = "Dust in space."
- icon = 'icons/obj/meteor.dmi'
- icon_state = "space_dust"
- density = 1
- anchored = 1
- var/strength = 2 //ex_act severity number
- var/life = 2 //how many things we hit before qdel(src)
-
- weak
- strength = 3
- life = 1
-
- strong
- strength = 1
- life = 6
-
- super
- strength = 1
- life = 40
-
-
- New()
- var/startx = 0
- var/starty = 0
- var/endy = 0
- var/endx = 0
- var/startside = pick(cardinal)
-
- switch(startside)
- if(NORTH)
- starty = world.maxy-(TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
- endy = TRANSITIONEDGE
- endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
- if(EAST)
- starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
- startx = world.maxx-(TRANSITIONEDGE+1)
- endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
- endx = TRANSITIONEDGE
- if(SOUTH)
- starty = (TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
- endy = world.maxy-TRANSITIONEDGE
- endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
- if(WEST)
- starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
- startx = (TRANSITIONEDGE+1)
- endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
- endx = world.maxx-TRANSITIONEDGE
- var/goal = locate(endx, endy, 1)
- src.x = startx
- src.y = starty
- src.z = 1
- spawn(0)
- walk_towards(src, goal, 1)
- return
-
-
- Bump(atom/A)
- spawn(0)
- if(prob(50))
- for(var/mob/M in range(10, src))
- if(!M.stat && !istype(M, /mob/living/silicon/ai))
- shake_camera(M, 3, 1)
- if (A)
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
-
- if(ismob(A))
- A.meteorhit(src)//This should work for now I guess
- else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field/generator)) //Protect the singularity from getting released every round!
- A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4
-
- life--
- if(life <= 0)
- walk(src,0)
- qdel(src)
- return 0
- return
-
-
- Bumped(atom/A)
- Bump(A)
- return
-
-
- ex_act(severity)
- qdel(src)
- return
+/datum/round_event/meteor_wave/dust/tick()
+ return
\ No newline at end of file
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index dae41caea66..51fa161ef23 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -10,7 +10,7 @@
/datum/round_event/electrical_storm/announce()
- command_alert("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
+ priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
/datum/round_event/electrical_storm/start()
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 56b5458ca8f..67536e1dec7 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -14,4 +14,4 @@
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
/datum/round_event/spooky/announce()
- command_alert(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
\ No newline at end of file
+ priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
\ No newline at end of file
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index a5fd2bad884..d7021e0e12d 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -35,7 +35,7 @@
Monitor.icon_state = "entertainment_xmas"
/datum/round_event/presents/announce()
- command_alert("Ho Ho Ho, Merry Xmas!", "Unknown Transmission")
+ priority_announce("Ho Ho Ho, Merry Xmas!", "Unknown Transmission")
/obj/item/weapon/toy/xmas_cracker
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index c418e498812..763febdc75a 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -16,7 +16,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
announceWhen = 5
/datum/round_event/immovable_rod/announce()
- command_alert("What the fuck was that?!", "General Alert")
+ priority_announce("What the fuck was that?!", "General Alert")
/datum/round_event/immovable_rod/start()
var/startx = 0
@@ -62,36 +62,38 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/z_original = 0
var/destination
- New(atom/start, atom/end)
- loc = start
- z_original = z
- destination = end
- if(end && end.z==z_original)
- walk_towards(src, destination, 1)
+/obj/effect/immovablerod/New(atom/start, atom/end)
+ loc = start
+ z_original = z
+ destination = end
+ if(end && end.z==z_original)
+ walk_towards(src, destination, 1)
- Move()
- if(z != z_original || loc == destination)
+/obj/effect/immovablerod/Move()
+ if(z != z_original || loc == destination)
+ qdel(src)
+ return ..()
+
+/obj/effect/immovablerod/Bump(atom/clong)
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ for (var/mob/O in hearers(src, null))
+ O.show_message("CLANG", 2)
+
+ if(istype(clong, /turf/unsimulated) || istype(clong, /turf/simulated/shuttle)) //Unstoppable force meets immovable object
+ explosion(src.loc, 4, 5, 6, 7, 0)
+ if(src)
qdel(src)
- return ..()
+ return
- Bump(atom/clong)
- if (istype(clong, /turf) && !istype(clong, /turf/unsimulated))
- if(clong.density)
- clong.ex_act(2)
- for (var/mob/O in hearers(src, null))
- O.show_message("CLANG", 2)
+ if(clong && prob(25))
+ src.loc = clong.loc
- else if (istype(clong, /obj))
- if(clong.density)
- clong.ex_act(2)
- for (var/mob/O in hearers(src, null))
- O.show_message("CLANG", 2)
+ if (istype(clong, /turf) || istype(clong, /obj))
+ if(clong.density)
+ clong.ex_act(2)
- else if (istype(clong, /mob))
- if(clong.density || prob(10))
- clong.meteorhit(src)
- else
- qdel(src)
-
- if(clong && prob(25))
- src.loc = clong.loc
+ else if (istype(clong, /mob))
+ if(clong.density || prob(10))
+ clong.ex_act(2)
+ else
+ qdel(src)
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index af4dbb2c68b..659ff0c3168 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -21,8 +21,7 @@
/datum/round_event/ion_storm/announce()
if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)))
- command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
- world << sound('sound/AI/ionstorm.ogg')
+ priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
/datum/round_event/ion_storm/start()
diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm
new file mode 100644
index 00000000000..b45140ad5ee
--- /dev/null
+++ b/code/modules/events/meateor_wave.dm
@@ -0,0 +1,12 @@
+/datum/round_event_control/meteor_wave/meaty
+ name = "Meaty Ore Wave"
+ typepath = /datum/round_event/meteor_wave/meaty
+ weight = 1
+ max_occurrences = 1
+
+/datum/round_event/meteor_wave/meaty/announce()
+ priority_announce("Meaty ores have been detected on collision course with the station.", "Oh Crap, Get The Mop.",'sound/AI/meteors.ogg')
+
+/datum/round_event/meteor_wave/meaty/tick()
+ if(IsMultiple(activeFor, 3))
+ spawn_meteors(5, meteorsB) //meteor list types defined in gamemode/meteor/meteors.dm
\ No newline at end of file
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 8357f36834d..e9e950f6c37 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -9,10 +9,9 @@
endWhen = 66
/datum/round_event/meteor_wave/announce()
- command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
- world << sound('sound/AI/meteors.ogg')
+ priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg')
/datum/round_event/meteor_wave/tick()
if(IsMultiple(activeFor, 3))
- spawn_meteors(5)
\ No newline at end of file
+ spawn_meteors(5, meteorsA) //meteor list types defined in gamemode/meteor/meteors.dm
diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm
index 0e26fc11d69..722b75d40bf 100644
--- a/code/modules/events/ninja.dm
+++ b/code/modules/events/ninja.dm
@@ -2740,11 +2740,6 @@ It is possible to destroy the net by the occupant or someone else.
healthcheck()
return
- meteorhit()
- health-=50
- healthcheck()
- return
-
hitby(AM as mob|obj)
..()
for(var/mob/O in viewers(src, null))
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index 99495fbc36e..878a22a0050 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -20,7 +20,7 @@
/datum/round_event/prison_break/announce()
if(prisonAreas && prisonAreas.len > 0)
- command_alert("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
+ priority_announce("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
else
world.log << "ERROR: Could not initate grey-tide. Unable find prison or brig area."
kill()
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 065fde0e00f..8053cea32db 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -12,8 +12,8 @@
endWhen = startWhen + 5
/datum/round_event/radiation_storm/announce()
- command_alert("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert")
- world << sound('sound/AI/radiation.ogg') //sound not longer matches the text, but an audible warning is probably good
+ priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/AI/radiation.ogg')
+ //sound not longer matches the text, but an audible warning is probably good
/datum/round_event/radiation_storm/start()
@@ -52,4 +52,4 @@
/datum/round_event/radiation_storm/end()
- command_alert("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
\ No newline at end of file
+ priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
\ No newline at end of file
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index ef47bc8df91..d785caa4292 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -23,18 +23,18 @@
supply_shuttle.shuttle_loan = src
switch(dispatch_type)
if(HIJACK_SYNDIE)
- command_alert("The syndicate are trying to infiltrate your station. If you let them hijack your shuttle, you'll save us a headache.","Centcom Counter Intelligence")
+ priority_announce("The syndicate are trying to infiltrate your station. If you let them hijack your shuttle, you'll save us a headache.","Centcom Counter Intelligence")
if(RUSKY_PARTY)
- command_alert("A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program")
+ priority_announce("A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program")
if(SPIDER_GIFT)
- command_alert("The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps")
+ priority_announce("The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps")
if(DEPARTMENT_RESUPPLY)
- command_alert("Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department")
+ priority_announce("Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department")
thanks_msg = "The shuttle will be returned in 5 minutes."
bonus_points = 0
/datum/round_event/shuttle_loan/proc/loan_shuttle()
- command_alert(thanks_msg, "Cargo shuttle commandeered by Centcom.")
+ priority_announce(thanks_msg, "Cargo shuttle commandeered by Centcom.")
dispatched = 1
supply_shuttle.points += bonus_points
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 994fe6cbac8..8bfb56e49f8 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -15,8 +15,7 @@
spawncount = rand(5, 8)
/datum/round_event/spider_infestation/announce()
- command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
- world << sound('sound/AI/aliens.ogg')
+ priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/AI/aliens.ogg')
/datum/round_event/spider_infestation/start()
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 51e62dd24f1..f202148ca29 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -11,7 +11,7 @@
var/list/vents = list()
/datum/round_event/vent_clog/announce()
- command_alert("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
+ priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
/datum/round_event/vent_clog/setup()
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 04b9898e9fb..b373671d5d1 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -28,10 +28,7 @@
wormholes += new /obj/effect/portal/wormhole(T, null, null, -1)
/datum/round_event/wormholes/announce()
- command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
- for(var/mob/M in player_list)
- if(!istype(M, /mob/new_player))
- M << sound('sound/AI/spanomalies.ogg')
+ priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/AI/spanomalies.ogg')
/datum/round_event/wormholes/tick()
if(activeFor % shift_frequency == 0)
diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm
index ec362e8bcb5..654ef72d22b 100644
--- a/code/modules/food/recipes_microwave.dm
+++ b/code/modules/food/recipes_microwave.dm
@@ -438,20 +438,13 @@
/obj/item/weapon/paper,
)
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
- make_food(var/obj/container as obj)
- var/obj/item/weapon/paper/paper = locate() in container
- paper.loc = null //prevent deletion
- var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container)
- paper.loc = being_cooked
- being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn
- return being_cooked
- check_items(var/obj/container as obj)
- . = ..()
- if (.)
- var/obj/item/weapon/paper/paper = locate() in container
- if (!paper.info)
- return 0
- return .
+/datum/recipe/fortunecookie/make_food(var/obj/container as obj)
+ var/obj/item/weapon/paper/paper = locate() in container
+ paper.loc = null //prevent deletion
+ var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container)
+ paper.loc = being_cooked
+ being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn
+ return being_cooked
/datum/recipe/meatsteak
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index b6730a62995..242ad96511d 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -223,30 +223,24 @@
if("rh")
if (check_cost(25/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
- if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
+ if("ez5")
if (check_cost(50/efficiency)) return 0
else
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
if("l4z5")
if (check_cost(100/efficiency)) return 0
else
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
if("rh5")
if (check_cost(125/efficiency)) return 0
else
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
if("wallet")
if (check_cost(100/efficiency)) return 0
else new/obj/item/weapon/storage/wallet(src.loc)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 5332fa4f892..314eae82c37 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -52,9 +52,9 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
-
- New(var/loc, var/potency = 10)
- ..()
+
+/obj/item/weapon/grown/log/New(var/loc, var/potency = 10)
+ ..()
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
@@ -98,9 +98,9 @@
throw_range = 3
plant_type = 0
seed = "/obj/item/seeds/sunflowerseed"
-
- New(var/loc, var/potency = 10)
- ..()
+
+/obj/item/weapon/grown/sunflower/New(var/loc, var/potency = 10)
+ ..()
/obj/item/weapon/grown/novaflower
name = "novaflower"
@@ -117,12 +117,12 @@
plant_type = 0
seed = "/obj/item/seeds/novaflowerseed"
attack_verb = list("seared", "heated", "whacked", "steamed")
- New(var/loc, var/potency = 10)
- ..()
- if(reagents)
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("capsaicin", round(potency, 1))
- force = round((5+potency/5), 1)
+/obj/item/weapon/grown/novaflower/New(var/loc, var/potency = 10)
+ ..()
+ if(reagents)
+ reagents.add_reagent("nutriment", 1)
+ reagents.add_reagent("capsaicin", round(potency, 1))
+ force = round((5+potency/5), 1)
/obj/item/weapon/grown/nettle // -- Skie
desc = "It's probably not wise to touch it with bare hands..."
@@ -139,12 +139,12 @@
plant_type = 1
origin_tech = "combat=1"
seed = "/obj/item/seeds/nettleseed"
- New(var/loc, var/potency = 10)
- ..()
- if(reagents)
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("sacid", round(potency, 1))
- force = round((5+potency/5), 1)
+/obj/item/weapon/grown/nettle/New(var/loc, var/potency = 10)
+ ..()
+ if(reagents)
+ reagents.add_reagent("nutriment", 1)
+ reagents.add_reagent("sacid", round(potency, 1))
+ force = round((5+potency/5), 1)
/obj/item/weapon/grown/deathnettle // -- Skie
desc = "The \red glowing \black nettle incites \red rage\black in you just from looking at it!"
@@ -162,16 +162,16 @@
seed = "/obj/item/seeds/deathnettleseed"
origin_tech = "combat=3"
attack_verb = list("stung")
- New(var/loc, var/potency = 10)
- ..()
- if(reagents)
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("pacid", round(potency, 1))
- force = round((5+potency/2.5), 1)
+/obj/item/weapon/grown/deathnettle/New(var/loc, var/potency = 10)
+ ..()
+ if(reagents)
+ reagents.add_reagent("nutriment", 1)
+ reagents.add_reagent("pacid", round(potency, 1))
+ force = round((5+potency/2.5), 1)
- suicide_act(mob/user)
- viewers(user) << "[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide."
- return (BRUTELOSS|TOXLOSS)
+/obj/item/weapon/grown/deathnettle/suicide_act(mob/user)
+ user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS|TOXLOSS)
/obj/item/weapon/grown/bananapeel
name = "banana peel"
@@ -183,8 +183,8 @@
throwforce = 0
throw_speed = 3
throw_range = 7
- New(var/loc, var/potency = 10)
- ..()
+/obj/item/weapon/grown/bananapeel/New(var/loc, var/potency = 10)
+ ..()
/obj/item/weapon/grown/corncob
name = "corn cob"
@@ -196,5 +196,5 @@
throwforce = 0
throw_speed = 3
throw_range = 7
- New(var/loc, var/potency = 10)
- ..()
+/obj/item/weapon/grown/corncob/New(var/loc, var/potency = 10)
+ ..()
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 8334d7f015a..ad113e110ba 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -7,8 +7,8 @@
item_state = "analyzer"
origin_tech = "magnets=1;biotech=1"
- attack_self(mob/user as mob)
- return 0
+/obj/item/device/analyzer/plant_analyzer/attack_self(mob/user as mob)
+ return 0
// *************************************
// Hydroponics Tools
@@ -28,13 +28,13 @@
throw_speed = 3
throw_range = 10
- New()
- ..()
- reagents.add_reagent("weedkiller", 100)
+/obj/item/weapon/reagent_containers/spray/weedspray/New()
+ ..()
+ reagents.add_reagent("weedkiller", 100)
- suicide_act(mob/user)
- viewers(user) << "[user] is huffing the [src.name]! It looks like \he's trying to commit suicide."
- return (TOXLOSS)
+/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
+ user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.")
+ return (TOXLOSS)
/obj/item/weapon/reagent_containers/spray/pestspray // -- Skie
desc = "It's some pest eliminator spray! Do not inhale!"
@@ -50,13 +50,13 @@
throw_speed = 3
throw_range = 10
- New()
- ..()
- reagents.add_reagent("pestkiller", 100)
+/obj/item/weapon/reagent_containers/spray/pestspray/New()
+ ..()
+ reagents.add_reagent("pestkiller", 100)
- suicide_act(mob/user)
- viewers(user) << "[user] is huffing the [src.name]! It looks like \he's trying to commit suicide."
- return (TOXLOSS)
+/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
+ viewers(user) << "[user] is huffing the [src.name]! It looks like \he's trying to commit suicide."
+ return (TOXLOSS)
/obj/item/weapon/minihoe // -- Numbers
name = "mini hoe"
@@ -78,38 +78,43 @@
/obj/item/weapon/reagent_containers/glass/bottle/nutrient
-
name = "bottle of nutrient"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
+ volume = 50
w_class = 1.0
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(1,2,5,10,15,25,50)
- New()
- ..()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
+ ..()
+ src.pixel_x = rand(-5.0, 5)
+ src.pixel_y = rand(-5.0, 5)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez
name = "bottle of E-Z-Nutrient"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
- New()
- ..()
- reagents.add_reagent("eznutriment", 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
+ ..()
+ reagents.add_reagent("eznutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
name = "bottle of Left 4 Zed"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
- New()
- ..()
- reagents.add_reagent("left4zednutriment", 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
+ ..()
+ reagents.add_reagent("left4zednutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
name = "bottle of Robust Harvest"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
- New()
- ..()
- reagents.add_reagent("robustharvestnutriment", 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
+ ..()
+ reagents.add_reagent("robustharvestnutriment", 50)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 03df5c1fae9..64dc1e5da8e 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -179,22 +179,10 @@
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
var/title //The real name of the book.
- var/carved = 0 //Has the book been hollowed out for use as a secret storage item?
- var/obj/item/store //What's in the book?
var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width
/obj/item/weapon/book/attack_self(mob/user)
- if(carved)
- if(store)
- user << "[store] falls out of [title]!"
- store.loc = get_turf(loc)
- store = null
- return
- else
- user << "The pages of [title] have been cut out!"
- return
-
if(is_blind(user))
return
@@ -207,23 +195,6 @@
/obj/item/weapon/book/attackby(obj/item/I, mob/user)
- if(carved)
- if(!store)
- if(I.w_class < 3)
- if(!user.drop_item())
- user << "\The [I] is stuck to your hand, you cannot put it in [title]!"
- return
- I.loc = src
- store = I
- user << "You put [I] in [title]."
- return
- else
- user << "[I] won't fit in [title]."
- return
- else
- user << "There's already something in [title]!"
- return
-
if(istype(I, /obj/item/weapon/pen))
if(is_blind(user))
return
@@ -288,13 +259,21 @@
user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters))
- if(carved)
- return
user << "You begin to carve out [title]."
if(do_after(user, 30))
user << "You carve out the pages from [title]! You didn't want to read it anyway."
- carved = 1
- return
+ var/obj/item/weapon/storage/book/B = new
+ B.name = src.name
+ B.title = src.title
+ if(user.l_hand == src || user.r_hand == src)
+ qdel(src)
+ user.put_in_hands(B)
+ return
+ else
+ B.loc = src.loc
+ qdel(src)
+ return
+ return
else
..()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index e0e3b36e19f..61abae5d23a 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -280,7 +280,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if("6")
if(!bibledelay)
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(src.loc)
+ var/obj/item/weapon/storage/book/bible/B = new /obj/item/weapon/storage/book/bible(src.loc)
if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) )
B.icon_state = ticker.Bible_icon_state
B.item_state = ticker.Bible_item_state
diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm
index 06ced5db488..07416fef985 100644
--- a/code/modules/mining/mine_areas.dm
+++ b/code/modules/mining/mine_areas.dm
@@ -14,6 +14,7 @@
power_environ = 0
power_equip = 0
power_light = 0
+ ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/unexplored
name = "Mine"
@@ -25,6 +26,7 @@
power_environ = 0
power_equip = 0
power_light = 0
+ ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/lobby
name = "Mining station"
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 85997e8ff8a..85d2a2278b1 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -29,7 +29,7 @@
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/under/rank/miner(src)
new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/device/mining_scanner(src)
new /obj/item/weapon/storage/bag/ore(src)
new /obj/item/device/flashlight/lantern(src)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index f3bd6e95c7c..ebe2a488d4f 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -94,25 +94,11 @@
if(shielded)
damage /= 4
-
show_message("\red The blob attacks!")
-
adjustFireLoss(damage)
-
return
-/mob/living/carbon/alien/humanoid/meteorhit(O as obj)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message(text("\red [] has been hit by []", src, O), 1)
- if (health > 0)
- adjustFireLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
- adjustFireLoss(30)
-
- updatehealth()
- return
-
/mob/living/carbon/alien/humanoid/attack_paw(mob/living/carbon/monkey/M as mob)
if(!ismonkey(M)) return//Fix for aliens receiving double messages when attacking other aliens.
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 2e2c464a30c..12b3713d6df 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -113,17 +113,6 @@
/mob/living/carbon/alien/larva/attack_ui(slot_id)
return
-/mob/living/carbon/alien/larva/meteorhit(O as obj)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message(text("\red [] has been hit by []", src, O), 1)
- if (health > 0)
- adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
- adjustFireLoss(30)
-
- updatehealth()
- return
-
/mob/living/carbon/alien/larva/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]")
@@ -136,7 +125,6 @@
updatehealth()
-
/mob/living/carbon/alien/larva/attack_paw(mob/living/carbon/monkey/M as mob)
if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 50a03307add..23cb9f43723 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -204,22 +204,6 @@
apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee"))
return
-/mob/living/carbon/human/meteorhit(O as obj)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red [src] has been hit by [O]", 1)
- if (health > 0)
- var/obj/item/organ/limb/affecting = get_organ(pick("chest", "chest", "chest", "head"))
- if(!affecting) return
- if (istype(O, /obj/effect/immovablerod))
- if(affecting.take_damage(101, 0))
- update_damage_overlays(0)
- else
- if(affecting.take_damage((istype(O, /obj/effect/meteor/small) ? 10 : 25), 30))
- update_damage_overlays(0)
- updatehealth()
- return
-
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 2760cf10c08..52ee1282aa9 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -30,7 +30,7 @@
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
//Can we act
- if(restrained()) return 0
+ if(!canmove) return 0
//Do we have a working jetpack
if(istype(back, /obj/item/weapon/tank/jetpack))
@@ -38,10 +38,12 @@
if(((!check_drift) || (check_drift && J.stabilization_on)) && (!lying) && (J.allow_thrust(0.01, src)))
inertia_dir = 0
return 1
-// if(!check_drift && J.allow_thrust(0.01, src))
-// return 1
-
- //If no working jetpack then use the other checks
+ //Do we have working magboots
+ if(istype(shoes, /obj/item/clothing/shoes/magboots))
+ var/obj/item/clothing/shoes/magboots/B = shoes
+ if((B.flags & NOSLIP) && istype(src.loc,/turf/simulated/floor) && (!has_gravity(src.loc)))
+ return 1
+ //If no working jetpack or magboots then use the other checks
if(..()) return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 028f4b7ccf2..e09d39d53dd 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -351,8 +351,8 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_wear_id()
remove_overlay(ID_LAYER)
if(wear_id)
- if(client && hud_used && hud_used.hud_shown)
- wear_id.screen_loc = ui_id //TODO
+ wear_id.screen_loc = ui_id //TODO
+ if(client && hud_used)
client.screen += wear_id
overlays_standing[ID_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="id", "layer"=-ID_LAYER)
@@ -433,8 +433,8 @@ Please contact me on #coderbus IRC. ~Carnie x
remove_overlay(SUIT_STORE_LAYER)
if(s_store)
- if(client && hud_used && hud_used.hud_shown)
- s_store.screen_loc = ui_sstore1 //TODO
+ s_store.screen_loc = ui_sstore1 //TODO
+ if(client && hud_used)
client.screen += s_store
var/t_state = s_store.item_state
@@ -470,8 +470,8 @@ Please contact me on #coderbus IRC. ~Carnie x
remove_overlay(BELT_LAYER)
if(belt)
- if(client && hud_used && hud_used.hud_shown)
- belt.screen_loc = ui_belt
+ belt.screen_loc = ui_belt
+ if(client && hud_used)
client.screen += belt
var/t_state = belt.item_state
@@ -508,12 +508,12 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_pockets()
if(l_store)
- if(client && hud_used && hud_used.hud_shown)
- l_store.screen_loc = ui_storage1 //TODO
+ l_store.screen_loc = ui_storage1 //TODO
+ if(client && hud_used)
client.screen += l_store
if(r_store)
- if(client && hud_used && hud_used.hud_shown)
- r_store.screen_loc = ui_storage2 //TODO
+ r_store.screen_loc = ui_storage2 //TODO
+ if(client && hud_used)
client.screen += r_store
@@ -541,8 +541,8 @@ Please contact me on #coderbus IRC. ~Carnie x
remove_overlay(BACK_LAYER)
if(back)
+ back.screen_loc = ui_back
if(client && hud_used && hud_used.hud_shown)
- back.screen_loc = ui_back //TODO
client.screen += back
overlays_standing[BACK_LAYER] = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER)
@@ -598,8 +598,8 @@ Please contact me on #coderbus IRC. ~Carnie x
drop_r_hand()
return
if(r_hand)
+ r_hand.screen_loc = ui_rhand //TODO
if(client)
- r_hand.screen_loc = ui_rhand //TODO
client.screen += r_hand
var/t_state = r_hand.item_state
@@ -617,8 +617,8 @@ Please contact me on #coderbus IRC. ~Carnie x
drop_l_hand()
return
if(l_hand)
+ l_hand.screen_loc = ui_lhand //TODO
if(client)
- l_hand.screen_loc = ui_lhand //TODO
client.screen += l_hand
var/t_state = l_hand.item_state
diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm
index fc26fcbf5b7..b8e004e2016 100644
--- a/code/modules/mob/living/carbon/metroid/death.dm
+++ b/code/modules/mob/living/carbon/metroid/death.dm
@@ -8,12 +8,14 @@
maxHealth = 150
revive()
regenerate_icons()
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])"
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(stat == DEAD) return
stat = DEAD
icon_state = "[colour] baby slime dead"
+ overlays.len = 0
for(var/mob/O in viewers(src, null))
O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index aec12755d58..3dc89883751 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -5,8 +5,6 @@
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
var/SStun = 0 // stun variable
-
-
/mob/living/carbon/slime/Life()
set invisibility = 0
set background = BACKGROUND_ENABLED
@@ -24,105 +22,80 @@
handle_targets()
+ if (!ckey)
+ handle_speech_and_mood()
var/datum/gas_mixture/environment
if(src.loc)
environment = loc.return_air()
-
//Apparently, the person who wrote this code designed it so that
//blinded get reset each cycle and then get activated later in the
//code. Very ugly. I dont care. Moving this stuff here so its easy
//to find it.
src.blinded = null
- // Basically just deletes any screen objects :<
- regular_hud_updates()
+ regular_hud_updates() // Basically just deletes any screen objects :<
- //Handle temperature/pressure differences between body and environment
if(environment)
- handle_environment(environment)
-
- //Status updates, death etc.
- handle_regular_status_updates()
-
+ handle_environment(environment) // Handle temperature/pressure differences between body and environment
+ handle_regular_status_updates() // Status updates, death etc.
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
- //world << "AI proc started."
if(AIproc || stat == DEAD || client) return
var/hungry = 0
- var/starving = 0
- if(is_adult)
- switch(nutrition)
- if(400 to 1100) hungry = 1
- if(0 to 399)
- starving = 1
- else
- switch(nutrition)
- if(150 to 900) hungry = 1
- if(0 to 149) starving = 1
+ if (nutrition < get_starve_nutrition())
+ hungry = 2
+ else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
+ hungry = 1
+
AIproc = 1
- //world << "AIproc [AIproc] && stat != 2 [stat] && (attacked > 0 [attacked] || starving [starving] || hungry [hungry] || rabid [rabid] || Victim [Victim] || Target [Target]"
- while(AIproc && stat != 2 && (attacked > 0 || starving || hungry || rabid || Victim))
+
+ while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim))
if(Victim) // can't eat AND have this little process at the same time
- //world << "break 1"
break
if(!Target || client)
- //world << "break 2"
break
-
if(Target.health <= -70 || Target.stat == 2)
Target = null
AIproc = 0
- //world << "break 3"
break
if(Target)
- //world << "[Target] Target Found"
for(var/mob/living/carbon/slime/M in view(1,Target))
if(M.Victim == Target)
Target = null
AIproc = 0
- //world << "break 4"
break
if(!AIproc)
- //world << "break 5"
break
if(Target in view(1,src))
-
if(istype(Target, /mob/living/silicon))
if(!Atkcool)
- spawn()
- Atkcool = 1
- sleep(15)
+ Atkcool = 1
+ spawn(45)
Atkcool = 0
if(Target.Adjacent(src))
Target.attack_slime(src)
- //world << "retrun 1"
return
if(!Target.lying && prob(80))
if(Target.client && Target.health >= 20)
if(!Atkcool)
- spawn()
- Atkcool = 1
- sleep(25)
+ Atkcool = 1
+ spawn(45)
Atkcool = 0
if(Target.Adjacent(src))
Target.attack_slime(src)
-
- if(prob(30))
- step_to(src, Target)
-
else
if(!Atkcool && Target.Adjacent(src))
Feedon(Target)
@@ -133,13 +106,12 @@
else
if(Target in view(7, src))
- if(Target.Adjacent(src))
+ if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them
step_to(src, Target)
else
Target = null
AIproc = 0
- //world << "break 6"
break
var/sleeptime = movement_delay()
@@ -148,7 +120,6 @@
sleep(sleeptime + 2) // this is about as fast as a player slime can go
AIproc = 0
- //world << "AI proc ended."
/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment)
if(!environment)
@@ -158,28 +129,11 @@
//var/environment_heat_capacity = environment.heat_capacity()
var/loc_temp = get_temperature(environment)
- /*
- if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
- var/transfer_coefficient
-
- transfer_coefficient = 1
- if(wear_mask && (wear_mask.body_parts_covered & HEAD) && (environment.temperature < wear_mask.protective_temperature))
- transfer_coefficient *= wear_mask.heat_transfer_coefficient
-
- // handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
- */
-
-
if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
- /*
- if(stat==2)
- bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
-
- */
//Account for massive pressure differences
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
@@ -199,7 +153,6 @@
return //TODO: DEFERRED
-
/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current
var/difference = abs(current-loc_temp) //get difference
@@ -221,12 +174,10 @@
if(reagents) reagents.metabolize(src)
-
src.updatehealth()
return //TODO: DEFERRED
-
/mob/living/carbon/slime/proc/handle_regular_status_updates()
if(is_adult)
@@ -234,20 +185,17 @@
else
health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
-
-
-
if(health < config.health_threshold_dead && stat != 2)
death()
return
else if(src.health < config.health_threshold_crit)
- // if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
- //if(!src.rejuv) src.oxyloss++
- if(!src.reagents.has_reagent("inaprovaline")) src.adjustOxyLoss(10)
+ if(!src.reagents.has_reagent("inaprovaline"))
+ src.adjustOxyLoss(10)
- if(src.stat != DEAD) src.stat = UNCONSCIOUS
+ if(src.stat != DEAD)
+ src.stat = UNCONSCIOUS
if(prob(30))
adjustOxyLoss(-1)
@@ -256,12 +204,9 @@
adjustCloneLoss(-1)
adjustBruteLoss(-1)
-
if (src.stat == DEAD)
-
src.lying = 1
src.blinded = 1
-
else
if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
if (src.stunned > 0)
@@ -306,35 +251,25 @@
return 1
-
/mob/living/carbon/slime/proc/handle_nutrition()
- if(prob(20))
- if(is_adult) nutrition-=rand(4,6)
- else nutrition-=rand(2,3)
+ if (prob(15))
+ nutrition -= 1 + is_adult
if(nutrition <= 0)
nutrition = 0
if(prob(75))
-
adjustToxLoss(rand(0,5))
- else
+ else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
+ nutrition -= 20
+ amount_grown++
+
+ if(amount_grown >= 10 && !Victim && !Target && !ckey)
if(is_adult)
- if(nutrition >= 1000)
- if(prob(40)) amount_grown++
-
+ Reproduce()
else
- if(nutrition >= 800)
- if(prob(40)) amount_grown++
-
- if(amount_grown >= 10 && !Victim && !Target)
- if(!ckey)
- if(is_adult)
- Reproduce()
-
- else
- Evolve()
+ Evolve()
/mob/living/carbon/slime/proc/handle_targets()
if(Tempstun)
@@ -346,8 +281,7 @@
if(attacked > 50) attacked = 50
if(attacked > 0)
- if(prob(85))
- attacked--
+ attacked--
if(Discipline > 0)
@@ -357,136 +291,272 @@
if(prob(10))
Discipline--
-
if(!client)
-
if(!canmove) return
- // DO AI STUFF HERE
-
- if(Target)
- if(attacked <= 0)
- Target = null
-
if(Victim) return // if it's eating someone already, continue eating!
-
- if(prob(1))
- emote(pick("bounce","sway","light","vibrate","jiggle"))
+ if(Target)
+ --target_patience
+ if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention
+ target_patience = 0
+ Target = null
if(AIproc && SStun) return
-
var/hungry = 0 // determines if the slime is hungry
- var/starving = 0 // determines if the slime is starving-hungry
- if(is_adult) // 1200 max nutrition
- switch(nutrition)
- if(601 to 900)
- if(prob(25)) hungry = 1//Ensures they continue eating, but aren't as aggressive at the same time
- if(301 to 600) hungry = 1
- if(0 to 300)
- starving = 1
- else
- switch(nutrition) // 1000 max nutrition
- if(501 to 700)
- if(prob(25)) hungry = 1
- if(201 to 500) hungry = 1
- if(0 to 200) starving = 1
+ if (nutrition < get_starve_nutrition())
+ hungry = 2
+ else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
+ hungry = 1
-
- if(starving && !client) // if a slime is starving, it starts losing its friends
+ if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends
if(Friends.len > 0 && prob(1))
var/mob/nofriend = pick(Friends)
- Friends -= nofriend
+ --Friends[nofriend]
if(!Target)
- var/list/targets = list()
+ if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to
+ var/list/targets = list()
- if(hungry || starving) //Only add to the list if we need to
for(var/mob/living/L in view(7,src))
- //Ignore other slimes, dead mobs and simple_animals
- if(isslime(L) || L.stat != CONSCIOUS || isanimal(L))
+ if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs
continue
- if(issilicon(L))
- if(!is_adult) //Non-starving diciplined adult slimes wont eat things
- if(!starving && Discipline > 0)
+ if(L in Friends) // No eating friends!
+ continue
+
+ if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence
+ targets += L // Possible target found!
+
+ if(isanimal(L) && (rabid || attacked || hungry >= 2)) //Simple_Animals only get retaliated against.
+ targets += L
+
+ if(istype(L, /mob/living/carbon/human)) // Ignore slime(wo)men
+ var/mob/living/carbon/human/H = L
+ if(H.dna)
+ if(H.dna.mutantrace == "slime")
continue
- if(tame) //Tame slimes ignore electronic life
+ if(!L.canmove) // Only one slime can latch on at a time.
+ var/notarget = 0
+ for(var/mob/living/carbon/slime/M in view(1,L))
+ if(M.Victim == L)
+ notarget = 1
+ if(notarget)
continue
- targets += L //Possible target found!
+ targets += L // Possible target found!
- else if(iscarbon(L))
-
- if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
- var/mob/living/carbon/human/H = L
- if(H.dna)
- if(H.dna.mutantrace == "slime")
- continue
-
- if(!is_adult) //Non-starving diciplined adult slimes wont eat things
- if(!starving && Discipline > 0)
- continue
-
- if(L in Friends) //No eating friends!
- continue
-
- if(tame && ishuman(L)) //Tame slimes dont eat people.
- continue
-
- if(!L.canmove) //Only one slime can latch on at a time.
-
- var/notarget = 0
- for(var/mob/living/carbon/slime/M in view(1,L))
- if(M.Victim == L)
- notarget = 1
- if(notarget)
- continue
-
- targets += L //Possible target found!
-
-
-
- if((hungry || starving) && targets.len > 0)
- if(!is_adult)
- if(!starving)
+ if(targets.len > 0)
+ if(attacked || rabid || hungry == 2)
+ Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care
+ else
for(var/mob/living/carbon/C in targets)
if(!Discipline && prob(5))
- if(ishuman(C))
- Target = C
- break
- if(isalienadult(C))
+ if(ishuman(C) || isalienadult(C))
Target = C
break
- if(islarva(C))
+ if(islarva(C) || ismonkey(C))
Target = C
break
- if(ismonkey(C))
- Target = C
- break
- else
- Target = targets[1]
- else
- Target = targets[1] // closest target
- if(targets.len > 0)
- if(attacked > 0 || rabid)
- Target = targets[1] //closest mob probably attacked it, so override Target and attack the nearest!
+ if (Target)
+ target_patience = rand(5,7)
+ if (is_adult)
+ target_patience += 3
+ if(!Target) // If we have no target, we are wandering or following orders
+ if (Leader)
+ if (holding_still)
+ holding_still = max(holding_still - 1, 0)
+ else if(canmove && isturf(loc))
+ step_to(src, Leader)
- if(!Target)
- if(hungry || starving)
- if(canmove && isturf(loc) && prob(50))
+ else if(hungry)
+ if (holding_still)
+ holding_still = max(holding_still - hungry, 0)
+ else if(canmove && isturf(loc) && prob(50))
step(src, pick(cardinal))
else
- if(canmove && isturf(loc) && prob(33))
+ if (holding_still)
+ holding_still = max(holding_still - 1, 0)
+ else if(canmove && isturf(loc) && prob(33))
step(src, pick(cardinal))
- else
- if(!AIproc)
- spawn() AIprocess()
+ else if(!AIproc)
+ spawn()
+ AIprocess()
+
+/mob/living/carbon/slime/proc/handle_speech_and_mood()
+ //Mood starts here
+ var/newmood = ""
+ if (rabid || attacked) newmood = "angry"
+ else if (Target) newmood = "mischevous"
+
+ if (!newmood)
+ if (Discipline && prob(25))
+ newmood = "pout"
+ else if (prob(1))
+ newmood = pick("sad", ":3", "pout")
+
+ if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
+ if (prob(75)) newmood = mood
+
+ if (newmood != mood) // This is so we don't redraw them every time
+ mood = newmood
+ regenerate_icons()
+
+ //Speech understanding starts here
+ var/to_say
+ if (speech_buffer.len > 0)
+ var/who = speech_buffer[1] // Who said it?
+ var/phrase = speech_buffer[2] // What did they say?
+ if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us
+ if (findtext(phrase, "hello") || findtext(phrase, "hi"))
+ to_say = pick("Hello...", "Hi...")
+ else if (findtext(phrase, "follow"))
+ if (Leader)
+ if (Leader == who) // Already following him
+ to_say = pick("Yes...", "Lead...", "Following...")
+ else if (Friends[who] > Friends[Leader]) // VIVA
+ Leader = who
+ to_say = "Yes... I follow [who]..."
+ else
+ to_say = "No... I follow [Leader]..."
+ else
+ if (Friends[who] > 2)
+ Leader = who
+ to_say = "I follow..."
+ else // Not friendly enough
+ to_say = pick("No...", "I won't follow...")
+ else if (findtext(phrase, "stop"))
+ if (Victim) // We are asked to stop feeding
+ if (Friends[who] > 4)
+ Victim = null
+ if (Friends[who] < 7)
+ --Friends[who]
+ to_say = "Grrr..." // I'm angry but I do it
+ else
+ to_say = "Fine..."
+ else if (Leader) // We are asked to stop following
+ if (Leader == who)
+ to_say = "Yes... I'll stay..."
+ Leader = null
+ else
+ if (Friends[who] > Friends[Leader])
+ Leader = null
+ to_say = "Yes... I'll stop..."
+ else
+ to_say = "No... I'll keep following..."
+ else if (findtext(phrase, "stay"))
+ if (Leader)
+ if (Leader == who)
+ holding_still = Friends[who] * 10
+ to_say = "Yes... Staying..."
+ else if (Friends[who] > Friends[Leader])
+ holding_still = (Friends[who] - Friends[Leader]) * 10
+ to_say = "Yes... Staying..."
+ else
+ to_say = "No... I'll keep following..."
+ else
+ if (Friends[who] > 2)
+ holding_still = Friends[who] * 10
+ to_say = "Yes... Staying..."
+ else
+ to_say = "No... I won't stay..."
+ speech_buffer = list()
+
+ //Speech starts here
+ if (to_say)
+ say (to_say)
+ else if(prob(1))
+ emote(pick("bounce","sway","light","vibrate","jiggle"))
+ else
+ var/t = 10
+ var/slimes_near = -1 // Don't count myself
+ var/dead_slimes = 0
+ var/friends_near = list()
+ for (var/mob/living/carbon/M in view(7,src))
+ if (isslime(M))
+ ++slimes_near
+ if (M.stat == DEAD)
+ ++dead_slimes
+ if (M in Friends)
+ t += 20
+ friends_near += M
+ if (nutrition < get_hunger_nutrition()) t += 10
+ if (nutrition < get_starve_nutrition()) t += 10
+ if (prob(2) && prob(t))
+ var/phrases = list()
+ if (Target) phrases += "[Target]... looks tasty..."
+ if (nutrition < get_starve_nutrition())
+ phrases += "So... hungry..."
+ phrases += "Very... hungry..."
+ phrases += "Need... food..."
+ phrases += "Must... eat..."
+ else if (nutrition < get_hunger_nutrition())
+ phrases += "Hungry..."
+ phrases += "Where is the food?"
+ phrases += "I want to eat..."
+ phrases += "Rawr..."
+ phrases += "Blop..."
+ phrases += "Blorble..."
+ if (rabid || attacked)
+ phrases += "Hrr..."
+ phrases += "Nhuu..."
+ phrases += "Unn..."
+ if (mood == ":3")
+ phrases += "Purr..."
+ if (attacked)
+ phrases += "Grrr..."
+ if (getToxLoss() > 30)
+ phrases += "Cold..."
+ if (getToxLoss() > 60)
+ phrases += "So... cold..."
+ phrases += "Very... cold..."
+ if (getToxLoss() > 90)
+ phrases += "..."
+ phrases += "C... c..."
+ if (Victim)
+ phrases += "Nom..."
+ phrases += "Tasty..."
+ if (powerlevel > 3) phrases += "Bzzz..."
+ if (powerlevel > 5) phrases += "Zap..."
+ if (powerlevel > 8) phrases += "Zap... Bzz..."
+ if (mood == "sad") phrases += "Bored..."
+ if (slimes_near) phrases += "Brother..."
+ if (slimes_near > 1) phrases += "Brothers..."
+ if (dead_slimes) phrases += "What happened?"
+ if (!slimes_near)
+ phrases += "Lonely..."
+ for (var/M in friends_near)
+ phrases += "[M]... friend..."
+ if (nutrition < get_hunger_nutrition())
+ phrases += "[M]... feed me..."
+ say (pick(phrases))
+
+/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it
+ if (is_adult) return 1200
+ else return 1000
+
+/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
+ if (is_adult) return 1000
+ else return 800
+
+/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat
+ if (is_adult) return 600
+ else return 500
+
+/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
+ if (is_adult) return 300
+ else return 200
+
+/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
+ if (hunger == 2 || rabid || attacked) return 1
+ if (Leader) return 0
+ if (holding_still) return 0
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index ab479dffe30..3d1c6f8c70c 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -15,7 +15,7 @@
gender = NEUTER
update_icon = 0
- nutrition = 700 // 1000 = max
+ nutrition = 700
see_in_dark = 8
update_slimes = 0
@@ -25,23 +25,27 @@
status_flags = CANPARALYSE|CANPUSH
var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
+ var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
- var/powerlevel = 0 // 1-10 controls how much electricity they are generating
- var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows into an adult
- // if adult: if 10: reproduces
+ var/powerlevel = 0 // 1-10 controls how much electricity they are generating
+ var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
+ var/number = 0 // Used to understand when someone is talking to it
var/mob/living/Victim = null // the person the slime is currently feeding on
var/mob/living/Target = null // AI variable - tells the slime to hunt this down
+ var/mob/living/Leader = null // AI variable - tells the slime to follow this person
- var/attacked = 0 // determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
- var/tame = 0 // if set to 1, the slime will not eat humans ever, or attack them
- var/rabid = 0 // if set to 1, the slime will attack and eat anything it comes in contact with
+ var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
+ var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
+ var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
+ var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
- var/list/Friends = list() // A list of potential friends
- var/list/FriendsWeight = list() // A list containing values respective to Friends. This determines how many times a slime "likes" something. If the slime likes it more than 2 times, it becomes a friend
+ var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
- // slimes pass on genetic data, so all their offspring have the same "Friends",
+ var/list/speech_buffer = list() // Last phrase said near it and person who said it
+
+ var/mood = "" // To show its face
///////////TIME FOR SUBSPECIES
@@ -52,19 +56,27 @@
/mob/living/carbon/slime/New()
create_reagents(100)
spawn (0)
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])"
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
real_name = name
slime_mutation = mutation_table(colour)
+ mutation_chance = rand(25, 35)
var/sanitizedcolour = replacetext(colour, " ", "")
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..()
/mob/living/carbon/slime/regenerate_icons()
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
+ overlays.len = 0
+ if (mood)
+ overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
..()
/mob/living/carbon/slime/movement_delay()
+ if (bodytemperature >= 330.23) // 135 F
+ return -1 // slimes become supercharged at high temperatures
+
var/tally = 0
var/health_deficiency = (100 - health)
@@ -74,23 +86,19 @@
tally += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
- if(reagents.has_reagent("hyperzine")) // hyperzine slows slimes down
- tally *= 2 // moves twice as slow
+ if(reagents.has_reagent("hyperzine")) // Hyperzine slows slimes down
+ tally *= 2
- if(reagents.has_reagent("frostoil")) // frostoil also makes them move VEEERRYYYYY slow
+ if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
tally *= 5
if(health <= 0) // if damaged, the slime moves twice as slow
tally *= 2
- if (bodytemperature >= 330.23) // 135 F
- return -1 // slimes become supercharged at high temperatures
-
- return tally+config.slime_delay
-
+ return tally + config.slime_delay
/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
- if ((!( yes ) || now_pushing))
+ if ((!(yes) || now_pushing))
return
now_pushing = 1
@@ -98,31 +106,21 @@
if(!client && powerlevel > 0)
var/probab = 10
switch(powerlevel)
- if(1 to 2) probab = 20
- if(3 to 4) probab = 30
- if(5 to 6) probab = 40
- if(7 to 8) probab = 60
- if(9) probab = 70
- if(10) probab = 95
+ if(1 to 2) probab = 20
+ if(3 to 4) probab = 30
+ if(5 to 6) probab = 40
+ if(7 to 8) probab = 60
+ if(9) probab = 70
+ if(10) probab = 95
if(prob(probab))
-
-
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
- if(is_adult)
- if(nutrition <= 600 && !Atkcool)
+ if(nutrition <= get_hunger_nutrition() && !Atkcool)
+ if (is_adult || prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
- sleep(15)
+ sleep(45)
Atkcool = 0
- else
- if(nutrition <= 500 && !Atkcool)
- if(prob(5))
- AM.attack_slime(src)
- spawn()
- Atkcool = 1
- sleep(15)
- Atkcool = 0
if(ismob(AM))
var/mob/tmob = AM
@@ -156,7 +154,6 @@
/mob/living/carbon/slime/Process_Spacemove()
return 2
-
/mob/living/carbon/slime/Stat()
..()
@@ -166,20 +163,16 @@
else
stat(null, "Health: [round((health / 150) * 100)]%")
-
if (client.statpanel == "Status")
- if(is_adult)
- stat(null, "Nutrition: [nutrition]/1200")
- if(amount_grown >= 10)
+ stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
+ if(amount_grown >= 10)
+ if(is_adult)
stat(null, "You can reproduce!")
- else
- stat(null, "Nutrition: [nutrition]/1000")
- if(amount_grown >= 10)
+ else
stat(null, "You can evolve!")
stat(null,"Power Level: [powerlevel]")
-
/mob/living/carbon/slime/adjustFireLoss(amount)
..(-abs(amount)) // Heals them
return
@@ -189,7 +182,6 @@
..(Proj)
return 0
-
/mob/living/carbon/slime/emp_act(severity)
powerlevel = 0 // oh no, the power!
..()
@@ -244,28 +236,15 @@
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
return
-
/mob/living/carbon/slime/attack_ui(slot)
- return
-
-/mob/living/carbon/slime/meteorhit(O as obj)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message(text(" [] has been hit by []", src, O), 1)
- if (health > 0)
- adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
- adjustFireLoss(30)
-
- updatehealth()
- return
-
+ return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
- if(Victim) return // can't attack while eating!
+ if (Victim) return // can't attack while eating!
if (health > -100)
@@ -276,19 +255,16 @@
var/damage = rand(1, 3)
attacked += 5
- if(is_adult)
+ if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
adjustBruteLoss(damage)
-
updatehealth()
-
return
-
/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]")
@@ -299,11 +275,13 @@
O.show_message(" [M] [M.attacktext] [src]!", 1)
add_logs(M, src, "attacked", admin=0)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
+ attacked += 10
adjustBruteLoss(damage)
updatehealth()
/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
- if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
+ if(!(istype(M, /mob/living/carbon/monkey)))
+ return // Fix for aliens receiving double messages when attacking other aliens.
if (!ticker)
M << "You cannot attack people before the game has started."
@@ -312,6 +290,7 @@
if (istype(loc, /turf) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
+
..()
switch(M.a_intent)
@@ -412,7 +391,7 @@
if ("grab")
if (M == src || anchored)
return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
+ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
M.put_in_active_hand(G)
@@ -433,8 +412,9 @@
if (prob(90))
if (HULK in M.mutations)
damage += 5
- if(Victim)
+ if(Victim || Target)
Victim = null
+ Target = null
anchored = 0
if(prob(80) && !client)
Discipline++
@@ -524,8 +504,9 @@
if ((O.client && !( O.blinded )))
O.show_message(text(" [] has tackled [name]!", M), 1)
- if(Victim)
+ if(Victim || Target)
Victim = null
+ Target = null
anchored = 0
if(prob(80) && !client)
Discipline++
@@ -559,16 +540,17 @@
if(prob(25))
user << "\red [W] passes right through [src]!"
return
- if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
+ if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
Discipline = 0
if(W.force >= 3)
if(is_adult)
if(prob(5 + round(W.force/2)))
- if(Victim)
+ if(Victim || Target)
if(prob(80) && !client)
Discipline++
Victim = null
+ Target = null
anchored = 0
spawn()
@@ -588,7 +570,7 @@
else
if(prob(10 + W.force*2))
- if(Victim)
+ if(Victim || Target)
if(prob(80) && !client)
Discipline++
if(Discipline == 1)
@@ -599,6 +581,7 @@
SStun = 0
Victim = null
+ Target = null
anchored = 0
spawn(0)
@@ -615,17 +598,22 @@
/mob/living/carbon/slime/restrained()
return 0
-
mob/living/carbon/slime/var/co2overloadtime = null
mob/living/carbon/slime/var/temperature_resistance = T0C+75
-
/mob/living/carbon/slime/show_inv(mob/user)
return
/mob/living/carbon/slime/toggle_throw_mode()
return
+/mob/living/carbon/slime/proc/apply_water()
+ adjustToxLoss(rand(15,20))
+ if (!client)
+ if (Target) // Like cats
+ Target = null
+ ++Discipline
+ return
/obj/item/slime_extract
name = "slime extract"
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index 771fc56eae1..f5b1fcc157d 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -14,7 +14,7 @@
if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
choices += C
- var/mob/living/carbon/M = input(src,"Who do you wish to feed on?") in null|choices
+ var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
if(!M) return
if(Adjacent(M))
@@ -42,76 +42,72 @@
-/mob/living/carbon/slime/proc/Feedon(var/mob/living/carbon/M)
+/mob/living/carbon/slime/proc/Feedon(var/mob/living/M)
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
- //if(M.client) M << "\red You legs become paralyzed!"
+ var/fed_succesfully = 0
if(is_adult)
icon_state = "[colour] adult slime eat"
else
icon_state = "[colour] baby slime eat"
while(Victim && M.health > -70 && stat != 2)
- // M.canmove = 0
canmove = 0
if(Adjacent(M))
loc = M.loc
if(prob(15) && M.client && istype(M, /mob/living/carbon))
- M << "\red [pick("You can feel your body becoming weak!", \
+ M << "[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
"A low, rolling pain passes through your body!", \
"Your body feels as if it's falling apart!", \
"You feel extremely weak!", \
- "A sharp, deep pain bathes every inch of your body!")]"
+ "A sharp, deep pain bathes every inch of your body!")]"
if(istype(M, /mob/living/carbon))
- Victim.adjustCloneLoss(rand(1,10))
+ Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4))
- // Heal yourself
- adjustToxLoss(-10)
- adjustOxyLoss(-10)
- adjustBruteLoss(-10)
- adjustFireLoss(-10)
- adjustCloneLoss(-10)
+ fed_succesfully = 1
- if(Victim)
- for(var/mob/living/carbon/slime/slime in view(1,M))
- if(slime.Victim == M && slime != src)
- slime.Feedstop()
+ else if(istype(M, /mob/living/simple_animal))
+ Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
+ fed_succesfully = 1
- nutrition += rand(10,25)
+ else
+ if(prob(25))
+ src << "[pick("This subject is incompatable", \
+ "This subject does not have a life energy", "This subject is empty", \
+ "I am not satisified", "I can not feed from this subject", \
+ "I do not feel nourished", "This subject is not food")]..."
+
+ if(fed_succesfully)
+ //I have no idea why this is not in handle_nutrition()
+ nutrition += rand(15,30)
if(nutrition >= lastnut + 50)
if(prob(80))
lastnut = nutrition
powerlevel++
if(powerlevel > 10)
powerlevel = 10
+ adjustToxLoss(-10)
- if(is_adult)
- if(nutrition > 1200)
- nutrition = 1200
- else
- if(nutrition > 1000)
- nutrition = 1000
-
- Victim.updatehealth()
+ //Heal yourself.
+ adjustOxyLoss(-10)
+ adjustBruteLoss(-10)
+ adjustFireLoss(-10)
+ adjustCloneLoss(-10)
+
updatehealth()
-
- else
- if(prob(25))
- src << "\red [pick("This subject is incompatable", \
- "This subject does not have a life energy", "This subject is empty", \
- "I am not satisified", "I can not feed from this subject", \
- "I do not feel nourished", "This subject is not food")]..."
+ if(Victim)
+ Victim.updatehealth()
sleep(rand(15,45))
@@ -139,7 +135,11 @@
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
if(!(Victim.LAssailant in Friends))
- Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
+ Friends[Victim.LAssailant] = 1
+ //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
+ else
+ ++Friends[Victim.LAssailant]
+
if(M.client && istype(src, /mob/living/carbon/human))
if(prob(85))
@@ -179,7 +179,7 @@
maxHealth = 200
amount_grown = 0
regenerate_icons()
- name = text("[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])")
+ name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])")
else
src << "I am not ready to evolve yet..."
else
@@ -204,13 +204,14 @@
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
- if(prob(70))
- M.colour = colour
- else
+ if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
+ else
+ M.colour = colour
if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
M.powerlevel = new_powerlevel
if(i != 1) step_away(M,src)
+ M.Friends = Friends.Copy()
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
@@ -225,4 +226,4 @@
else
src << "I am not ready to reproduce yet..."
else
- src << "I am not old enough to reproduce yet..."
+ src << "I am not old enough to reproduce yet..."
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/metroid/subtypes.dm b/code/modules/mob/living/carbon/metroid/subtypes.dm
index e61054fce8d..3b7e0107abb 100644
--- a/code/modules/mob/living/carbon/metroid/subtypes.dm
+++ b/code/modules/mob/living/carbon/metroid/subtypes.dm
@@ -19,35 +19,35 @@ proc/mutation_table(var/colour)
slime_mutation[3] = "gold"
slime_mutation[4] = "gold"
if("orange")
- slime_mutation[1] = "red"
- slime_mutation[2] = "red"
- slime_mutation[3] = "dark purple"
- slime_mutation[4] = "yellow"
+ slime_mutation[1] = "dark purple"
+ slime_mutation[2] = "yellow"
+ slime_mutation[3] = "red"
+ slime_mutation[4] = "red"
if("blue")
slime_mutation[1] = "dark blue"
- slime_mutation[2] = "pink"
+ slime_mutation[2] = "silver"
slime_mutation[3] = "pink"
- slime_mutation[4] = "silver"
+ slime_mutation[4] = "pink"
//Tier 3
if("dark blue")
slime_mutation[1] = "purple"
- slime_mutation[2] = "cerulean"
- slime_mutation[3] = "blue"
+ slime_mutation[2] = "blue"
+ slime_mutation[3] = "cerulean"
slime_mutation[4] = "cerulean"
if("dark purple")
slime_mutation[1] = "purple"
- slime_mutation[2] = "sepia"
- slime_mutation[3] = "orange"
+ slime_mutation[2] = "orange"
+ slime_mutation[3] = "sepia"
slime_mutation[4] = "sepia"
if("yellow")
slime_mutation[1] = "metal"
- slime_mutation[2] = "bluespace"
- slime_mutation[3] = "orange"
+ slime_mutation[2] = "orange"
+ slime_mutation[3] = "bluespace"
slime_mutation[4] = "bluespace"
if("silver")
slime_mutation[1] = "metal"
- slime_mutation[2] = "pyrite"
- slime_mutation[3] = "blue"
+ slime_mutation[2] = "blue"
+ slime_mutation[3] = "pyrite"
slime_mutation[4] = "pyrite"
//Tier 4
if("pink")
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 205fd2d2584..d1f94f76d29 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -68,19 +68,6 @@
now_pushing = null
-/mob/living/carbon/monkey/meteorhit(obj/O as obj)
- for(var/mob/M in viewers(src, null))
- M.show_message(text("\red [] has been hit by []", src, O), 1)
- if (health > 0)
- var/shielded = 0
- adjustBruteLoss(30)
- if ((O.icon_state == "flaming" && !( shielded )))
- adjustFireLoss(40)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- return
-
-//mob/living/carbon/monkey/bullet_act(var/obj/item/projectile/Proj)taken care of in living
-
/mob/living/carbon/monkey/attack_paw(mob/M as mob)
..()
@@ -373,4 +360,4 @@
return 0
/mob/living/carbon/monkey/canBeHandcuffed()
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 3e0316e0491..a7d13ffef88 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -580,3 +580,31 @@
/mob/living/proc/Exhaust()
src << "You're too exhausted to keep going..."
Weaken(5)
+
+// The src mob is trying to strip an item from someone
+// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
+/mob/living/stripPanelUnequip(mob/who, obj/item/what, where)
+ if(what.flags & NODROP)
+ src << "You can't remove \the [what.name], it appears to be stuck!"
+ return
+ visible_message("[src] tries to remove [who]'s [what.name].", \
+ "[src] tries to remove [who]'s [what.name].")
+ what.add_fingerprint(src)
+ if(do_mob(src, who, STRIP_DELAY))
+ if(what && Adjacent(who))
+ who.unEquip(what)
+
+// The src mob is trying to place an item on someone
+// Override if a certain mob should be behave differently when placing items (can't, for example)
+/mob/living/stripPanelEquip(mob/who, obj/item/what, where)
+ what = src.get_active_hand()
+ if(what && (what.flags & NODROP))
+ src << "You can't put \the [what.name] on [who], it's stuck to your hand!"
+ return
+ if(what && what.mob_can_equip(who, where, 1))
+ visible_message("[src] tries to put [what] on [who].")
+ if(do_mob(src, who, STRIP_DELAY * 0.5))
+ if(what && Adjacent(who))
+ src.unEquip(what)
+ who.equip_to_slot_if_possible(what, where, 0, 1)
+
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d1292c3452a..4f722d5d8a5 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -288,6 +288,16 @@ var/list/department_radio_keys = list(
P.speech_buffer.Remove(pick(P.speech_buffer))
P.speech_buffer.Add(html_decode(message))
+ if(isslime(A)) //Slimes answering to people
+ if (A == src)
+ continue
+
+ var/mob/living/carbon/slime/S = A
+ if (src in S.Friends)
+ S.speech_buffer = list()
+ S.speech_buffer.Add(src)
+ S.speech_buffer.Add(lowertext(html_decode(message)))
+
if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
var/obj/O = A
spawn (0)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 3870bc92a15..8036721f0cc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -376,27 +376,16 @@ var/list/ai_list = list()
usr << "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb)."
sleep(40)
continue
-
return
-
return
-/mob/living/silicon/ai/meteorhit(obj/O as obj)
- for(var/mob/M in viewers(src, null))
- M.show_message(text("\red [] has been hit by []", src, O), 1)
- //Foreach goto(19)
- if (health > 0)
- adjustBruteLoss(30)
- if ((O.icon_state == "flaming"))
- adjustFireLoss(40)
- updatehealth()
- return
/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
return 2
+
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 0139fd0e33f..08109272c81 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -20,6 +20,9 @@
if(F.on)
F.on = 0
F.update_brightness(src)
+ else if(istype(O, /obj/item/weapon/storage/bag/tray/))
+ var/obj/item/weapon/storage/bag/tray/T = O
+ T.do_quick_empty()
if(client)
client.screen -= O
contents -= O
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 54c38fcb787..9354918ac99 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -336,21 +336,9 @@
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
-
return
-/mob/living/silicon/robot/meteorhit(obj/O as obj)
- for(var/mob/M in viewers(src, null))
- M.show_message(text("\red [src] has been hit by [O]"), 1)
- //Foreach goto(19)
- if (health > 0)
- adjustBruteLoss(30)
- if ((O.icon_state == "flaming"))
- adjustFireLoss(40)
- updatehealth()
- return
-
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 2401c132ad5..277bacfe30b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -193,7 +193,7 @@
L.lit = 1
modules += L
- modules += new /obj/item/weapon/tray(src)
+ modules += new /obj/item/weapon/storage/bag/tray(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/borgshaker(src)
emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 00137619c42..2d36c56e227 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -300,5 +300,10 @@
step(AM, t)
now_pushing = null
-/mob/living/silicon/put_in_hand_check()
+/mob/living/silicon/put_in_hand_check() // This check is for borgs being able to receive items, not put them in others' hands.
+ return 0
+
+// The src mob is trying to place an item on someone
+// But the src mob is a silicon!! Disable.
+/mob/living/silicon/stripPanelEquip(obj/item/what, mob/who, slot)
return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 9929eb67c85..2ab4636438a 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -36,9 +36,7 @@
/mob/living/simple_animal/construct/Die()
..()
new /obj/item/weapon/ectoplasm (src.loc)
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] collapses in a shattered heap. ")
+ visible_message("[src] collapses in a shattered heap.")
ghostize()
qdel(src)
return
@@ -91,14 +89,14 @@
if(istype(M, /mob/living/simple_animal/construct/builder))
health += 5
M.emote("mends some of \the [src]'s wounds.")
- else
+ else if(src != M)
if(M.melee_damage_upper <= 0)
M.emote("[M.friendly] \the [src]")
else
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\The [M] [M.attacktext] \the [src]!", 1)
+ visible_message("\The [M] [M.attacktext] \the [src]!", \
+ "\The [M] [M.attacktext] \the [src]!")
add_logs(M, src, "attacked", admin=0)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
@@ -273,4 +271,4 @@
if (cultist == usr) //just to be sure.
return
cultist.loc = usr.loc
- usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
\ No newline at end of file
+ usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index edd5c6e7f51..cff189be4fd 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -26,7 +26,7 @@
attacktext = "claws"
friendly = "bear hugs"
- //Space bears aren't affected by atmos.
+ //Space bears aren't affected by cold.
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -36,6 +36,7 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
+ maxbodytemp = 1500
faction = "russian"
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index e79fa4b1fb8..f3e1f1d7d43 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -23,7 +23,7 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
- //Space carp aren't affected by atmos.
+ //Space carp aren't affected by cold.
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -33,6 +33,7 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
+ maxbodytemp = 1500
faction = "carp"
@@ -55,6 +56,8 @@
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
+ maxbodytemp = 0
+
/mob/living/simple_animal/hostile/carp/holocarp/Die()
qdel(src)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5aae6fa1b3f..b3f3e3137ce 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -491,26 +491,9 @@ var/list/slot_equipment_priority = list( \
var/obj/item/what = get_item_by_slot(slot)
if(what)
- if(what.flags & NODROP)
- usr << "You can't remove \the [what.name], it appears to be stuck!"
- return
- visible_message("[usr] tries to remove [src]'s [what.name].", \
- "[usr] tries to remove [src]'s [what.name].")
- what.add_fingerprint(usr)
- if(do_mob(usr, src, STRIP_DELAY))
- if(what && Adjacent(usr))
- unEquip(what)
+ usr.stripPanelUnequip(src,what,slot)
else
- what = usr.get_active_hand()
- if(what && (what.flags & NODROP))
- usr << "You can't put \the [what.name] on [src], it's stuck to your hand!"
- return
- if(what && what.mob_can_equip(src, slot, 1))
- visible_message("[usr] tries to put [what] on [src].")
- if(do_mob(usr, src, STRIP_DELAY * 0.5))
- if(what && Adjacent(usr))
- usr.unEquip(what)
- equip_to_slot_if_possible(what, slot, 0, 1)
+ usr.stripPanelEquip(src,what,slot)
if(usr.machine == src)
if(Adjacent(usr))
@@ -518,6 +501,15 @@ var/list/slot_equipment_priority = list( \
else
usr << browse(null,"window=mob\ref[src]")
+// The src mob is trying to strip an item from someone
+// Defined in living.dm
+/mob/proc/stripPanelUnequip(obj/item/what, mob/who)
+ return
+
+// The src mob is trying to place an item on someone
+// Defined in living.dm
+/mob/proc/stripPanelEquip(obj/item/what, mob/who)
+ return
/mob/MouseDrop(mob/M)
..()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index db189fb416d..768a451c616 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -351,7 +351,7 @@
///Return 1 for movement 0 for none
/mob/proc/Process_Spacemove(var/check_drift = 0)
//First check to see if we can do things
- if(restrained())
+ if(!canmove)
return 0
if(!isturf(loc)) //if they're in a disposal unit, for example
@@ -362,11 +362,6 @@
if(istype(turf,/turf/space))
continue
- if(istype(src,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to.
- if((istype(turf,/turf/simulated/floor)) && (!has_gravity(src)) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP)))
- continue
-
-
else
if((istype(turf,/turf/simulated/floor)) && (!has_gravity(src))) // No one else gets a chance.
continue
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 90f55715009..44bc38e6e04 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -37,7 +37,7 @@
/obj/structure/filingcabinet/attackby(obj/item/P, mob/user)
- if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo))
+ if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/documents))
user << "You put [P] in [src]."
user.drop_item()
P.loc = src
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 747272afe97..529d6ce79db 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -30,7 +30,7 @@
/obj/item/weapon/folder/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo))
+ if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/documents))
user.drop_item()
W.loc = src
user << "You put [W] into [src]."
@@ -44,10 +44,8 @@
/obj/item/weapon/folder/attack_self(mob/user)
var/dat = "[name]"
- for(var/obj/item/weapon/paper/P in src)
- dat += "Remove - [P.name]
"
- for(var/obj/item/weapon/photo/Ph in src)
- dat += "Remove - [Ph.name]
"
+ for(var/obj/item/I in src)
+ dat += "Remove - [I.name]
"
user << browse(dat, "window=folder")
onclose(user, "folder")
add_fingerprint(usr)
@@ -61,16 +59,45 @@
if(usr.contents.Find(src))
if(href_list["remove"])
- var/obj/item/P = locate(href_list["remove"])
- if(istype(P) && P.loc == src)
- P.loc = usr.loc
- usr.put_in_hands(P)
+ var/obj/item/I = locate(href_list["remove"])
+ if(istype(I) && I.loc == src)
+ I.loc = usr.loc
+ usr.put_in_hands(I)
if(href_list["read"])
- var/obj/item/weapon/paper/P = locate(href_list["read"])
- if(istype(P) && P.loc == src)
- P.examine()
+ var/obj/item/I = locate(href_list["read"])
+ if(istype(I) && I.loc == src)
+ I.examine()
//Update everything
attack_self(usr)
- update_icon()
\ No newline at end of file
+ update_icon()
+
+/obj/item/weapon/folder/documents
+ name = "folder- 'TOP SECRET'"
+ desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\""
+
+/obj/item/weapon/folder/documents/New()
+ ..()
+ new /obj/item/documents/nanotrasen(src)
+ update_icon()
+
+/obj/item/weapon/folder/syndicate
+ name = "folder- 'TOP SECRET'"
+ desc = "A folder stamped \"Top Secret - Property of The Syndicate.\""
+
+/obj/item/weapon/folder/syndicate/red
+ icon_state = "folder_sred"
+
+/obj/item/weapon/folder/syndicate/red/New()
+ ..()
+ new /obj/item/documents/syndicate/red(src)
+ update_icon()
+
+/obj/item/weapon/folder/syndicate/blue
+ icon_state = "folder_sblue"
+
+/obj/item/weapon/folder/syndicate/blue/New()
+ ..()
+ new /obj/item/documents/syndicate/blue(src)
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index b2663a00cdc..6c10e756d78 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -252,7 +252,7 @@
return
t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
-
+
if(t != null) //No input from the user means nothing needs to be added
if(id!="end")
addtofield(text2num(id), t) // He wants to edit a field, let him.
@@ -341,6 +341,10 @@
name = "paper- 'Official Bulletin'"
info = "
Centcom Security
Port Division
Official Bulletin
Inspector,
There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
Centcom Port Commissioner"
+/obj/item/weapon/paper/range
+ name = "paper- Firing Range Instructions"
+ info = "Directions:
First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.
This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.
Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:
N: North
S: South
E: East
W: West
C: Center
R: Random (results may vary)
; or &: separators. They are not necessary but can make the path string better visible."
+
/obj/item/weapon/paper/crumpled
name = "paper scrap"
icon_state = "scrap"
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 9735c4fbaa4..f119cecd678 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1183,13 +1183,8 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
return val
+
// damage and destruction acts
-
-/obj/machinery/power/apc/meteorhit(var/obj/O as obj)
-
- set_broken()
- return
-
/obj/machinery/power/apc/emp_act(severity)
if(cell)
cell.emp_act(severity)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index ba011c6777c..24091e18cbe 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -1,38 +1,37 @@
-// attach a wire to a power machine - leads from the turf you are standing on
+///////////////////////////////
+//CABLE STRUCTURE
+///////////////////////////////
-/obj/machinery/power/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/stack/cable_coil))
+////////////////////////////////
+// Definitions
+////////////////////////////////
- var/obj/item/stack/cable_coil/coil = W
+/* Cable directions (d1 and d2)
- var/turf/T = user.loc
- if(T.intact || !istype(T, /turf/simulated/floor))
- return
+ 9 1 5
+ \ | /
+ 8 - 0 - 4
+ / | \
+ 10 2 6
- if(get_dist(src, user) > 1)
- return
-
- if(!directwired) // only for attaching to directwired machines
- return
-
- coil.turf_place(T, user)
- return
- else
- ..()
- return
+If d1 = 0 and d2 = 0, there's no cable
+If d1 = 0 and d2 = dir, it's a O-X cable, getting from the center of the tile to dir (knot cable)
+If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2
+By design, d1 is the smallest direction and d2 is the highest
+*/
/obj/structure/cable
- level = 1
+ level = 1 //is underfloor
anchored =1
var/datum/powernet/powernet
name = "power cable"
desc = "A flexible superconducting cable for heavy-duty power transfer"
icon = 'icons/obj/power_cond/power_cond_red.dmi'
icon_state = "0-1"
- var/d1 = 0
- var/d2 = 1
+ var/d1 = 0 // cable direction 1 (see above)
+ var/d2 = 1 // cable direction 2 (see above)
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
var/cable_color = "red"
@@ -65,7 +64,6 @@
icon = 'icons/obj/power_cond/power_cond_white.dmi'
// the power cable object
-
/obj/structure/cable/New()
..()
@@ -81,16 +79,20 @@
var/turf/T = src.loc // hide if turf is not intact
if(level==1) hide(T.intact)
- cable_list += src
+ cable_list += src //add it to the global cable list
/obj/structure/cable/Destroy() // called when a cable is deleted
-// if(!defer_powernet_rebuild) // set if network will be rebuilt manually
if(powernet)
- powernet.cut_cable(src) // update the powernets
- cable_list -= src
- ..() // then go ahead and delete the cable
+ cut_cable_from_powernet() // update the powernets
+ cable_list -= src //remove it from global cable list
+ ..() // then go ahead and delete the cable
+///////////////////////////////////
+// General procedures
+///////////////////////////////////
+
+//If underfloor, hide the cable
/obj/structure/cable/hide(var/i)
if(level == 1 && istype(loc, /turf))
@@ -108,9 +110,15 @@
/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete
return powernet
+//Telekinesis has no effect on a cable
/obj/structure/cable/attack_tk(mob/user)
return
+// Items usable on a cable :
+// - Wirecutters : cut it duh !
+// - Cable coil : merge cables
+// - Multitool : get the power currently passing through the cable
+//
/obj/structure/cable/attackby(obj/item/W, mob/user)
var/turf/T = src.loc
@@ -142,10 +150,8 @@
else if(istype(W, /obj/item/device/multitool))
- var/datum/powernet/PN = get_powernet() // find the powernet
-
- if(PN && (PN.avail > 0)) // is it powered?
- user << "\red [PN.avail]W in power network."
+ if(powernet && (powernet.avail > 0)) // is it powered?
+ user << "\red [powernet.avail]W in power network."
else
user << "\red The cable is not powered."
@@ -159,7 +165,6 @@
src.add_fingerprint(user)
// shock the user with probability prb
-
/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0)
if(!prob(prb))
return 0
@@ -171,6 +176,7 @@
else
return 0
+//explosion handling
/obj/structure/cable/ex_act(severity)
switch(severity)
if(1.0)
@@ -186,9 +192,260 @@
qdel(src)
return
-// the cable coil object, used for laying cable
+obj/structure/cable/proc/cableColor(var/colorC)
+ var/color_n = "red"
+ if(colorC)
+ color_n = colorC
+ cable_color = color_n
+ switch(colorC)
+ if("red")
+ icon = 'icons/obj/power_cond/power_cond_red.dmi'
+ if("yellow")
+ icon = 'icons/obj/power_cond/power_cond_yellow.dmi'
+ if("green")
+ icon = 'icons/obj/power_cond/power_cond_green.dmi'
+ if("blue")
+ icon = 'icons/obj/power_cond/power_cond_blue.dmi'
+ if("pink")
+ icon = 'icons/obj/power_cond/power_cond_pink.dmi'
+ if("orange")
+ icon = 'icons/obj/power_cond/power_cond_orange.dmi'
+ if("cyan")
+ icon = 'icons/obj/power_cond/power_cond_cyan.dmi'
+ if("white")
+ icon = 'icons/obj/power_cond/power_cond_white.dmi'
+
+////////////////////////////////////////////
+// Power related
+///////////////////////////////////////////
+
+obj/structure/cable/proc/add_avail(var/amount)
+ if(powernet)
+ powernet.newavail += amount
+
+obj/structure/cable/proc/add_load(var/amount)
+ if(powernet)
+ powernet.newload += amount
+
+obj/structure/cable/proc/surplus()
+ if(powernet)
+ return powernet.avail-powernet.load
+ else
+ return 0
+
+obj/structure/cable/proc/avail()
+ if(powernet)
+ return powernet.avail
+ else
+ return 0
+
+/////////////////////////////////////////////////
+// Cable laying helpers
+////////////////////////////////////////////////
+
+//handles merging diagonally matching cables
+//for info : direction^3 is flipping horizontally, direction^12 is flipping vertically
+/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction)
+
+ //search for and merge diagonally matching cables from the first direction component (north/south)
+ var/turf/T = get_step(src, direction&3)//go north/south
+
+ for(var/obj/structure/cable/C in T)
+
+ if(!C)
+ continue
+
+ if(src == C)
+ continue
+
+ if(C.d1 == (direction^3) || C.d2 == (direction^3)) //we've got a diagonally matching cable
+ if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
+ var/datum/powernet/newPN = new()
+ newPN.add_cable(C)
+
+ if(powernet) //if we already have a powernet, then merge the two powernets
+ merge_powernets(powernet,C.powernet)
+ else
+ C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
+
+ //the same from the second direction component (east/west)
+ T = get_step(src, direction&12)//go east/west
+
+ for(var/obj/structure/cable/C in T)
+
+ if(!C)
+ continue
+
+ if(src == C)
+ continue
+ if(C.d1 == (direction^12) || C.d2 == (direction^12)) //we've got a diagonally matching cable
+ if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
+ var/datum/powernet/newPN = new()
+ newPN.add_cable(C)
+
+ if(powernet) //if we already have a powernet, then merge the two powernets
+ merge_powernets(powernet,C.powernet)
+ else
+ C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
+
+// merge with the powernets of power objects in the given direction
+/obj/structure/cable/proc/mergeConnectedNetworks(var/direction)
+
+ var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf
+
+ if(!(d1 == direction || d2 == direction)) //if the cable is not pointed in this direction, do nothing
+ return
+
+ var/turf/TB = get_step(src, direction)
+
+ for(var/obj/structure/cable/C in TB)
+
+ if(!C)
+ continue
+
+ if(src == C)
+ continue
+
+ if(C.d1 == fdir || C.d2 == fdir) //we've got a matching cable in the neighbor turf
+ if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
+ var/datum/powernet/newPN = new()
+ newPN.add_cable(C)
+
+ if(powernet) //if we already have a powernet, then merge the two powernets
+ merge_powernets(powernet,C.powernet)
+ else
+ C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
+
+// merge with the powernets of power objects in the source turf
+/obj/structure/cable/proc/mergeConnectedNetworksOnTurf()
+ if(!powernet) //if we somehow have no powernet, make one (should not happen for cables)
+ var/datum/powernet/newPN = new()
+ newPN.add_cable(src)
+
+ for(var/AM in loc)
+ if(istype(AM,/obj/structure/cable))
+ var/obj/structure/cable/C = AM
+ if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction
+ if(C.powernet == powernet) continue
+ if(C.powernet)
+ merge_powernets(powernet, C.powernet)
+ else
+ powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet
+
+ else if(istype(AM,/obj/machinery/power/apc))
+ var/obj/machinery/power/apc/N = AM
+ if(!N.terminal) continue // APC are connected through their terminal
+ if(N.terminal.powernet)
+ merge_powernets(powernet, N.terminal.powernet)
+ else
+ powernet.add_machine(N.terminal)
+
+ else if(istype(AM,/obj/machinery/power)) //other power machines
+ var/obj/machinery/power/M = AM
+ if(M.powernet == powernet) continue
+ if(M.powernet)
+ merge_powernets(powernet, M.powernet)
+ else
+ powernet.add_machine(M)
+
+//////////////////////////////////////////////
+// Powernets handling helpers
+//////////////////////////////////////////////
+
+//if powernetless_only = 1, will only get connections without powernet
+/obj/structure/cable/proc/get_connections(var/powernetless_only = 0)
+ . = list() // this will be a list of all connected power objects
+ var/turf/T
+
+ //get matching cables from the first direction
+ if(d1) //if not a node cable
+ T = get_step(src, d1)
+ if(T)
+ . += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables
+
+ if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles
+ T = get_step(src,d1&3) // go north/south
+ if(T)
+ . += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables
+ T = get_step(src,d1&12) // go east/west
+ if(T)
+ . += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables
+
+ . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables
+
+ //do the same on the second direction (which can't be 0)
+ T = get_step(src, d2)
+ if(T)
+ . += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables
+
+ if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles
+ T = get_step(src,d2&3) // go north/south
+ if(T)
+ . += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables
+ T = get_step(src,d2&12) // go east/west
+ if(T)
+ . += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables
+ . += power_list(loc, src, d2, powernetless_only) //get on turf matching cables
+
+ return .
+
+//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf.
+//needed as this can, unlike other placements, disconnect cables
+/obj/structure/cable/proc/denode()
+ var/turf/T1 = loc
+ if(!T1) return
+
+ var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet
+ if(powerlist.len>0)
+ var/datum/powernet/PN = new()
+ propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable
+
+ if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables
+ qdel(PN)
+
+// cut the cable's powernet at this cable and updates the powergrid
+/obj/structure/cable/proc/cut_cable_from_powernet()
+ var/turf/T1 = loc
+ var/list/P_list
+ if(!T1) return
+ if(d1)
+ T1 = get_step(T1, d1)
+ P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable...
+
+ P_list += power_list(loc, src, d1, 0, cable_only = 1)//... and on turf
+
+
+ if(P_list.len == 0)//if nothing in both list, then the cable was a lone cable, just delete it and its powernet
+ powernet.remove_cable(src)
+
+ for(var/obj/machinery/power/P in T1)//check if it was powering a machine
+ if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to
+ P.disconnect_from_network() //remove from current network (and delete powernet)
+ return
+
+ // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
+ loc = null
+ powernet.remove_cable(src) //remove the cut cable from its powernet
+
+ var/datum/powernet/newPN = new()// creates a new powernet...
+ propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
+
+ // Disconnect machines connected to nodes
+ if(d1 == 0) // if we cut a node (O-X) cable
+ for(var/obj/machinery/power/P in T1)
+ if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to
+ P.disconnect_from_network() //remove from current network
+
+///////////////////////////////////////////////
+// The cable coil object, used for laying cable
+///////////////////////////////////////////////
+
+////////////////////////////////
+// Definitions
+////////////////////////////////
#define MAXCOIL 30
+
/obj/item/stack/cable_coil
name = "cable coil"
icon = 'icons/obj/power.dmi'
@@ -207,13 +464,27 @@
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
- suicide_act(mob/user)
- if(locate(/obj/structure/stool) in user.loc)
- viewers(user) << "[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide."
- else
- viewers(user) << "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide."
- return(OXYLOSS)
+/obj/item/stack/cable_coil/suicide_act(mob/user)
+ if(locate(/obj/structure/stool) in user.loc)
+ user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.")
+ else
+ user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ return(OXYLOSS)
+/obj/item/stack/cable_coil/New(loc, amount = MAXCOIL, var/param_color = null)
+ ..()
+ src.amount = amount
+ if (param_color)
+ item_color = param_color
+ pixel_x = rand(-2,2)
+ pixel_y = rand(-2,2)
+ update_icon()
+
+///////////////////////////////////
+// General procedures
+///////////////////////////////////
+
+//you can use wires to heal robotics
/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user)
if(!istype(H))
return ..()
@@ -226,14 +497,6 @@
else
return ..()
-/obj/item/stack/cable_coil/New(loc, amount = MAXCOIL, var/param_color = null)
- ..()
- src.amount = amount
- if (param_color)
- item_color = param_color
- pixel_x = rand(-2,2)
- pixel_y = rand(-2,2)
- update_icon()
/obj/item/stack/cable_coil/update_icon()
if (!item_color)
@@ -248,6 +511,7 @@
icon_state = "coil_[item_color]"
name = "cable coil"
+
/obj/item/stack/cable_coil/examine()
set src in view(1)
@@ -258,6 +522,7 @@
else
usr << "A coil of power cable. There are [amount] lengths of cable in the coil."
+
/obj/item/stack/cable_coil/verb/make_restraint()
set name = "Make Cable Restraints"
set category = "Object"
@@ -276,6 +541,9 @@
usr << "\blue You cannot do that."
..()
+// Items usable on a cable coil :
+// - Wirecutters : cut them duh !
+// - Cable coil : merge cables
/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user)
..()
if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1)
@@ -304,6 +572,7 @@
src.use(amt)
return
+//remove cables from the stack
/obj/item/stack/cable_coil/use(var/used)
if(src.amount < used)
return 0
@@ -318,6 +587,7 @@
update_icon()
return 1
+//add cables to the stack
/obj/item/stack/cable_coil/proc/give(var/extra)
if(amount + extra > MAXCOIL)
amount = MAXCOIL
@@ -325,14 +595,16 @@
amount += extra
update_icon()
+///////////////////////////////////////////////
+// Cable laying procedures
+//////////////////////////////////////////////
+
// called when cable_coil is clicked on a turf/simulated/floor
-
/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user)
-
if(!isturf(user.loc))
return
- if(get_dist(F,user) > 1)
+ if(get_dist(F,user) > 1) //too far
user << "You can't lay cable at a place that far away."
return
@@ -349,7 +621,7 @@
dirn = get_dir(F, user)
for(var/obj/structure/cable/LC in F)
- if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
+ if(LC.d2 == dirn && LC.d1 == 0)
user << "There's already a cable at that position."
return
@@ -357,32 +629,33 @@
C.cableColor(item_color)
- C.d1 = 0
+ //set up the new cable
+ C.d1 = 0 //it's a O-X node cable
C.d2 = dirn
C.add_fingerprint(user)
C.updateicon()
- C.powernet = new()
- powernets += C.powernet
- C.powernet.cables += C
+ //create a new powernet with the cable, if needed it will be merged later
+ var/datum/powernet/PN = new()
+ PN.add_cable(C)
- C.mergeConnectedNetworks(C.d2)
- C.mergeConnectedNetworksOnTurf()
+ C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
+ C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
+
+ if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ C.mergeDiagonalsNetworks(C.d2)
use(1)
+
if (C.shock(user, 50))
if (prob(50)) //fail
new/obj/item/stack/cable_coil(C.loc, 1, C.cable_color)
qdel(C)
- //src.laying = 1
- //last = C
-
// called when cable_coil is click on an installed obj/cable
-
+// or click on a turf that already contains a "node" cable
/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user)
-
var/turf/U = user.loc
if(!isturf(U))
return
@@ -397,12 +670,14 @@
return
- if(U == T) // do nothing if we clicked a cable we're standing on
- return // may change later if can think of something logical to do
+ if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing
+ turf_place(T,user)
+ return
var/dirn = get_dir(C, user)
- if(C.d1 == dirn || C.d2 == dirn) // one end of the clicked cable is pointing towards us
+ // one end of the clicked cable is pointing towards us
+ if(C.d1 == dirn || C.d2 == dirn)
if(U.intact) // can't place a cable if the floor is complete
user << "You can't lay cable there unless the floor tiles are removed."
return
@@ -425,19 +700,27 @@
NC.add_fingerprint()
NC.updateicon()
- if(C.powernet)
- NC.powernet = C.powernet
- NC.powernet.cables += NC
- NC.mergeConnectedNetworks(NC.d2)
- NC.mergeConnectedNetworksOnTurf()
+ //create a new powernet with the cable, if needed it will be merged later
+ var/datum/powernet/newPN = new()
+ newPN.add_cable(NC)
+
+ NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets
+ NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
+
+ if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ NC.mergeDiagonalsNetworks(NC.d2)
+
use(1)
+
if (NC.shock(user, 50))
if (prob(50)) //fail
new/obj/item/stack/cable_coil(NC.loc, 1, NC.cable_color)
qdel(NC)
return
- else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub
+
+ // exisiting cable doesn't point at our position, so see if it's a stub
+ else if(C.d1 == 0)
// if so, make it a full cable pointing from it's old direction to our dirn
var/nd1 = C.d2 // these will be the new directions
var/nd2 = dirn
@@ -465,11 +748,18 @@
C.updateicon()
- C.mergeConnectedNetworks(C.d1)
- C.mergeConnectedNetworks(C.d2)
+ C.mergeConnectedNetworks(C.d1) //merge the powernets...
+ C.mergeConnectedNetworks(C.d2) //...in the two new cable directions
C.mergeConnectedNetworksOnTurf()
+ if(C.d1 & (C.d1 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ C.mergeDiagonalsNetworks(C.d1)
+
+ if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ C.mergeDiagonalsNetworks(C.d2)
+
use(1)
+
if (C.shock(user, 50))
if (prob(50)) //fail
new/obj/item/stack/cable_coil(C.loc, 2, C.cable_color)
@@ -479,116 +769,9 @@
C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets.
return
-/obj/structure/cable/proc/mergeConnectedNetworks(var/direction)
- var/turf/TB
- if(!(d1 == direction || d2 == direction))
- return
- TB = get_step(src, direction)
-
- for(var/obj/structure/cable/TC in TB)
-
- if(!TC)
- continue
-
- if(src == TC)
- continue
-
- var/fdir = (!direction)? 0 : turn(direction, 180)
-
- if(TC.d1 == fdir || TC.d2 == fdir)
-
- if(!TC.powernet)
- TC.powernet = new()
- powernets += TC.powernet
- TC.powernet.cables += TC
-
- if(powernet)
- merge_powernets(powernet,TC.powernet)
- else
- powernet = TC.powernet
- powernet.cables += src
-
-
-
-
-/obj/structure/cable/proc/mergeConnectedNetworksOnTurf()
- if(!powernet)
- powernet = new()
- powernets += powernet
- powernet.cables += src
-
- for(var/AM in loc)
- if(istype(AM,/obj/structure/cable))
- var/obj/structure/cable/C = AM
- if(C.d1 == 0 && d1==0) //only connected if they are both "nodes"
- if(C.powernet == powernet) continue
- if(C.powernet)
- merge_powernets(powernet, C.powernet)
- else
- C.powernet = powernet
- powernet.cables += C
-
- else if(istype(AM,/obj/machinery/power/apc))
- var/obj/machinery/power/apc/N = AM
- if(!N.terminal) continue
- if(N.terminal.powernet)
- merge_powernets(powernet, N.terminal.powernet)
- else
- N.terminal.powernet = powernet
- powernet.nodes[N.terminal] = N.terminal
-
- else if(istype(AM,/obj/machinery/power))
- var/obj/machinery/power/M = AM
- if(M.powernet == powernet) continue
- if(M.powernet)
- merge_powernets(powernet, M.powernet)
- else
- M.powernet = powernet
- powernet.nodes[M] = M
-
-
-obj/structure/cable/proc/cableColor(var/colorC)
- var/color_n = "red"
- if(colorC)
- color_n = colorC
- cable_color = color_n
- switch(colorC)
- if("red")
- icon = 'icons/obj/power_cond/power_cond_red.dmi'
- if("yellow")
- icon = 'icons/obj/power_cond/power_cond_yellow.dmi'
- if("green")
- icon = 'icons/obj/power_cond/power_cond_green.dmi'
- if("blue")
- icon = 'icons/obj/power_cond/power_cond_blue.dmi'
- if("pink")
- icon = 'icons/obj/power_cond/power_cond_pink.dmi'
- if("orange")
- icon = 'icons/obj/power_cond/power_cond_orange.dmi'
- if("cyan")
- icon = 'icons/obj/power_cond/power_cond_cyan.dmi'
- if("white")
- icon = 'icons/obj/power_cond/power_cond_white.dmi'
-
-obj/structure/cable/proc/add_avail(var/amount)
- if(powernet)
- powernet.newavail += amount
-
-obj/structure/cable/proc/add_load(var/amount)
- if(powernet)
- powernet.newload += amount
-
-obj/structure/cable/proc/surplus()
- if(powernet)
- return powernet.avail-powernet.load
- else
- return 0
-
-obj/structure/cable/proc/avail()
- if(powernet)
- return powernet.avail
- else
- return 0
+//////////////////////////////
+// Misc.
+/////////////////////////////
/obj/item/stack/cable_coil/cut
item_state = "coil_red2"
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index efec21ace44..95bb4dec398 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -32,9 +32,6 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(severity == 1) // Very sturdy.
set_broken()
-/obj/machinery/gravity_generator/meteorhit()
- return
-
/obj/machinery/gravity_generator/update_icon()
..()
icon_state = "[get_status()]_[sprite_number]"
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 793179a1664..e67982bd887 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -1,10 +1,17 @@
+//////////////////////////////
+// POWER MACHINERY BASE CLASS
+//////////////////////////////
+
+/////////////////////////////
+// Definitions
+/////////////////////////////
+
/obj/machinery/power
name = null
icon = 'icons/obj/power.dmi'
anchored = 1.0
var/datum/powernet/powernet = null
- var/directwired = 1 // by default, power machines are connected by a cable in a neighbouring turf
- // if set to 0, requires a 0-X cable on this turf
+ var/directwired = 1 // TODEL
use_power = 0
idle_power_usage = 0
active_power_usage = 0
@@ -13,6 +20,10 @@
disconnect_from_network()
..()
+///////////////////////////////
+// General procedures
+//////////////////////////////
+
// common helper procs for all power machines
/obj/machinery/power/proc/add_avail(var/amount)
if(powernet)
@@ -39,8 +50,7 @@
// returns true if the area has power on given channel (or doesn't require power).
// defaults to power_channel
-
-/obj/machinery/proc/powered(var/chan = -1)
+/obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel
if(!src.loc)
return 0
@@ -56,7 +66,6 @@
return A.master.powered(chan) // return power status of the area
// increment the power usage stats for an area
-
/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel
var/area/A = get_area(src) // make sure it's in an area
if(!A || !isarea(A) || !A.master)
@@ -75,98 +84,63 @@
stat |= NOPOWER
return
+// connect the machine to a powernet if a node cable is present on the turf
+/obj/machinery/power/proc/connect_to_network()
+ var/turf/T = src.loc
+ if(!T || !istype(T))
+ return 0
-// the powernet datum
-// each contiguous network of cables & nodes
+ var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked
+ if(!C || !C.powernet)
+ return 0
+ C.powernet.add_machine(src)
+ return 1
-// rebuild all power networks from scratch
+// remove and disconnect the machine from its current powernet
+/obj/machinery/power/proc/disconnect_from_network()
+ if(!powernet)
+ return 0
+ powernet.remove_machine(src)
+ return 1
-/proc/makepowernets()
- for(var/datum/powernet/PN in powernets)
- del(PN)
- powernets.Cut()
+// attach a wire to a power machine - leads from the turf you are standing on
+//almost never called, overwritten by all power machines but terminal and generator
+/obj/machinery/power/attackby(obj/item/weapon/W, mob/user)
- for(var/obj/structure/cable/PC in cable_list)
- if(!PC.powernet)
- PC.powernet = new()
- powernets += PC.powernet
-// if(Debug) world.log << "Starting mpn at [PC.x],[PC.y] ([PC.d1]/[PC.d2])"
- powernet_nextlink(PC,PC.powernet)
+ if(istype(W, /obj/item/stack/cable_coil))
-// if(Debug) world.log << "[powernets.len] powernets found"
+ var/obj/item/stack/cable_coil/coil = W
- for(var/obj/structure/cable/C in cable_list)
- if(!C.powernet) continue
- C.powernet.cables += C
+ var/turf/T = user.loc
- for(var/obj/machinery/power/M in machines)
- M.connect_to_network()
+ if(T.intact || !istype(T, /turf/simulated/floor))
+ return
+ if(get_dist(src, user) > 1)
+ return
-// returns a list of all power-related objects (nodes, cable, junctions) in turf,
-// excluding source, that match the direction d
-// if unmarked==1, only return those with no powernet
-/proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0)
- . = list()
- var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0)
-// world.log << "d=[d] fdir=[fdir]"
- for(var/AM in T)
- if(AM == source) continue //we don't want to return source
+ coil.turf_place(T, user)
+ return
+ else
+ ..()
+ return
- if(istype(AM,/obj/machinery/power))
- var/obj/machinery/power/P = AM
- if(P.powernet == 0) continue // exclude APCs which have powernet=0
-
- if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet
- if(P.directwired || (d == 0))
- . += P
-
- else if(istype(AM,/obj/structure/cable))
- var/obj/structure/cable/C = AM
-
- if(!unmarked || !C.powernet)
- if(C.d1 == fdir || C.d2 == fdir)
- . += C
- return .
-
-
-/obj/structure/cable/proc/get_connections()
- . = list() // this will be a list of all connected power objects
- var/turf/T = loc
-
- if(d1) T = get_step(src, d1)
- if(T) . += power_list(T, src, d1, 1)
-
- T = get_step(src, d2)
- if(T) . += power_list(T, src, d2, 1)
-
- return .
-
-// will get both marked and unmarked connections
-/obj/structure/cable/proc/get_marked_connections()
- . = list() // this will be a list of all connected power objects
- var/turf/T = loc
-
- if(d1) T = get_step(src, d1)
- if(T) . += power_list(T, src, d1, 0)
-
- T = get_step(src, d2)
- if(T) . += power_list(T, src, d2, 0)
-
- return .
+///////////////////////////////////////////
+// Powernet handling helpers
+//////////////////////////////////////////
+//returns all the cables WITHOUT a powernet in neighbors turfs,
+//pointing towards the turf the machine is located at
/obj/machinery/power/proc/get_connections()
. = list()
- if(!directwired)
- return get_indirect_connections()
-
var/cdir
+ var/turf/T
for(var/card in cardinal)
- var/turf/T = get_step(loc,card)
+ T = get_step(loc,card)
cdir = get_dir(T,loc)
for(var/obj/structure/cable/C in T)
@@ -175,17 +149,17 @@
. += C
return .
+//returns all the cables in neighbors turfs,
+//pointing towards the turf the machine is located at
/obj/machinery/power/proc/get_marked_connections()
. = list()
- if(!directwired)
- return get_indirect_connections()
-
var/cdir
+ var/turf/T
for(var/card in cardinal)
- var/turf/T = get_step(loc,card)
+ T = get_step(loc,card)
cdir = get_dir(T,loc)
for(var/obj/structure/cable/C in T)
@@ -193,270 +167,98 @@
. += C
return .
+//returns all the NODES (O-X) cables WITHOUT a powernet in the turf the machine is located at
/obj/machinery/power/proc/get_indirect_connections()
. = list()
for(var/obj/structure/cable/C in loc)
if(C.powernet) continue
- if(C.d1 == 0)
+ if(C.d1 == 0) // the cable is a node cable
. += C
return .
+///////////////////////////////////////////
+// GLOBAL PROCS for powernets handling
+//////////////////////////////////////////
-/proc/powernet_nextlink(var/obj/O, var/datum/powernet/PN)
- var/list/P = list()
- while(1)
- if( istype(O,/obj/structure/cable) )
- var/obj/structure/cable/C = O
- C.powernet = PN
- P = C.get_connections()
+// returns a list of all power-related objects (nodes, cable, junctions) in turf,
+// excluding source, that match the direction d
+// if unmarked==1, only return those with no powernet
+/proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0, var/cable_only = 0)
+ . = list()
+ //var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0)
- else if(O.anchored && istype(O,/obj/machinery/power))
- var/obj/machinery/power/M = O
- M.powernet = PN
- P = M.get_connections()
+ for(var/AM in T)
+ if(AM == source) continue //we don't want to return source
- else
- return
+ if(!cable_only && istype(AM,/obj/machinery/power))
+ var/obj/machinery/power/P = AM
+ if(P.powernet == 0) continue // exclude APCs which have powernet=0
- if(P.len == 0) return
+ if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet
+ if(d == 0)
+ . += P
- O = P[1]
+ else if(istype(AM,/obj/structure/cable))
+ var/obj/structure/cable/C = AM
- for(var/L = 2 to P.len)
- powernet_nextlink(P[L], PN)
+ if(!unmarked || !C.powernet)
+ if(C.d1 == d || C.d2 == d)
+ . += C
+ return .
+
+
+// rebuild all power networks from scratch - only called at world creation or by the admin verb
+/proc/makepowernets()
+ for(var/datum/powernet/PN in powernets)
+ del(PN)
+ powernets.Cut()
+
+ for(var/obj/structure/cable/PC in cable_list)
+ if(!PC.powernet)
+ PC.powernet = new()
+ propagate_network(PC,PC.powernet)
//remove the old powernet and replace it with a new one throughout the network.
/proc/propagate_network(var/obj/O, var/datum/powernet/PN)
//world.log << "propagating new network"
var/list/worklist = list()
- worklist+=O
+ var/list/found_machines = list()
var/index = 1
- while(index<=worklist.len)
- var/obj/P = worklist[index++]
+ var/obj/P = null
+
+ worklist+=O //start propagating from the passed object
+
+ while(index<=worklist.len) //until we've exhausted all power objects
+ P = worklist[index] //get the next power object found
+ index++
+
if( istype(P,/obj/structure/cable))
- //world.log << "is cable"
var/obj/structure/cable/C = P
- if(C.powernet==PN)
- //world.log << "already has correct network"
- continue
- //world.log << "removing from old powernet[C.powernet]"
- C.powernet.cables-=C
- C.powernet = PN
- PN.cables+=C
- for(var/obj/newP in C.get_marked_connections())
- worklist+=newP
- //world.log << "found [P.len] children"
+ if(C.powernet != PN) //add it to the powernet, if it isn't already there
+ PN.add_cable(C)
+ worklist |= C.get_connections() //get adjacents power objects, with or without a powernet
+
else if(P.anchored && istype(P,/obj/machinery/power))
- //world.log << "is machine"
var/obj/machinery/power/M = P
- if(M.powernet==PN)
- //world.log << "already has correct network"
- continue
- //world.log << "removing from old powernet[M.powernet]"
- M.powernet.nodes-=M
- M.powernet = PN
- PN.nodes+=M
- for(var/obj/newP in M.get_marked_connections())
- worklist+=newP
- //world.log << "found [P.len] children"
+ found_machines |= M //we wait until the powernet is fully propagates to connect the machines
+
else
continue
-//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf.
-//needed as this can, unlike other placements, disconnect cables
-/obj/structure/cable/proc/denode()
- //world.log << "denoding"
- var/turf/T1 = loc
- if(!T1) return
- var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf
- //world.log << "found [powerlist.len] power items, picking the first"
- var/datum/powernet/oldPN = powernet
- var/datum/powernet/PN = new()
- powernets+=PN
- if(powerlist.len>0)
- propagate_network(powerlist[1],PN)
- if(oldPN.cables.len==0&&oldPN.nodes.len==0)
- //world.log << "There was a loop, so the old powernet was destroyed, removing it"
- powernets-=oldPN
-// cut a powernet at this cable object
-/datum/powernet/proc/cut_cable(var/obj/structure/cable/C)
- var/turf/T1 = C.loc
- if(!T1) return
- var/node = 0
- if(C.d1 == 0)
- node = 1
-
- var/turf/T2
- if(C.d2) T2 = get_step(T1, C.d2)
- if(C.d1) T1 = get_step(T1, C.d1)
+ //now that the powernet is set, connect found machines to it
+ for(var/obj/machinery/power/PM in found_machines)
+ if(!PM.connect_to_network()) //couldn't find a node on its turf...
+ PM.disconnect_from_network() //... so disconnect if already on a powernet
- var/list/P1 = power_list(T1, C, C.d1) // what joins on to cut cable in dir1
- var/list/P2 = power_list(T2, C, C.d2) // what joins on to cut cable in dir2
-
-// if(Debug)
-// for(var/obj/O in P1)
-// world.log << "P1: [O] at [O.x] [O.y] : [istype(O, /obj/structure/cable) ? "[O:d1]/[O:d2]" : null] "
-// for(var/obj/O in P2)
-// world.log << "P2: [O] at [O.x] [O.y] : [istype(O, /obj/structure/cable) ? "[O:d1]/[O:d2]" : null] "
-
-
- if(P1.len == 0 || P2.len == 0)//if nothing in either list, then the cable was an endpoint no need to rebuild the powernet,
- cables -= C //just remove cut cable from the list
-// if(Debug) world.log << "Was end of cable"
+//Merge two powernets, the bigger (in cable length term) absorbing the other
+/proc/merge_powernets(var/datum/powernet/net1, var/datum/powernet/net2)
+ if(!net1 || !net2) //if one of the powernet doesn't exist, return
return
- //null the powernet reference of all cables & nodes in this powernet
- var/i=1
- while(i<=cables.len)
- var/obj/structure/cable/Cable = cables[i]
- if(Cable)
- Cable.powernet = null
- if(Cable == C)
- cables.Cut(i,i+1)
- continue
- i++
- i=1
- while(i<=nodes.len)
- var/obj/machinery/power/Node = nodes[i]
- if(Node)
- Node.powernet = null
- i++
-
- // remove the cut cable from the network
-// C.netnum = -1
-
- C.loc = null
-
- powernet_nextlink(P1[1], src) // propagate network from 1st side of cable, using current netnum //TODO?
-
- // now test to see if propagation reached to the other side
- // if so, then there's a loop in the network
- var/notlooped = 0
- for(var/O in P2)
- if( istype(O, /obj/machinery/power) )
- var/obj/machinery/power/Machine = O
- if(Machine.powernet != src)
- notlooped = 1
- break
- else if( istype(O, /obj/structure/cable) )
- var/obj/structure/cable/Cable = O
- if(Cable.powernet != src)
- notlooped = 1
- break
-
- if(notlooped)
- // not looped, so make a new powernet
- var/datum/powernet/PN = new()
- powernets += PN
-
-// if(Debug) world.log << "Was not looped: spliting PN#[number] ([cables.len];[nodes.len])"
-
- i=1
- while(i<=cables.len)
- var/obj/structure/cable/Cable = cables[i]
- if(Cable && !Cable.powernet) // non-connected cables will have powernet=null, since they weren't reached by propagation
- Cable.powernet = PN
- cables.Cut(i,i+1) // remove from old network & add to new one
- PN.cables += Cable
- continue
- i++
-
- i=1
- while(i<=nodes.len)
- var/obj/machinery/power/Node = nodes[i]
- if(Node && !Node.powernet)
- Node.powernet = PN
- nodes.Cut(i,i+1)
- PN.nodes[Node] = Node
- continue
- i++
-
- // Disconnect machines connected to nodes
- if(node)
- for(var/obj/machinery/power/P in T1)
- if(P.powernet && !P.powernet.nodes[src])
- P.disconnect_from_network()
-// if(Debug)
-// world.log << "Old PN#[number] : ([cables.len];[nodes.len])"
-// world.log << "New PN#[PN.number] : ([PN.cables.len];[PN.nodes.len])"
-//
-// else
-// if(Debug)
-// world.log << "Was looped."
-// //there is a loop, so nothing to be done
-// return
-
-
-
-/datum/powernet/proc/reset()
- load = newload
- newload = 0
- avail = newavail
- newavail = 0
-
-
- viewload = 0.8*viewload + 0.2*load
-
- viewload = round(viewload)
-
- var/numapc = 0
-
- if(nodes && nodes.len)
- for(var/obj/machinery/power/terminal/term in nodes)
- if( istype( term.master, /obj/machinery/power/apc ) )
- numapc++
-
- if(numapc)
- perapc = avail/numapc
-
- netexcess = avail - load
-
- if( netexcess > 100) // if there was excess power last cycle
- if(nodes && nodes.len)
- for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
- if(S.powernet == src)
- S.restore() // and restore some of the power that was used
- else
- error("[S.name] (\ref[S]) had a [S.powernet ? "different (\ref[S.powernet])" : "null"] powernet to our powernet (\ref[src]).") //this line is a faggot and using the normal ERROR proc breaks it
- nodes.Remove(S)
-
-/datum/powernet/proc/get_electrocute_damage()
- switch(avail)/*
- if (1300000 to INFINITY)
- return min(rand(70,150),rand(70,150))
- if (750000 to 1300000)
- return min(rand(50,115),rand(50,115))
- if (100000 to 750000-1)
- return min(rand(35,101),rand(35,101))
- if (75000 to 100000-1)
- return min(rand(30,95),rand(30,95))
- if (50000 to 75000-1)
- return min(rand(25,80),rand(25,80))
- if (25000 to 50000-1)
- return min(rand(20,70),rand(20,70))
- if (10000 to 25000-1)
- return min(rand(20,65),rand(20,65))
- if (1000 to 10000-1)
- return min(rand(10,20),rand(10,20))*/
- if (1000000 to INFINITY)
- return min(rand(50,160),rand(50,160))
- if (200000 to 1000000)
- return min(rand(25,80),rand(25,80))
- if (100000 to 200000)//Ave powernet
- return min(rand(20,60),rand(20,60))
- if (50000 to 100000)
- return min(rand(15,40),rand(15,40))
- if (1000 to 50000)
- return min(rand(10,20),rand(10,20))
- else
- return 0
-
-//The powernet that calls this proc will consume the other powernet
-/proc/merge_powernets(var/datum/powernet/net1, var/datum/powernet/net2)
- if(!net1 || !net2) return
- if(net1 == net2) return
+ if(net1 == net2) //don't merge same powernets
+ return
//We assume net1 is larger. If net2 is in fact larger we are just going to make them switch places to reduce on code.
if(net1.cables.len < net2.cables.len) //net2 is larger than net1. Let's switch them around
@@ -464,56 +266,24 @@
net1 = net2
net2 = temp
+ //we don't use add_cable and add_machine here, because that could
+ //change the size of net2.nodes or net2.cables while in the loop (runtime galore)
for(var/i=1,i<=net2.nodes.len,i++) //merge net2 into net1
- var/obj/machinery/power/Node = net2.nodes[i]
+ var/obj/machinery/power/Node = net2.nodes[i] //merge power machines
if(Node)
Node.powernet = net1
net1.nodes[Node] = Node
for(var/i=1,i<=net2.cables.len,i++)
- var/obj/structure/cable/Cable = net2.cables[i]
+ var/obj/structure/cable/Cable = net2.cables[i] //merge cables
if(Cable)
Cable.powernet = net1
net1.cables += Cable
- del(net2)
+ qdel(net2) //garbage collect the now empty powernet
+
return net1
-
-/obj/machinery/power/proc/connect_to_network()
- var/turf/T = src.loc
- if(!T || !istype(T)) return 0
- var/obj/structure/cable/C = T.get_cable_node()
- if(!C || !C.powernet) return 0
-// makepowernets() //TODO: find fast way //EWWWW what are you doing!?
- powernet = C.powernet
- powernet.nodes[src] = src
- return 1
-
-/obj/machinery/power/proc/disconnect_from_network()
- if(!powernet)
- //world << " no powernet"
- return 0
- powernet.nodes -= src
- powernet = null
- //world << "powernet null"
- return 1
-
-/turf/proc/get_cable_node()
- if(!istype(src, /turf/simulated/floor))
- return null
- for(var/obj/structure/cable/C in src)
- if(C.d1 == 0)
- return C
- return null
-
-/area/proc/get_apc()
- for(var/area/RA in src.related)
- var/obj/machinery/power/apc/FINDME = locate() in RA
- if (FINDME)
- return FINDME
-
-
//Determines how strong could be shock, deals damage to mob, uses power.
//M is a mob who touched wire/whatever
//power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null
@@ -579,3 +349,143 @@
cell.use(drained_energy)
return drained_energy
+////////////////////////////////////////////
+// POWERNET DATUM PROCS
+// each contiguous network of cables & nodes
+////////////////////////////////////////////
+
+/datum/powernet/New()
+ powernets += src
+
+/datum/powernet/Destroy()
+ powernets -= src
+
+/datum/powernet/proc/is_empty()
+ return !cables.len && !nodes.len
+
+//remove a cable from the current powernet
+//if the powernet is then empty, delete it
+//Warning : this proc DON'T check if the cable exists
+/datum/powernet/proc/remove_cable(var/obj/structure/cable/C)
+ cables -= C
+ C.powernet = null
+ if(is_empty())//the powernet is now empty...
+ qdel(src)///... delete it
+
+//add a cable to the current powernet
+//Warning : this proc DON'T check if the cable exists
+/datum/powernet/proc/add_cable(var/obj/structure/cable/C)
+ if(C.powernet)// if C already has a powernet...
+ if(C.powernet == src)
+ return
+ else
+ C.powernet.remove_cable(C) //..remove it
+ C.powernet = src
+ cables +=C
+
+//remove a power machine from the current powernet
+//if the powernet is then empty, delete it
+//Warning : this proc DON'T check if the machine exists
+/datum/powernet/proc/remove_machine(var/obj/machinery/power/M)
+ nodes -=M
+ M.powernet = null
+ if(is_empty())//the powernet is now empty...
+ qdel(src)///... delete it
+
+
+//add a power machine to the current powernet
+//Warning : this proc DON'T check if the machine exists
+/datum/powernet/proc/add_machine(var/obj/machinery/power/M)
+ if(M.powernet)// if M already has a powernet...
+ if(M.powernet == src)
+ return
+ else
+ M.powernet.remove_machine(M) //..remove it
+ M.powernet = src
+ nodes[M] = M
+
+//handles the power changes in the powernet
+//called every ticks by the powernet controller
+/datum/powernet/proc/reset()
+ load = newload
+ newload = 0
+ avail = newavail
+ newavail = 0
+
+
+ viewload = 0.8*viewload + 0.2*load
+
+ viewload = round(viewload)
+
+ var/numapc = 0
+
+ if(nodes && nodes.len)
+ for(var/obj/machinery/power/terminal/term in nodes)
+ if( istype( term.master, /obj/machinery/power/apc ) )
+ numapc++
+
+ if(numapc)
+ perapc = avail/numapc
+
+ netexcess = avail - load
+
+ if( netexcess > 100) // if there was excess power last cycle
+ if(nodes && nodes.len)
+ for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
+ if(S.powernet == src)
+ S.restore() // and restore some of the power that was used
+ else
+ error("[S.name] (\ref[S]) had a [S.powernet ? "different (\ref[S.powernet])" : "null"] powernet to our powernet (\ref[src]).") //this line is a faggot and using the normal ERROR proc breaks it
+ nodes.Remove(S)
+
+/datum/powernet/proc/get_electrocute_damage()
+ switch(avail)/*
+ if (1300000 to INFINITY)
+ return min(rand(70,150),rand(70,150))
+ if (750000 to 1300000)
+ return min(rand(50,115),rand(50,115))
+ if (100000 to 750000-1)
+ return min(rand(35,101),rand(35,101))
+ if (75000 to 100000-1)
+ return min(rand(30,95),rand(30,95))
+ if (50000 to 75000-1)
+ return min(rand(25,80),rand(25,80))
+ if (25000 to 50000-1)
+ return min(rand(20,70),rand(20,70))
+ if (10000 to 25000-1)
+ return min(rand(20,65),rand(20,65))
+ if (1000 to 10000-1)
+ return min(rand(10,20),rand(10,20))*/
+ if (1000000 to INFINITY)
+ return min(rand(50,160),rand(50,160))
+ if (200000 to 1000000)
+ return min(rand(25,80),rand(25,80))
+ if (100000 to 200000)//Ave powernet
+ return min(rand(20,60),rand(20,60))
+ if (50000 to 100000)
+ return min(rand(15,40),rand(15,40))
+ if (1000 to 50000)
+ return min(rand(10,20),rand(10,20))
+ else
+ return 0
+
+////////////////////////////////////////////////
+// Misc.
+///////////////////////////////////////////////
+
+
+// return a knot cable (O-X) if one is present in the turf
+// null if there's none
+/turf/proc/get_cable_node()
+ if(!istype(src, /turf/simulated/floor))
+ return null
+ for(var/obj/structure/cable/C in src)
+ if(C.d1 == 0)
+ return C
+ return null
+
+/area/proc/get_apc()
+ for(var/area/RA in src.related)
+ var/obj/machinery/power/apc/FINDME = locate() in RA
+ if (FINDME)
+ return FINDME
\ No newline at end of file
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index ca45409875b..56dcd502414 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -36,8 +36,6 @@
/obj/machinery/field/containment/ex_act(severity)
return 0
-/obj/machinery/field/containment/meteorhit()
- return 0
/obj/machinery/field/containment/Crossed(atom/movable/mover)
if(isliving(mover))
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index b249672db3f..e571a4bbf9b 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -88,8 +88,6 @@
src.use_power = 1 */
return 1
-/obj/machinery/field/containment/meteorhit()
- return 0
/obj/machinery/power/emitter/process()
if(stat & (BROKEN))
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 2e037f8e76e..f4751450a1d 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -163,11 +163,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
-/obj/structure/particle_accelerator/meteorhit()
- if(prob(50))
- qdel(src)
- return
-
/obj/structure/particle_accelerator/update_icon()
switch(construction_state)
if(0,1)
@@ -350,12 +345,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
-/obj/machinery/particle_accelerator/meteorhit()
- if(prob(50))
- qdel(src)
- return
-
-
/obj/machinery/particle_accelerator/proc/update_state()
return 0
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 0cd927147a2..a0725f79ee5 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -492,6 +492,7 @@ var/global/list/uneatable = list(
/obj/machinery/singularity/narsie/large/New()
..()
world << "NAR-SIE HAS RISEN"
+ world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))
if(emergency_shuttle)
emergency_shuttle.incall(0.3) // Cannot recall
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index c43fbb24874..7c3e16ed5a4 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -33,10 +33,10 @@ var/list/solars_list = list()
solars_list.Remove(src)
/obj/machinery/power/solar/connect_to_network()
- ..()
+ var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
solars_list |= src //... add it
-
+ return to_return
/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
@@ -138,13 +138,6 @@ var/list/solars_list = list()
return
-/obj/machinery/power/solar/meteorhit()
- if(stat & !BROKEN)
- broken()
- else
- qdel(src)
-
-
/obj/machinery/power/solar/ex_act(severity)
switch(severity)
if(1.0)
@@ -287,9 +280,10 @@ var/list/solars_list = list()
solars_list.Remove(src)
/obj/machinery/power/solar_control/connect_to_network()
- ..()
+ var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
solars_list |= src //... add it
+ return to_return
/obj/machinery/power/solar_control/initialize()
..()
@@ -458,11 +452,6 @@ var/list/solars_list = list()
update_icon()
-/obj/machinery/power/solar_control/meteorhit()
- broken()
- return
-
-
/obj/machinery/power/solar_control/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 17b89cb8ebd..af79acaa808 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -26,9 +26,10 @@
solars_list.Remove(src)
/obj/machinery/power/tracker/connect_to_network()
- ..()
+ var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
solars_list |= src //... add it
+ return to_return
/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index c5ffc4bf95f..afe46c110e3 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -62,7 +62,7 @@
if(src)//Do not add to this if() statement, otherwise the meteor won't delete them
if(A)
- A.meteorhit(src)
+ A.ex_act(2)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
for(var/mob/M in range(10, src))
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index cf33cbb7529..8d67ce63f4d 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -64,10 +64,6 @@
if (prob(50))
qdel(src)
-/obj/machinery/chem_dispenser/meteorhit()
- qdel(src)
- return
-
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
@@ -276,10 +272,6 @@
if (prob(50))
qdel(src)
-/obj/machinery/chem_master/meteorhit()
- qdel(src)
- return
-
/obj/machinery/chem_master/power_change()
if(powered())
stat &= ~NOPOWER
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index ce9e3fcf9b4..e7a8c57b042 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -218,7 +218,7 @@ datum
T.MakeSlippery()
for(var/mob/living/carbon/slime/M in T)
- M.adjustToxLoss(rand(15,20))
+ M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !istype(T, /turf/space))
@@ -649,11 +649,14 @@ datum
reaction_turf(var/turf/T, var/volume)
src = null
- if(volume >= 5)
- if(istype(T, /turf/simulated/wall))
- T:thermite = 1
- T.overlays.Cut()
- T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
+ if(volume >= 1 && istype(T, /turf/simulated/wall))
+ var/turf/simulated/wall/Wall = T
+ if(istype(Wall, /turf/simulated/wall/r_wall))
+ Wall.thermite = Wall.thermite+(volume*2.5)
+ else
+ Wall.thermite = Wall.thermite+(volume*10)
+ Wall.overlays = list()
+ Wall.overlays += image('icons/effects/effects.dmi',"thermite")
return
on_mob_life(var/mob/living/M as mob)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 860334f6cd4..aecd81c02b8 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -935,7 +935,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Spawn"
id = "m_spawn"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
@@ -951,7 +951,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Monkey"
id = "m_monkey"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
@@ -966,7 +966,7 @@ datum/chemical_reaction/pestkiller
name = "Mutation Toxin"
id = "mutationtoxin"
result = "mutationtoxin"
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/green
@@ -978,7 +978,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Metal"
id = "m_metal"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/metal
required_other = 1
@@ -996,7 +996,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crit"
id = "m_tele"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
@@ -1065,7 +1065,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crit Lesser"
id = "m_tele3"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
@@ -1117,7 +1117,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Bork"
id = "m_tele2"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
@@ -1148,7 +1148,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Bork 2"
id = "m_tele4"
result = null
- required_reagents = list("water" = 5)
+ required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
@@ -1180,7 +1180,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Frost Oil"
id = "m_frostoil"
result = "frostoil"
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/blue
required_other = 1
@@ -1192,7 +1192,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Freeze"
id = "m_freeze"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkblue
required_other = 1
@@ -1212,7 +1212,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Capsaicin Oil"
id = "m_capsaicinoil"
result = "capsaicin"
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/orange
required_other = 1
@@ -1223,7 +1223,7 @@ datum/chemical_reaction/pestkiller
name = "Slime fire"
id = "m_fire"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/orange
required_other = 1
@@ -1243,7 +1243,7 @@ datum/chemical_reaction/pestkiller
name = "Slime EMP"
id = "m_emp"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1256,7 +1256,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Powercell"
id = "m_cell"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1269,7 +1269,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Glow"
id = "m_glow"
result = null
- required_reagents = list("water" = 5)
+ required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1286,7 +1286,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Steroid"
id = "m_steroid"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/purple
required_other = 1
@@ -1299,7 +1299,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Jam"
id = "m_jam"
result = "slimejelly"
- required_reagents = list("sugar" = 5)
+ required_reagents = list("sugar" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/purple
required_other = 1
@@ -1312,7 +1312,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Plasma"
id = "m_plasma"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkpurple
required_other = 1
@@ -1327,7 +1327,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Glycerol"
id = "m_glycerol"
result = "glycerol"
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 8
required_container = /obj/item/slime_extract/red
required_other = 1
@@ -1339,14 +1339,13 @@ datum/chemical_reaction/pestkiller
name = "Bloodlust"
id = "m_bloodlust"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/red
required_other = 1
/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
- slime.tame = 0
slime.rabid = 1
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("\red The [slime] is driven into a frenzy!."), 1)
@@ -1356,7 +1355,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Potion"
id = "m_potion"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pink
required_other = 1
@@ -1371,7 +1370,7 @@ datum/chemical_reaction/pestkiller
name = "Advanced Mutation Toxin"
id = "mutationtoxin2"
result = "amutationtoxin"
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/black
@@ -1383,7 +1382,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Explosion"
id = "m_explosion"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/oil
required_other = 1
@@ -1401,7 +1400,7 @@ datum/chemical_reaction/pestkiller
result = null
result_amount = 1
required_container = /obj/item/slime_extract/lightpink
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
required_other = 1
/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
@@ -1412,7 +1411,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Golem"
id = "m_golem"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/adamantine
required_other = 1
@@ -1428,7 +1427,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crystal"
id = "m_crystal"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
@@ -1444,7 +1443,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Steroid 2"
id = "m_steroid2"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/cerulean
required_other = 1
@@ -1458,7 +1457,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Camera"
id = "m_camera"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -1471,7 +1470,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Film"
id = "m_film"
result = null
- required_reagents = list("blood" = 5)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -1487,7 +1486,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Paint"
id = "s_paint"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pyrite
required_other = 1
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index f0c7e7eaf8e..e58d54e3195 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -161,7 +161,7 @@
!isturf(src.loc) || \
!(locate(/obj/structure/table) in src.loc) && \
!(locate(/obj/structure/optable) in src.loc) && \
- !(locate(/obj/item/weapon/tray) in src.loc) \
+ !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \
)
user << "You cannot slice [src] here! You need a table or at least a tray."
return 1
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 16e51d6ccd5..7d8ae71c443 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -72,6 +72,11 @@
if(NOCLONE in T.mutations) //target done been et, no more blood in him
user << "You are unable to locate any blood."
return
+ if(target != user)
+ target.visible_message("[user] is trying to take a blood sample from [target]!", \
+ "[user] is trying to take a blood sample from [target]!")
+ if(!do_mob(user, target))
+ return
B.holder = src
B.volume = amount
//set reagent data
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 0b131f0d37e..e5588ca946f 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -43,9 +43,6 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if (prob(50))
qdel(src)
-/obj/machinery/r_n_d/circuit_imprinter/meteorhit()
- qdel(src)
- return
/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, var/M)
switch(M)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 5e126658836..f3829bbb891 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1810,6 +1810,15 @@ datum/design/health_hud
materials = list("$metal" = 50, "$glass" = 50)
build_path = /obj/item/clothing/glasses/hud/health
+datum/design/health_hud_night
+ name = "Night Vision Health Scanner HUD"
+ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ id = "health_hud_night"
+ req_tech = list("biotech" = 4, "magnets" = 5)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$silver" = 250)
+ build_path = /obj/item/clothing/glasses/hud/health/night
+
datum/design/security_hud
name = "Security HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
@@ -1818,7 +1827,15 @@ datum/design/security_hud
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = /obj/item/clothing/glasses/hud/security
- locked = 1
+
+datum/design/security_hud_night
+ name = "Night Vision Security HUD"
+ desc = "A heads-up display which provides id data and vision in complete darkness."
+ id = "security_hud_night"
+ req_tech = list("magnets" = 5, "combat" = 4)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$gold" = 350)
+ build_path = /obj/item/clothing/glasses/hud/security/night
/////////////////////////////////////////
//////////////////Test///////////////////
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index f3515ed345d..9034c3430a4 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -28,9 +28,6 @@ Note: Must be placed within 3 tiles of the R&D Console
T += S.rating
decon_mod = T
-/obj/machinery/r_n_d/destructive_analyzer/meteorhit()
- qdel(src)
- return
/obj/machinery/r_n_d/destructive_analyzer/proc/ConvertReqString2List(var/list/source_list)
var/list/temp_list = params2list(source_list)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index bf53508cb38..8abbae4220c 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -74,10 +74,6 @@
produce_heat(heat_gen)
delay = initial(delay)
-/obj/machinery/r_n_d/server/meteorhit(var/obj/O as obj)
- griefProtection()
- ..()
-
/obj/machinery/r_n_d/server/emp_act(severity)
griefProtection()
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index ebcc675cf43..d8db9381aaa 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -50,10 +50,10 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
- suicide_act(mob/user)
- viewers(user) << pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", \
- "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.")
- return (BRUTELOSS)
+/obj/item/weapon/scalpel/suicide_act(mob/user)
+ user.visible_message(pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", \
+ "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide."))
+ return (BRUTELOSS)
/obj/item/weapon/scalpel
@@ -73,11 +73,11 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with [src]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with [src]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
+/obj/item/weapon/scalpel/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting \his wrists with [src]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his throat with [src]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku."))
+ return (BRUTELOSS)
/obj/item/weapon/circular_saw
diff --git a/config/admins.txt b/config/admins.txt
index 837dfbd8ba7..c367783a872 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -59,4 +59,4 @@ hornygranny = Game Master
yota = Game Master
firecage = Game Master
donkieyo = Game Master
-argoneus = Game Master
+argoneus = Game Master
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index ae4e9d40655..b7f0a216130 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,7 +53,48 @@ should be listed in the changelog upon commit tho. Thanks. -->
-
+
+
20 May 2014
+
Kelenius updated:
+
+ - After the years of extensive research into xenobiology, and thousands of scientists lost to the slimes, we have finally come to admitting that we don't have a clue how they work. However, we've outlined a few facts, and managed to breed a new kind of slimes. They will be shipped to your station on the next shifts. They are different from the ones they are used to in the following:
+ - Their sight is better than ever, and now they can finally see things that are not directly pressed against them. Beware, they may appear more aggressive!
+ - Their memory has also become better, and they will now remember the people who fed them. As a note, you need to grab the monkey or push it to show to the slime that you're giving it to them, and it's not just walking in.
+ - Apparently, not only we have studied them, but they have also studied us. Slimes are now capable of showing various emotions, mimicking humans. Use it to your advantage.
+ - There are reports of slimes showing signs of sentience. Further research is recommended.
+ - One of the reported signs is their speech capability. Following facts have been gathered: they talk more often to those who feed them; they react to being called by the number, but 'slimes' is also acceptable; they are able to understand being ordered to "follow" someone, or "stop". There is a report of slime releasing the assistant after a scientist shouted at it, and then calmly ordered a slime to stop.
+ - We've made a modification of a health scanner that is intended for the use on slimes. Two are available in the smartfridge.
+ - We've come to a conclusion that 5 units of reagents are not necessary to cause slime core reactions. You actually only need one unit.
+
+
+
+
+
16 May 2014
+
Menshin updated:
+
+ - Thanks to Nanotrasen's Engineering division, the power wiring of the station has a received a complete overhaul. Here are the highlight features in CentCom report :
+ - Improved way of connecting cables! Finished is the time of "laying and praying" : it's now as simple as matching ends of each cables!
+ - Unified way of connecting machines! Every machine is connected to a powernet through a node cable (it still needs to be anchored to receive power though)!
+ - Lots of improvements in the cable cutting tools! Gone is the odd magic of physically separated yet still connected powernets (contact CentCom Engineering Division if you still witness something weird, we always have a fired form ready for our engineers!)!
+ - Any conscientious (or not!) Station Engineer may check an "updated wiring manual" at http://www.tgstation13.org/wiki/Wiring#Power_Wires
+
+
+
+
+
14 May 2014
+
Ikarrus updated:
+
+ - In an effort to increase information security, Nanotrasen has moved away from digital information systems in matters requiring maintaining corporate secrecy.
+ - Station administrators are ordered to store all sensitive information in paper document form within their Station Vaults. Unauthorized distribution of these documents is punishable by death.
+ - NT Corporate Security has noticed a similar trend within the Syndicate. It is predicted that enemy agents will attempt to secretly exchange sensitive information in person within Nanotrasen Space. NT Security has posted a generous reward for any stations that are able to capture enemy intelligence and send them to Centcom via supply shuttle.
+
+
Ikarrus updated:
+
+ - A recent breakthrough in Plasma Materials Research has led to the development of a stronger, tougher plasteel alloy that can better resist extreme heat by up to four times. A live demonstration preformed during a press conference earlier today showed a segment of reinforced wall resisting an attack by Thermite. The corporation also announces that upgrades to its existing stations is already underway.
+
+
+
+
07 May 2014
/Tg/station Code Management updated:
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index e99e87a425d..51d90bb6298 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index f38ab00909e..88c6ca25c25 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 3864d1c2091..9e2059cafbe 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 05372ffc31b..1bd703fc284 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index 30580f403b0..ecb7d310744 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi
new file mode 100644
index 00000000000..35a2148f538
Binary files /dev/null and b/icons/mob/robot_items.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index dbd74d4f445..9c293950b7e 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 7fd69c4b71f..cc8822af3fc 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 3619504282e..a2c7a00a647 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi
index 123a5bdf86e..84faabcc188 100644
Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index c2c03c7a2d7..99650ce656c 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/suitstorage.dmi b/icons/obj/suitstorage.dmi
index 1af7b3dd096..8d43fa84775 100644
Binary files a/icons/obj/suitstorage.dmi and b/icons/obj/suitstorage.dmi differ
diff --git a/sound/AI/attention.ogg b/sound/AI/attention.ogg
new file mode 100644
index 00000000000..912be4425eb
Binary files /dev/null and b/sound/AI/attention.ogg differ
diff --git a/sound/misc/announce.ogg b/sound/misc/announce.ogg
new file mode 100644
index 00000000000..e5db9b0cb31
Binary files /dev/null and b/sound/misc/announce.ogg differ
diff --git a/sound/vox_fem/centcom.ogg b/sound/vox_fem/centcom.ogg
index 886ebaa4a1d..9c6404df836 100644
Binary files a/sound/vox_fem/centcom.ogg and b/sound/vox_fem/centcom.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 7925d393890..86fb4497c89 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -213,9 +213,8 @@
#include "code\defines\obj.dm"
#include "code\defines\obj\weapon.dm"
#include "code\defines\procs\AStar.dm"
-#include "code\defines\procs\captain_announce.dm"
-#include "code\defines\procs\command_alert.dm"
#include "code\defines\procs\dbcore.dm"
+#include "code\defines\procs\priority_announce.dm"
#include "code\defines\procs\statistics.dm"
#include "code\game\asteroid.dm"
#include "code\game\atoms.dm"
@@ -491,6 +490,7 @@
#include "code\game\objects\items\bodybag.dm"
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\crayons.dm"
+#include "code\game\objects\items\documents.dm"
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\toys.dm"
@@ -587,7 +587,7 @@
#include "code\game\objects\items\weapons\storage\backpack.dm"
#include "code\game\objects\items\weapons\storage\bags.dm"
#include "code\game\objects\items\weapons\storage\belt.dm"
-#include "code\game\objects\items\weapons\storage\bible.dm"
+#include "code\game\objects\items\weapons\storage\book.dm"
#include "code\game\objects\items\weapons\storage\boxes.dm"
#include "code\game\objects\items\weapons\storage\briefcase.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
@@ -834,6 +834,7 @@
#include "code\modules\events\immovable_rod.dm"
#include "code\modules\events\ion_storm.dm"
#include "code\modules\events\mass_hallucination.dm"
+#include "code\modules\events\meateor_wave.dm"
#include "code\modules\events\meteor_wave.dm"
#include "code\modules\events\ninja.dm"
#include "code\modules\events\prison_break.dm"
diff --git a/tools/PR_announcer_bot/config_for_tg.txt b/tools/PR_announcer_bot/config_for_tg.txt
new file mode 100644
index 00000000000..4bf44fb2adc
--- /dev/null
+++ b/tools/PR_announcer_bot/config_for_tg.txt
@@ -0,0 +1,8 @@
+serverip = 127.0.0.1 //SS13 server IP
+serverport = 1337 //SS13 server port
+commskey = fill_your_own_in //API key of the server
+GitHub_bot_name = TheGhostOfWhibyl1 //It'll get the data from this bot
+IRC_bot_name = PR_Listener_Bot //This'll be our name
+IRC_server = irc.rizon.net:6670 //format - server:port
+IRC_channel = #coderbus
+Nickserv_auth = _NONE_ //leave _NONE_ if your bot does not require nickserv authentication
\ No newline at end of file
diff --git a/tools/PR_announcer_bot/sendkeys_ss13.exe b/tools/PR_announcer_bot/sendkeys_ss13.exe
index 82af6be9543..5985be093a8 100644
Binary files a/tools/PR_announcer_bot/sendkeys_ss13.exe and b/tools/PR_announcer_bot/sendkeys_ss13.exe differ
diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs
index dbfd53c90f6..ebb05c7f153 100644
--- a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs
+++ b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs
@@ -232,7 +232,7 @@ namespace sendkeys_ss13
{
if (msg.Length >= 4)
{
- if (msg[3] == "Merge") //Someone is merging something
+ if (msg[3] == "Merge" && msg[1] != "meant:") //Someone is merging something
{
mergedPR = msg[6];
if (merge_archive != null)
@@ -249,7 +249,7 @@ namespace sendkeys_ss13
}
}
}
- if (msg[2] == "closed")
+ if (msg[2] == "closed" && msg[1] != "meant:")
{
merge_archive = msg;
if (mergedPR != null)