diff --git a/.travis.yml b/.travis.yml index 4171bbe84a..e1e3e6fd72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,5 +17,6 @@ install: - cd .. script: - - $(for i in 1 2 3 4 5 6; do (grep -q 'step_[xy]' maps/exodus-$i.dmm; if [ $? -eq 1 ]; then exit 0; else exit 1; fi) done) + - shopt -s globstar + - (! grep 'step_[xy]' maps/**/*.dmm) - DreamMaker baystation12.dme diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..6bcd96b1cc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,5 @@ +Baystation12 is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt. + +Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt. + +All commits whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files. diff --git a/COPYING b/COPYING index 77e1d829ff..e8ece1b9f8 100644 --- a/COPYING +++ b/COPYING @@ -1,8 +1,12 @@ Baystation12 -Copyright (C) 2010-2014 Baystation12 and tgstation13. +Copyright (C) 2010-2015 Baystation12 and tgstation13. + +Baystation12 is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt. +Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt. +All commits whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files. This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by +it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. diff --git a/LICENSE-AGPL3.txt b/LICENSE-AGPL3.txt new file mode 100644 index 0000000000..dba13ed2dd --- /dev/null +++ b/LICENSE-AGPL3.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/LICENSE-GPL3.txt b/LICENSE-GPL3.txt index 20d40b6bce..94a9ed024d 100644 --- a/LICENSE-GPL3.txt +++ b/LICENSE-GPL3.txt @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/README.md b/README.md index 01fec91ca6..182619a70c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ --- +### LICENSE +Baystation12 is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt. + +Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt. + +All commits whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files. + +If you wish to develop and host this codebase in a closed source manner you may use all commits prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made. + +See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information. + ### GETTING THE CODE The simplest way to obtain the code is using the github .zip feature. diff --git a/baystation12.dme b/baystation12.dme index 701ec2fd39..2bd7ad8b69 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -194,6 +194,7 @@ #include "code\game\asteroid.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" +#include "code\game\periodic_news.dm" #include "code\game\response_team.dm" #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" @@ -372,6 +373,7 @@ #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\arcade.dm" #include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera.dm" #include "code\game\machinery\computer\card.dm" @@ -379,6 +381,7 @@ #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\guestpass.dm" #include "code\game\machinery\computer\HolodeckControl.dm" #include "code\game\machinery\computer\hologram.dm" #include "code\game\machinery\computer\law.dm" @@ -397,6 +400,36 @@ #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\supply.dm" #include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer3\bios.dm" +#include "code\game\machinery\computer3\buildandrepair.dm" +#include "code\game\machinery\computer3\component.dm" +#include "code\game\machinery\computer3\computer.dm" +#include "code\game\machinery\computer3\computer3_notes.dm" +#include "code\game\machinery\computer3\file.dm" +#include "code\game\machinery\computer3\laptop.dm" +#include "code\game\machinery\computer3\lapvend.dm" +#include "code\game\machinery\computer3\networking.dm" +#include "code\game\machinery\computer3\NTOS.dm" +#include "code\game\machinery\computer3\program.dm" +#include "code\game\machinery\computer3\program_disks.dm" +#include "code\game\machinery\computer3\server.dm" +#include "code\game\machinery\computer3\storage.dm" +#include "code\game\machinery\computer3\computers\arcade.dm" +#include "code\game\machinery\computer3\computers\atmos_alert.dm" +#include "code\game\machinery\computer3\computers\camera.dm" +#include "code\game\machinery\computer3\computers\card.dm" +#include "code\game\machinery\computer3\computers\communications.dm" +#include "code\game\machinery\computer3\computers\crew.dm" +#include "code\game\machinery\computer3\computers\customs.dm" +#include "code\game\machinery\computer3\computers\HolodeckControl.dm" +#include "code\game\machinery\computer3\computers\law.dm" +#include "code\game\machinery\computer3\computers\medical.dm" +#include "code\game\machinery\computer3\computers\Operating.dm" +#include "code\game\machinery\computer3\computers\power.dm" +#include "code\game\machinery\computer3\computers\prisoner.dm" +#include "code\game\machinery\computer3\computers\robot.dm" +#include "code\game\machinery\computer3\computers\security.dm" +#include "code\game\machinery\computer3\computers\welcome.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -456,6 +489,7 @@ #include "code\game\mecha\working\hoverpod.dm" #include "code\game\mecha\working\ripley.dm" #include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\explosion_recursive.dm" @@ -463,11 +497,11 @@ #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" #include "code\game\objects\weapons.dm" -#include "code\game\objects\closets\walllocker.dm" #include "code\game\objects\effects\aliens.dm" #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\chemsmoke.dm" #include "code\game\objects\effects\effect_system.dm" +#include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\gibs.dm" #include "code\game\objects\effects\glowshroom.dm" #include "code\game\objects\effects\landmarks.dm" @@ -495,6 +529,7 @@ #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\vaultspawner.dm" #include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\ashtray.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\contraband.dm" @@ -552,6 +587,7 @@ #include "code\game\objects\items\stacks\tiles\plasteel.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\candle.dm" #include "code\game\objects\items\weapons\cards_ids.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm" @@ -569,6 +605,7 @@ #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\paint.dm" #include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\policetape.dm" #include "code\game\objects\items\weapons\power_cells.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RSF.dm" @@ -584,6 +621,7 @@ #include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\twohanded.dm" #include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\weldbackpack.dm" #include "code\game\objects\items\weapons\wires.dm" #include "code\game\objects\items\weapons\circuitboards\broken.dm" #include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" @@ -683,6 +721,7 @@ #include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" #include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" #include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" #include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" @@ -743,6 +782,7 @@ #include "code\modules\admin\verbs\adminsay.dm" #include "code\modules\admin\verbs\atmosdebug.dm" #include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\buildmode.dm" #include "code\modules\admin\verbs\check_customitem_activity.dm" #include "code\modules\admin\verbs\cinematic.dm" #include "code\modules\admin\verbs\custom_event.dm" @@ -832,6 +872,7 @@ #include "code\modules\clothing\spacesuits\rig\modules\computer.dm" #include "code\modules\clothing\spacesuits\rig\modules\modules.dm" #include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" +#include "code\modules\clothing\spacesuits\rig\modules\rig_weapons.dm" #include "code\modules\clothing\spacesuits\rig\modules\utility.dm" #include "code\modules\clothing\spacesuits\rig\modules\vision.dm" #include "code\modules\clothing\spacesuits\rig\suits\alien.dm" @@ -925,6 +966,7 @@ #include "code\modules\hydroponics\seed_datums.dm" #include "code\modules\hydroponics\seed_machines.dm" #include "code\modules\hydroponics\seed_mobs.dm" +#include "code\modules\hydroponics\seed_storage.dm" #include "code\modules\hydroponics\seeds.dm" #include "code\modules\hydroponics\vines.dm" #include "code\modules\library\lib_items.dm" @@ -1035,6 +1077,7 @@ #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" #include "code\modules\mob\living\carbon\human\say.dm" #include "code\modules\mob\living\carbon\human\unarmed_attack.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" @@ -1081,6 +1124,7 @@ #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" #include "code\modules\mob\living\silicon\ai\life.dm" #include "code\modules\mob\living\silicon\ai\login.dm" @@ -1182,6 +1226,14 @@ #include "code\modules\organs\organ_objects.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\wound.dm" +#include "code\modules\overmap\_defines.dm" +#include "code\modules\overmap\sectors.dm" +#include "code\modules\overmap\ships\ship.dm" +#include "code\modules\overmap\ships\computers\engine_control.dm" +#include "code\modules\overmap\ships\computers\helm.dm" +#include "code\modules\overmap\ships\computers\shuttle.dm" +#include "code\modules\overmap\ships\engines\engine.dm" +#include "code\modules\overmap\ships\engines\thermal.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\faxmachine.dm" @@ -1220,6 +1272,24 @@ #include "code\modules\power\antimatter\containment_jar.dm" #include "code\modules\power\antimatter\control.dm" #include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\rust\areas.dm" +#include "code\modules\power\rust\circuits_and_design.dm" +#include "code\modules\power\rust\core_control.dm" +#include "code\modules\power\rust\core_field.dm" +#include "code\modules\power\rust\core_gen.dm" +#include "code\modules\power\rust\core_monitor.dm" +#include "code\modules\power\rust\fuel_assembly.dm" +#include "code\modules\power\rust\fuel_assembly_port.dm" +#include "code\modules\power\rust\fuel_assembly_port_construction.dm" +#include "code\modules\power\rust\fuel_compressor.dm" +#include "code\modules\power\rust\fuel_compressor_construction.dm" +#include "code\modules\power\rust\fuel_control.dm" +#include "code\modules\power\rust\fuel_injector.dm" +#include "code\modules\power\rust\fusion_reactions.dm" +#include "code\modules\power\rust\gyrotron.dm" +#include "code\modules\power\rust\gyrotron_controller.dm" +#include "code\modules\power\rust\radiation.dm" +#include "code\modules\power\rust\virtual_particle_catcher.dm" #include "code\modules\power\sensors\powernet_sensor.dm" #include "code\modules\power\sensors\sensor_monitoring.dm" #include "code\modules\power\singularity\collector.dm" @@ -1448,86 +1518,6 @@ #include "code\TriDimension\Structures.dm" #include "code\TriDimension\Structures_presets.dm" #include "code\TriDimension\Turfs.dm" -#include "code\WorkInProgress\autopsy.dm" -#include "code\WorkInProgress\buildmode.dm" -#include "code\WorkInProgress\explosion_particles.dm" -#include "code\WorkInProgress\periodic_news.dm" -#include "code\WorkInProgress\Apples\artifacts.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_plants.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_temple.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_tribe.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_turfs.dm" -#include "code\WorkInProgress\Cael_Aislinn\Jungle\misc_helpers.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\areas.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\circuits_and_design.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\core_control.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\core_monitor.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly_port.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly_port_construction.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor_construction.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_control.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_injector.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\fusion_reactions.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm" -#include "code\WorkInProgress\Cael_Aislinn\Rust\virtual_particle_catcher.dm" -#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm" -#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm" -#include "code\WorkInProgress\Chinsky\ashtray.dm" -#include "code\WorkInProgress\Chinsky\guestpass.dm" -#include "code\WorkInProgress\Chinsky\overmap\_defines.dm" -#include "code\WorkInProgress\Chinsky\overmap\README.dm" -#include "code\WorkInProgress\Chinsky\overmap\sectors.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\ship.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\computers\engine_control.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\computers\helm.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\computers\shuttle.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\engines\engine.dm" -#include "code\WorkInProgress\Chinsky\overmap\ships\engines\thermal.dm" -#include "code\WorkInProgress\Cib\MedicalSideEffects.dm" -#include "code\WorkInProgress\computer3\bios.dm" -#include "code\WorkInProgress\computer3\buildandrepair.dm" -#include "code\WorkInProgress\computer3\component.dm" -#include "code\WorkInProgress\computer3\computer.dm" -#include "code\WorkInProgress\computer3\computer3_notes.dm" -#include "code\WorkInProgress\computer3\file.dm" -#include "code\WorkInProgress\computer3\laptop.dm" -#include "code\WorkInProgress\computer3\lapvend.dm" -#include "code\WorkInProgress\computer3\networking.dm" -#include "code\WorkInProgress\computer3\NTOS.dm" -#include "code\WorkInProgress\computer3\program.dm" -#include "code\WorkInProgress\computer3\program_disks.dm" -#include "code\WorkInProgress\computer3\server.dm" -#include "code\WorkInProgress\computer3\storage.dm" -#include "code\WorkInProgress\computer3\computers\arcade.dm" -#include "code\WorkInProgress\computer3\computers\atmos_alert.dm" -#include "code\WorkInProgress\computer3\computers\camera.dm" -#include "code\WorkInProgress\computer3\computers\card.dm" -#include "code\WorkInProgress\computer3\computers\communications.dm" -#include "code\WorkInProgress\computer3\computers\crew.dm" -#include "code\WorkInProgress\computer3\computers\customs.dm" -#include "code\WorkInProgress\computer3\computers\HolodeckControl.dm" -#include "code\WorkInProgress\computer3\computers\law.dm" -#include "code\WorkInProgress\computer3\computers\medical.dm" -#include "code\WorkInProgress\computer3\computers\Operating.dm" -#include "code\WorkInProgress\computer3\computers\power.dm" -#include "code\WorkInProgress\computer3\computers\prisoner.dm" -#include "code\WorkInProgress\computer3\computers\robot.dm" -#include "code\WorkInProgress\computer3\computers\security.dm" -#include "code\WorkInProgress\computer3\computers\welcome.dm" -#include "code\WorkInProgress\Mini\atmos_control.dm" -#include "code\WorkInProgress\Ported\policetape.dm" -#include "code\WorkInProgress\SkyMarshal\officer_stuff.dm" -#include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" -#include "code\WorkInProgress\Wrongnumber\weldbackpack.dm" #include "code\ZAS\_docs.dm" #include "code\ZAS\_gas_mixture_xgm.dm" #include "code\ZAS\_xgm_gas_data.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index bf7de90c87..ed7290b00f 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -26,6 +26,7 @@ var/area_uid var/id_tag = null + var/hibernate = 0 //Do we even process? var/pump_direction = 1 //0 = siphoning, 1 = releasing var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND @@ -150,8 +151,8 @@ /obj/machinery/atmospherics/unary/vent_pump/process() ..() - last_power_draw = 0 - last_flow_rate = 0 + if (hibernate) + return 1 if (!node) use_power = 0 @@ -177,6 +178,17 @@ transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) + else + //If we're in an area that is fucking ideal, and we don't have to do anything, chances are we won't next tick either so why redo these calculations? + //JESUS FUCK. THERE ARE LITERALLY 250 OF YOU MOTHERFUCKERS ON ZLEVEL ONE AND YOU DO THIS SHIT EVERY TICK WHEN VERY OFTEN THERE IS NO REASON TO + + if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL && controller_iteration > 10) //99% of all vents + //Fucking hibernate because you ain't doing shit. + hibernate = 1 + spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly + hibernate = 0 + + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) @@ -256,6 +268,9 @@ /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return + + hibernate = 0 + //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return 0 @@ -421,4 +436,4 @@ if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated ML.handle_ventcrawl(src) return - ..()*/ \ No newline at end of file + ..()*/ diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 7b74ed8b73..068f7efdb3 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -99,6 +99,8 @@ "power" = use_power, "scrubbing" = scrubbing, "panic" = panic, + "filter_o2" = ("oxygen" in scrubbing_gas), + "filter_n2" = ("nitrogen" in scrubbing_gas), "filter_co2" = ("carbon_dioxide" in scrubbing_gas), "filter_phoron" = ("phoron" in scrubbing_gas), "filter_n2o" = ("sleeping_agent" in scrubbing_gas), @@ -192,6 +194,16 @@ var/list/toggle = list() + if(!isnull(signal.data["o2_scrub"]) && text2num(signal.data["o2_scrub"]) != ("oxygen" in scrubbing_gas)) + toggle += "oxygen" + else if(signal.data["toggle_o2_scrub"]) + toggle += "oxygen" + + if(!isnull(signal.data["n2_scrub"]) && text2num(signal.data["n2_scrub"]) != ("nitrogen" in scrubbing_gas)) + toggle += "nitrogen" + else if(signal.data["toggle_n2_scrub"]) + toggle += "nitrogen" + if(!isnull(signal.data["co2_scrub"]) && text2num(signal.data["co2_scrub"]) != ("carbon_dioxide" in scrubbing_gas)) toggle += "carbon_dioxide" else if(signal.data["toggle_co2_scrub"]) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index aa4473babd..662376e9b4 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -203,11 +203,17 @@ datum/pipeline //surface must be the surface area in m^2 proc/radiate_heat_to_space(surface, thermal_conductivity) var/gas_density = air.total_moles/air.volume - thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*T20C) ), 1) + thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio - //if the h/e pipes radiate less than the AVERAGE_SOLAR_RADIATION, then they will heat up, otherwise they will cool down. It turns out the critical temperature is -26 C - var/heat_gain = surface*(AVERAGE_SOLAR_RADIATION - STEFAN_BOLTZMANN_CONSTANT*thermal_conductivity*(air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4) + // We only get heat from the star on the exposed surface area. + // If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase. + var/heat_gain = AVERAGE_SOLAR_RADIATION * (RADIATOR_EXPOSED_SURFACE_AREA_RATIO * surface) * thermal_conductivity + + // Previously, the temperature would enter equilibrium at 26C or 294K. + // Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on. + // It currently should stabilise at 129.6K or -143.6C + heat_gain -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4 air.add_thermal_energy(heat_gain) if(network) - network.update = 1 \ No newline at end of file + network.update = 1 diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index c22c483e8c..f9dbef84cf 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -3,18 +3,23 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging icon = 'icons/atmos/heat.dmi' icon_state = "intact" pipe_icon = "hepipe" + color = "#404040" level = 2 var/initialize_directions_he var/surface = 2 //surface area in m^2 + var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh minimum_temperature_difference = 20 thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT + buckle_lying = 1 + // BubbleWrap New() ..() initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe // BubbleWrap END + color = "#404040" //we don't make use of the fancy overlay system for colours, use this to set the default. initialize() normalize_dir() @@ -48,19 +53,53 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging if(!parent) ..() else - var/environment_temperature = 0 + var/datum/gas_mixture/pipe_air = return_air() if(istype(loc, /turf/simulated/)) + var/environment_temperature = 0 if(loc:blocks_air) environment_temperature = loc:temperature else var/datum/gas_mixture/environment = loc.return_air() environment_temperature = environment.temperature - var/datum/gas_mixture/pipe_air = return_air() if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) parent.temperature_interact(loc, volume, thermal_conductivity) else if(istype(loc, /turf/space/)) parent.radiate_heat_to_space(surface, 1) + if(buckled_mob) + var/hc = pipe_air.heat_capacity() + var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500) + pipe_air.temperature = avg_temp + buckled_mob.bodytemperature = avg_temp + + var/heat_limit = 1000 + + var/mob/living/carbon/human/H = buckled_mob + if(istype(H) && H.species) + heat_limit = H.species.heat_level_3 + + if(pipe_air.temperature > heat_limit + 1) + buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest", used_weapon = "Excessive Heat") + + //fancy radiation glowing + if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K + if(abs(pipe_air.temperature - icon_temperature) > 10) + icon_temperature = pipe_air.temperature + + var/h_r = heat2color_r(icon_temperature) + var/h_g = heat2color_g(icon_temperature) + var/h_b = heat2color_b(icon_temperature) + + if(icon_temperature < 2000) //scale up overlay until 2000K + var/scale = (icon_temperature - 500) / 1500 + h_r = 64 + (h_r - 64)*scale + h_g = 64 + (h_g - 64)*scale + h_b = 64 + (h_b - 64)*scale + + animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) + + + obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction icon = 'icons/atmos/junction.dmi' diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 16a0a6bcd5..be63292d83 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -12,6 +12,10 @@ var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called + can_buckle = 1 + buckle_require_restraints = 1 + buckle_lying = -1 + /obj/machinery/atmospherics/pipe/drain_power() return -1 diff --git a/code/WorkInProgress/AI_Visibility/_old_AI_Visibility.dm b/code/WorkInProgress/AI_Visibility/_old_AI_Visibility.dm deleted file mode 100644 index 9b50c74f68..0000000000 --- a/code/WorkInProgress/AI_Visibility/_old_AI_Visibility.dm +++ /dev/null @@ -1,573 +0,0 @@ -//All credit for this goes to Uristqwerty. - -//And some to me! -Mini - - - -//This file is partly designed around being able to uninclude it to go back to the old ai viewing system completely. -//(And therefore also be portable to another similar codebase simply by transferring the file and including it after the other AI code files.) -//There are probably a few parts that don't do that at the moment, but I'll fix them at some point. - - -#define MINIMAP_UPDATE_DELAY 1200 - -/turf - var/image/obscured - var/image/dim - -/turf/proc/visibilityChanged() - cameranet.updateVisibility(src) - -/turf/New() - ..() - cameranet.updateVisibility(src) -/* -/turf/Del() - ..() - cameranet.updateVisibility(src) -*/ -/datum/camerachunk - var/list/obscuredTurfs = list() - var/list/visibleTurfs = list() - var/list/dimTurfs = list() - var/list/obscured = list() - var/list/dim = list() - var/list/cameras = list() - var/list/turfs = list() - var/list/seenby = list() - var/visible = 0 - var/changed = 1 - var/updating = 0 - - var/x - var/y - var/z - - var/minimap_updating = 0 - - var/icon/minimap_icon = new('icons/minimap.dmi', "chunk_base") - var/obj/minimap_obj/minimap_obj = new() - -/obj/minimap_obj/Click(location, control, params) - if(!istype(usr, /mob/dead) && !istype(usr, /mob/living/silicon/ai) && !(usr.client && usr.client.holder && usr.client.holder.level >= 4)) - return - - var/list/par = params2list(params) - var/screen_loc = par["screen-loc"] - - if(findtext(screen_loc, "minimap:") != 1) - return - - screen_loc = copytext(screen_loc, length("minimap:") + 1) - - var/x_text = copytext(screen_loc, 1, findtext(screen_loc, ",")) - var/y_text = copytext(screen_loc, findtext(screen_loc, ",") + 1) - - var/x = (text2num(copytext(x_text, 1, findtext(x_text, ":"))) - 1) * 16 - x += round((text2num(copytext(x_text, findtext(x_text, ":") + 1)) + 1) / 2) - - var/y = (text2num(copytext(y_text, 1, findtext(y_text, ":"))) - 1) * 16 - y += round((text2num(copytext(y_text, findtext(y_text, ":") + 1)) + 1) / 2) - - if(istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - ai.freelook() - ai.eyeobj.loc = locate(max(1, x - 1), max(1, y - 1), ai.eyeobj.z) - cameranet.visibility(ai.eyeobj) - - else - usr.loc = locate(max(1, x - 1), max(1, y - 1), usr.z) - -/mob/dead/verb/Open_Minimap() - set category = "Ghost" - winshow(src, "minimapwindow", 1) - client.screen |= cameranet.minimap - - if(cameranet.generating_minimap) - cameranet.minimap_viewers += src - -/mob/living/silicon/ai/verb/Open_Minimap() - set category = "AI Commands" - winshow(src, "minimapwindow", 1) - client.screen |= cameranet.minimap - - if(cameranet.generating_minimap) - cameranet.minimap_viewers += src - -/client/proc/Open_Minimap() - set category = "Admin" - winshow(src, "minimapwindow", 1) - screen |= cameranet.minimap - - if(cameranet.generating_minimap) - cameranet.minimap_viewers += src.mob - -/datum/camerachunk/proc/update_minimap() - if(changed && !updating) - update() - - minimap_icon.Blend(rgb(255, 0, 0), ICON_MULTIPLY) - - var/list/turfs = visibleTurfs | dimTurfs - - for(var/turf/turf in turfs) - var/x = (turf.x & 0xf) * 2 - var/y = (turf.y & 0xf) * 2 - - if(turf.density) - minimap_icon.DrawBox(rgb(100, 100, 100), x + 1, y + 1, x + 2, y + 2) - continue - - else if(istype(turf, /turf/space)) - minimap_icon.DrawBox(rgb(0, 0, 0), x + 1, y + 1, x + 2, y + 2) - - else - minimap_icon.DrawBox(rgb(200, 200, 200), x + 1, y + 1, x + 2, y + 2) - - for(var/obj/structure/o in turf) - if(o.density) - if(istype(o, /obj/structure/window) && (o.dir == NORTH || o.dir == SOUTH || o.dir == EAST || o.dir == WEST)) - if(o.dir == NORTH) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 2, x + 2, y + 2) - else if(o.dir == SOUTH) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 2, y + 1) - else if(o.dir == EAST) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 3, y + 1, x + 2, y + 2) - else if(o.dir == WEST) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 1, y + 2) - - else - minimap_icon.DrawBox(rgb(150, 150, 150), x + 1, y + 1, x + 2, y + 2) - break - - for(var/obj/machinery/door/o in turf) - if(istype(o, /obj/machinery/door/window)) - if(o.dir == NORTH) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 2, x + 2, y + 2) - else if(o.dir == SOUTH) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 1) - else if(o.dir == EAST) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 2, y + 1, x + 2, y + 2) - else if(o.dir == WEST) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 1, y + 2) - - else - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 2) - break - - minimap_obj.screen_loc = "minimap:[src.x / 16],[src.y / 16]" - minimap_obj.icon = minimap_icon - -/mob/aiEye - var/list/visibleCameraChunks = list() - var/mob/ai = null - density = 0 - -/datum/camerachunk/proc/add(mob/aiEye/ai) - ai.visibleCameraChunks += src - if(ai.ai.client) - ai.ai.client.images += obscured - ai.ai.client.images += dim - visible++ - seenby += ai - if(changed && !updating) - update() - changed = 0 - -/datum/camerachunk/proc/remove(mob/aiEye/ai) - ai.visibleCameraChunks -= src - if(ai.ai.client) - ai.ai.client.images -= obscured - ai.ai.client.images -= dim - seenby -= ai - if(visible > 0) - visible-- - -/datum/camerachunk/proc/visibilityChanged(turf/loc) - if(!(loc in visibleTurfs)) - return - - hasChanged() - -/datum/camerachunk/proc/hasChanged() - if(visible) - if(!updating) - updating = 1 - spawn(10)//Batch large changes, such as many doors opening or closing at once - update() - updating = 0 - else - changed = 1 - - if(!minimap_updating) - minimap_updating = 1 - - spawn(MINIMAP_UPDATE_DELAY) - if(changed && !updating) - update() - changed = 0 - - update_minimap() - minimap_updating = 0 - -/datum/camerachunk/proc/update() - - var/list/newDimTurfs = list() - var/list/newVisibleTurfs = list() - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 7 - - newDimTurfs |= turfs & view(7, c) - newVisibleTurfs |= turfs & view(6, c) - - c.luminosity = lum - - var/list/dimAdded = newDimTurfs - dimTurfs - var/list/dimRemoved = dimTurfs - newDimTurfs - var/list/visAdded = newVisibleTurfs - visibleTurfs - var/list/visRemoved = visibleTurfs - newVisibleTurfs - - visibleTurfs = newVisibleTurfs - dimTurfs = newDimTurfs - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in dimRemoved) - if(t.dim) - dim -= t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.dim - - if(!(t in visibleTurfs)) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured - - for(var/turf/t in dimAdded) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", 15) - t.mouse_opacity = 0 - - dim += t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.dim - - if(t.obscured) - obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured - - for(var/turf/t in visAdded) - if(t.obscured) - obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured - - for(var/turf/t in visRemoved) - if(t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured - - -/datum/camerachunk/New(loc, x, y, z) - x &= ~0xf - y &= ~0xf - - src.x = x - src.y = y - src.z = z - - for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z))) - if(c.status) - cameras += c - - turfs = block(locate(x, y, z), locate(min(world.maxx, x + 15), min(world.maxy, y + 15), z)) - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 7 - - dimTurfs |= turfs & view(7, c) - visibleTurfs |= turfs & view(6, c) - - c.luminosity = lum - - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - - for(var/turf/t in dimTurfs) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", TURF_LAYER) - t.dim.mouse_opacity = 0 - - dim += t.dim - - cameranet.minimap += minimap_obj - -var/datum/cameranet/cameranet = new() - -/datum/cameranet - var/list/cameras = list() - var/list/chunks = list() - var/network = "net1" - var/ready = 0 - - var/list/minimap = list() - - var/generating_minimap = TRUE - var/list/minimap_viewers = list() - -/datum/cameranet/New() - ..() - - spawn(200) - for(var/x = 0, x <= world.maxx, x += 16) - for(var/y = 0, y <= world.maxy, y += 16) - sleep(1) - var/datum/camerachunk/c = getCameraChunk(x, y, 1) - c.update_minimap() - - for(var/mob/m in minimap_viewers) - m.client.screen |= c.minimap_obj - - generating_minimap = FALSE - minimap_viewers = list() - -/datum/cameranet/proc/chunkGenerated(x, y, z) - var/key = "[x],[y],[z]" - return key in chunks - -/datum/cameranet/proc/getCameraChunk(x, y, z) - var/key = "[x],[y],[z]" - - if(!(key in chunks)) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] - -/datum/cameranet/proc/visibility(mob/aiEye/ai) - var/x1 = max(0, ai.x - 16) & ~0xf - var/y1 = max(0, ai.y - 16) & ~0xf - var/x2 = min(world.maxx, ai.x + 16) & ~0xf - var/y2 = min(world.maxy, ai.y + 16) & ~0xf - - var/list/visibleChunks = list() - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - visibleChunks += getCameraChunk(x, y, ai.z) - - var/list/remove = ai.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - ai.visibleCameraChunks - - for(var/datum/camerachunk/c in remove) - c.remove(ai) - - for(var/datum/camerachunk/c in add) - c.add(ai) - -/datum/cameranet/proc/updateVisibility(turf/loc) - if(!chunkGenerated(loc.x & ~0xf, loc.y & ~0xf, loc.z)) - return - - var/datum/camerachunk/chunk = getCameraChunk(loc.x & ~0xf, loc.y & ~0xf, loc.z) - chunk.visibilityChanged(loc) - -/datum/cameranet/proc/addCamera(obj/machinery/camera/c) - var/x1 = max(0, c.x - 16) & ~0xf - var/y1 = max(0, c.y - 16) & ~0xf - var/x2 = min(world.maxx, c.x + 16) & ~0xf - var/y2 = min(world.maxy, c.y + 16) & ~0xf - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - if(chunkGenerated(x, y, c.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z) - if(!(c in chunk.cameras)) - chunk.cameras += c - chunk.hasChanged() - -/datum/cameranet/proc/removeCamera(obj/machinery/camera/c) - var/x1 = max(0, c.x - 16) & ~0xf - var/y1 = max(0, c.y - 16) & ~0xf - var/x2 = min(world.maxx, c.x + 16) & ~0xf - var/y2 = min(world.maxy, c.y + 16) & ~0xf - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - if(chunkGenerated(x, y, c.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z) - if(!c) - chunk.hasChanged() - if(c in chunk.cameras) - chunk.cameras -= c - chunk.hasChanged() - -/mob/living/silicon/ai/var/mob/aiEye/eyeobj = new() - -/mob/living/silicon/ai/New() - ..() - eyeobj.ai = src - spawn(20) - freelook() - -/mob/living/silicon/ai/death(gibbed) - if(client && client.eye == eyeobj) - for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks) - c.remove(eyeobj) - client.eye = src - return ..(gibbed) - -/mob/living/silicon/ai/verb/freelook() - set category = "AI Commands" - set name = "freelook" - current = null //cancel camera view first, it causes problems - cameraFollow = null -// machine = null - if(!eyeobj) //if it got deleted somehow (like an admin trying to fix things <.<') - eyeobj = new() - eyeobj.ai = src - client.eye = eyeobj - eyeobj.loc = loc - cameranet.visibility(eyeobj) - cameraFollow = null - -/mob/aiEye/Move() - . = ..() - if(.) - cameranet.visibility(src) - -/client/AIMove(n, direct, var/mob/living/silicon/ai/user) - if(eye == user.eyeobj) - user.eyeobj.loc = get_step(user.eyeobj, direct) - cameranet.visibility(user.eyeobj) - - else - return ..() - -/* -/client/AIMoveZ(direct, var/mob/living/silicon/ai/user) - if(eye == user.eyeobj) - var/dif = 0 - if(direct == UP && user.eyeobj.z > 1) - dif = -1 - else if(direct == DOWN && user.eyeobj.z < 4) - dif = 1 - user.eyeobj.loc = locate(user.eyeobj.x, user.eyeobj.y, user.eyeobj.z + dif) - cameranet.visibility(user.eyeobj) - else - return ..() -*/ - -/turf/move_camera_by_click() - if(istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/AI = usr - if(AI.client.eye == AI.eyeobj) - return - return ..() - - -/obj/machinery/door/update_nearby_tiles(need_rebuild) - . = ..(need_rebuild) - cameranet.updateVisibility(loc) - -/obj/machinery/camera/New() - ..() - cameranet.addCamera(src) - -/obj/machinery/camera/Del() - cameranet.removeCamera(src) - ..() - -/obj/machinery/camera/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - . = ..(W, user) - if(istype(W, /obj/item/weapon/wirecutters)) - if(status) - cameranet.addCamera(src) - else - cameranet.removeCamera(src) - -/proc/checkcameravis(atom/A) - for(var/obj/machinery/camera/C in view(A,7)) - if(!C.status || C.stat == 2) - continue - return 1 - return 0 - -/mob/living/silicon/ai/attack_ai(var/mob/user as mob) - if (user != src) - return - - if (stat == 2) - return - - var/list/L = list() - for (var/obj/machinery/camera/C in world) - L.Add(C) - - camera_sort(L) - L = camera_network_sort(L) - - var/list/D = list() - for (var/obj/machinery/camera/C in L) - if ( C.network in src.networks ) - D[text("[]: [][]", C.network, C.c_tag, (C.status ? null : " (Deactivated)"))] = C - D["Cancel"] = "Cancel" - - var/t = input(user, "Which camera should you change to?") as null|anything in D - - if (!t || t == "Cancel") - return 0 - - var/obj/machinery/camera/C = D[t] - - eyeobj.loc = C.loc - cameranet.visibility(eyeobj) - - return - -/mob/living/silicon/ai/cancel_camera() - set name = "Cancel Camera View" - set category = "OOC" - reset_view(null) - machine = null - -/mob/living/silicon/ai/reset_view(atom/A) - if (client) - if(!eyeobj) - eyeobj = new() - eyeobj.ai = src - - client.eye = eyeobj - client.perspective = EYE_PERSPECTIVE - - if (istype(A, /atom/movable)) - eyeobj.loc = locate(A.x, A.y, A.z) - - else - eyeobj.loc = locate(src.x, src.y, src.z) - - cameranet.visibility(eyeobj) diff --git a/code/WorkInProgress/AI_Visibility/ai.dm b/code/WorkInProgress/AI_Visibility/ai.dm deleted file mode 100644 index 7dcbf54e67..0000000000 --- a/code/WorkInProgress/AI_Visibility/ai.dm +++ /dev/null @@ -1,107 +0,0 @@ - -/mob/aiEye - var/list/visibleCameraChunks = list() - var/mob/ai = null - density = 0 - -/mob/living/silicon/ai/var/mob/aiEye/eyeobj = new() - -/mob/living/silicon/ai/New() - ..() - eyeobj.ai = src - spawn(20) - freelook() - -/mob/living/silicon/ai/death(gibbed) - if(client && client.eye == eyeobj) - for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks) - c.remove(eyeobj) - client.eye = src - return ..(gibbed) - -/mob/living/silicon/ai/verb/freelook() - set category = "AI Commands" - set name = "freelook" - current = null //cancel camera view first, it causes problems - cameraFollow = null - if(!eyeobj) //if it got deleted somehow (like an admin trying to fix things <.<') - eyeobj = new() - eyeobj.ai = src - client.eye = eyeobj - eyeobj.loc = loc - cameranet.visibility(eyeobj) - -/mob/aiEye/Move() - . = ..() - if(.) - cameranet.visibility(src) - -/client/AIMove(n, direct, var/mob/living/silicon/ai/user) - if(eye == user.eyeobj) - user.eyeobj.loc = get_step(user.eyeobj, direct) - cameranet.visibility(user.eyeobj) - - else - return ..() - -/turf/move_camera_by_click() - if(istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/AI = usr - if(AI.client.eye == AI.eyeobj) - return - return ..() - -/mob/living/silicon/ai/attack_ai(var/mob/user as mob) - if (user != src) - return - - if (stat == 2) - return - - var/list/L = list() - for (var/obj/machinery/camera/C in world) - L.Add(C) - - camera_sort(L) - L = camera_network_sort(L) - - var/list/D = list() - for (var/obj/machinery/camera/C in L) - if ( C.network in src.networks ) - D[text("[]: [][]", C.network, C.c_tag, (C.status ? null : " (Deactivated)"))] = C - D["Cancel"] = "Cancel" - - var/t = input(user, "Which camera should you change to?") as null|anything in D - - if (!t || t == "Cancel") - return 0 - - var/obj/machinery/camera/C = D[t] - - eyeobj.loc = C.loc - cameranet.visibility(eyeobj) - - return - -/mob/living/silicon/ai/cancel_camera() - set name = "Cancel Camera View" - set category = "OOC" - reset_view(null) - machine = null - -/mob/living/silicon/ai/reset_view(atom/A) - if (client) - if(!eyeobj) - eyeobj = new() - eyeobj.ai = src - - client.eye = eyeobj - client.perspective = EYE_PERSPECTIVE - - if (istype(A, /atom/movable)) - eyeobj.loc = locate(A.x, A.y, A.z) - - else - eyeobj.loc = locate(src.x, src.y, src.z) - - cameranet.visibility(eyeobj) diff --git a/code/WorkInProgress/AI_Visibility/cameranet.dm b/code/WorkInProgress/AI_Visibility/cameranet.dm deleted file mode 100644 index 3b46844e6b..0000000000 --- a/code/WorkInProgress/AI_Visibility/cameranet.dm +++ /dev/null @@ -1,156 +0,0 @@ -//------------------------------------------------------------ -// -// The Cameranet -// -// The cameranet is a single global instance of a unique -// datum, which contains logic for managing the individual -// chunks. -// -//------------------------------------------------------------ - -/datum/cameranet - var/list/cameras = list() - var/list/chunks = list() - var/network = "net1" - var/ready = 0 - - var/list/minimap = list() - - var/generating_minimap = TRUE - -var/datum/cameranet/cameranet = new() - - - -/datum/cameranet/New() - ..() - - spawn(100) - init_minimap() - - -/datum/cameranet/proc/init_minimap() - for(var/x = 0, x <= world.maxx, x += 16) - for(var/y = 0, y <= world.maxy, y += 16) - sleep(1) - getCameraChunk(x, y, 5) - getCameraChunk(x, y, 1) - - generating_minimap = FALSE - - -/datum/cameranet/proc/chunkGenerated(x, y, z) - var/key = "[x],[y],[z]" - return key in chunks - - -/datum/cameranet/proc/getCameraChunk(x, y, z) - var/key = "[x],[y],[z]" - - if(!(key in chunks)) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] - - - - -// This proc updates what chunks are considered seen -// by an aiEye. As part of the process, it will force -// any newly visible chunks with pending unscheduled -// updates to update, and show the correct obscuring -// and dimming image sets. If you do not call this -// after the eye has moved, it may result in the -// affected AI gaining (partial) xray, seeing through -// now-closed doors, not seeing through open doors, -// or other visibility oddities, depending on if/when -// they last visited any of the chunks in the nearby -// area. - -// It must be called manually, as there is no way to -// have a proc called automatically every time an -// object's loc changes. - -/datum/cameranet/proc/visibility(mob/aiEye/ai) - var/x1 = max(0, ai.x - 16) & ~0xf - var/y1 = max(0, ai.y - 16) & ~0xf - var/x2 = min(world.maxx, ai.x + 16) & ~0xf - var/y2 = min(world.maxy, ai.y + 16) & ~0xf - - var/list/visibleChunks = list() - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - visibleChunks += getCameraChunk(x, y, ai.z) - - var/list/remove = ai.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - ai.visibleCameraChunks - - for(var/datum/camerachunk/c in remove) - c.remove(ai) - - for(var/datum/camerachunk/c in add) - c.add(ai) - - - - -// This proc should be called if a turf, or the contents -// of a turf, changes opacity. This includes such things -// as changing the turf, opening or closing a door, or -// anything else that would alter line of sight in the -// general area. - -/datum/cameranet/proc/updateVisibility(turf/loc) - if(!chunkGenerated(loc.x & ~0xf, loc.y & ~0xf, loc.z)) - return - - var/datum/camerachunk/chunk = getCameraChunk(loc.x & ~0xf, loc.y & ~0xf, loc.z) - chunk.visibilityChanged(loc) - - - - -// This proc updates all relevant chunks when enabling or -// creating a camera, allowing freelook and the minimap to -// respond correctly. - -/datum/cameranet/proc/addCamera(obj/machinery/camera/c) - var/x1 = max(0, c.x - 16) & ~0xf - var/y1 = max(0, c.y - 16) & ~0xf - var/x2 = min(world.maxx, c.x + 16) & ~0xf - var/y2 = min(world.maxy, c.y + 16) & ~0xf - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - if(chunkGenerated(x, y, c.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z) - - if(!(c in chunk.cameras)) - chunk.cameras += c - chunk.hasChanged() - - - - -// This proc updates all relevant chunks when disabling or -// deleting a camera, allowing freelook and the minimap to -// respond correctly. - -/datum/cameranet/proc/removeCamera(obj/machinery/camera/c) - var/x1 = max(0, c.x - 16) & ~0xf - var/y1 = max(0, c.y - 16) & ~0xf - var/x2 = min(world.maxx, c.x + 16) & ~0xf - var/y2 = min(world.maxy, c.y + 16) & ~0xf - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - if(chunkGenerated(x, y, c.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z) - - if(!c) - chunk.hasChanged() - - if(c in chunk.cameras) - chunk.cameras -= c - chunk.hasChanged() diff --git a/code/WorkInProgress/AI_Visibility/chunk.dm b/code/WorkInProgress/AI_Visibility/chunk.dm deleted file mode 100644 index 8a6886a1ad..0000000000 --- a/code/WorkInProgress/AI_Visibility/chunk.dm +++ /dev/null @@ -1,224 +0,0 @@ -#define MINIMAP_UPDATE_DELAY 1200 - -/datum/camerachunk - var/list/turfs = list() - - var/list/obscuredTurfs = list() - var/list/visibleTurfs = list() - var/list/dimTurfs = list() - - var/list/obscured = list() - var/list/dim = list() - - var/list/cameras = list() - var/list/seenby = list() - - var/changed = 1 - var/updating = 0 - var/minimap_updating = 0 - - var/x - var/y - var/z - - - var/icon/minimap_icon = new('icons/minimap.dmi', "chunk_base") - var/obj/minimap_obj/minimap_obj = new() - - - -/datum/camerachunk/New(loc, x, y, z) - //Round X and Y down to a multiple of 16, if nessecary - src.x = x & ~0xF - src.y = y & ~0xF - src.z = z - - rebuild_chunk() - - - -// Completely re-calculate the whole chunk. - -/datum/camerachunk/proc/rebuild_chunk() - for(var/mob/aiEye/eye in seenby) - if(!eye.ai) - seenby -= eye - continue - - if(eye.ai.client) - eye.ai.client.images -= obscured - eye.ai.client.images -= dim - - var/start = locate(x, y, z) - var/end = locate(min(x + 15, world.maxx), min(y + 15, world.maxy), z) - - turfs = block(start, end) - dimTurfs = list() - visibleTurfs = list() - obscured = list() - dim = list() - cameras = list() - - for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z))) - if(c.status) - cameras += c - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 7 - - dimTurfs |= turfs & view(7, c) - visibleTurfs |= turfs & view(6, c) - - c.luminosity = lum - - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - - for(var/turf/t in dimTurfs) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", TURF_LAYER) - t.dim.mouse_opacity = 0 - - dim += t.dim - - cameranet.minimap |= minimap_obj - - for(var/mob/aiEye/eye in seenby) - if(eye.ai.client) - eye.ai.client.images |= obscured - eye.ai.client.images |= dim - - - -/datum/camerachunk/proc/add(mob/aiEye/eye) - eye.visibleCameraChunks |= src - - if(eye.ai.client) - eye.ai.client.images |= obscured - eye.ai.client.images |= dim - - seenby |= eye - - if(changed && !updating) - update() - changed = 0 - - - -/datum/camerachunk/proc/remove(mob/aiEye/eye) - eye.visibleCameraChunks -= src - - if(eye.ai.client) - eye.ai.client.images -= obscured - eye.ai.client.images -= dim - - seenby -= eye - -/datum/camerachunk/proc/visibilityChanged(turf/loc) - if(!(loc in visibleTurfs)) - return - - hasChanged() - -/datum/camerachunk/proc/hasChanged() - if(length(seenby) > 0) - if(!updating) - updating = 1 - - spawn(10)//Batch large changes, such as many doors opening or closing at once - update() - updating = 0 - - else - changed = 1 - - if(!minimap_updating) - minimap_updating = 1 - - spawn(MINIMAP_UPDATE_DELAY) - if(changed && !updating) - update() - changed = 0 - - update_minimap() - minimap_updating = 0 - -/datum/camerachunk/proc/update() - - var/list/newDimTurfs = list() - var/list/newVisibleTurfs = list() - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 7 - - newDimTurfs |= turfs & view(7, c) - newVisibleTurfs |= turfs & view(6, c) - - c.luminosity = lum - - var/list/dimAdded = newDimTurfs - dimTurfs - var/list/dimRemoved = dimTurfs - newDimTurfs - var/list/visAdded = newVisibleTurfs - visibleTurfs - var/list/visRemoved = visibleTurfs - newVisibleTurfs - - visibleTurfs = newVisibleTurfs - dimTurfs = newDimTurfs - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - var/list/images_added = list() - var/list/images_removed = list() - - for(var/turf/t in dimRemoved) - if(t.dim) - dim -= t.dim - images_removed += t.dim - - if(!(t in visibleTurfs)) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - images_added += t.obscured - - for(var/turf/t in dimAdded) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", 15) - t.dim.mouse_opacity = 0 - - dim += t.dim - images_added += t.dim - - if(t.obscured) - obscured -= t.obscured - images_removed += t.obscured - - for(var/turf/t in visAdded) - if(t.obscured) - obscured -= t.obscured - images_removed += t.obscured - - for(var/turf/t in visRemoved) - if(t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - images_added += t.obscured - - for(var/mob/aiEye/eye in seenby) - if(eye.ai) - if(eye.ai.client) - eye.ai.client.images -= images_removed - eye.ai.client.images |= images_added - else - seenby -= eye \ No newline at end of file diff --git a/code/WorkInProgress/AI_Visibility/minimap.dm b/code/WorkInProgress/AI_Visibility/minimap.dm deleted file mode 100644 index c97b01e0f8..0000000000 --- a/code/WorkInProgress/AI_Visibility/minimap.dm +++ /dev/null @@ -1,137 +0,0 @@ -/client/var/minimap_view_z = 1 - -/obj/minimap_obj - var/datum/camerachunk/chunk - -/obj/minimap_obj/Click(location, control, params) - if(!istype(usr, /mob/dead) && !istype(usr, /mob/living/silicon/ai) && !(usr.client && usr.client.holder && usr.client.holder.level >= 4)) - return - - var/list/par = params2list(params) - var/screen_loc = par["screen-loc"] - - if(findtext(screen_loc, "minimap:") != 1) - return - - screen_loc = copytext(screen_loc, length("minimap:") + 1) - - var/x_text = copytext(screen_loc, 1, findtext(screen_loc, ",")) - var/y_text = copytext(screen_loc, findtext(screen_loc, ",") + 1) - - var/x = chunk.x - x += round((text2num(copytext(x_text, findtext(x_text, ":") + 1)) + 1) / 2) - - var/y = chunk.y - y += round((text2num(copytext(y_text, findtext(y_text, ":") + 1)) + 1) / 2) - - if(istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - ai.freelook() - ai.eyeobj.loc = locate(max(1, x - 1), max(1, y - 1), usr.client.minimap_view_z) - cameranet.visibility(ai.eyeobj) - - else - usr.loc = locate(max(1, x - 1), max(1, y - 1), usr.client.minimap_view_z) - -/mob/dead/verb/Open_Minimap() - set category = "Ghost" - cameranet.show_minimap(client) - - -/mob/living/silicon/ai/verb/Open_Minimap() - set category = "AI Commands" - cameranet.show_minimap(client) - - -/client/proc/Open_Minimap() - set category = "Admin" - cameranet.show_minimap(src) - - -/mob/verb/Open_Minimap_Z() - set hidden = 1 - - if(!istype(src, /mob/dead) && !istype(src, /mob/living/silicon/ai) && !(client && client.holder && client.holder.level >= 4)) - return - - var/level = input("Select a Z level", "Z select", null) as null | anything in cameranet.minimap - - if(level != null) - cameranet.show_minimap(client, level) - - - -/datum/cameranet/proc/show_minimap(client/client, z_level = "z-1") - if(!istype(client.mob, /mob/dead) && !istype(client.mob, /mob/living/silicon/ai) && !(client.holder && client.holder.level >= 4)) - return - - if(z_level in cameranet.minimap) - winshow(client, "minimapwindow", 1) - - for(var/key in cameranet.minimap) - client.screen -= cameranet.minimap[key] - - client.screen |= cameranet.minimap[z_level] - - if(cameranet.generating_minimap) - spawn(50) - show_minimap(client, z_level) - - client.minimap_view_z = text2num(copytext(z_level, 3)) - - -/datum/camerachunk/proc/update_minimap() - if(changed && !updating) - update() - - minimap_icon.Blend(rgb(255, 0, 0), ICON_MULTIPLY) - - var/list/turfs = visibleTurfs | dimTurfs - - for(var/turf/turf in turfs) - var/x = (turf.x & 0xf) * 2 - var/y = (turf.y & 0xf) * 2 - - if(turf.density) - minimap_icon.DrawBox(rgb(100, 100, 100), x + 1, y + 1, x + 2, y + 2) - continue - - else if(istype(turf, /turf/space)) - minimap_icon.DrawBox(rgb(0, 0, 0), x + 1, y + 1, x + 2, y + 2) - - else - minimap_icon.DrawBox(rgb(200, 200, 200), x + 1, y + 1, x + 2, y + 2) - - for(var/obj/structure/o in turf) - if(o.density) - if(istype(o, /obj/structure/window) && (o.dir == NORTH || o.dir == SOUTH || o.dir == EAST || o.dir == WEST)) - if(o.dir == NORTH) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 2, x + 2, y + 2) - else if(o.dir == SOUTH) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 2, y + 1) - else if(o.dir == EAST) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 3, y + 1, x + 2, y + 2) - else if(o.dir == WEST) - minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 1, y + 2) - - else - minimap_icon.DrawBox(rgb(150, 150, 150), x + 1, y + 1, x + 2, y + 2) - break - - for(var/obj/machinery/door/o in turf) - if(istype(o, /obj/machinery/door/window)) - if(o.dir == NORTH) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 2, x + 2, y + 2) - else if(o.dir == SOUTH) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 1) - else if(o.dir == EAST) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 2, y + 1, x + 2, y + 2) - else if(o.dir == WEST) - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 1, y + 2) - - else - minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 2) - break - - minimap_obj.screen_loc = "minimap:[src.x / 16],[src.y / 16]" - minimap_obj.icon = minimap_icon diff --git a/code/WorkInProgress/AI_Visibility/util.dm b/code/WorkInProgress/AI_Visibility/util.dm deleted file mode 100644 index da576cbd40..0000000000 --- a/code/WorkInProgress/AI_Visibility/util.dm +++ /dev/null @@ -1,38 +0,0 @@ - -/turf - var/image/obscured - var/image/dim - -/turf/proc/visibilityChanged() - cameranet.updateVisibility(src) - -/turf/New() - ..() - cameranet.updateVisibility(src) - -/obj/machinery/door/update_nearby_tiles(need_rebuild) - . = ..(need_rebuild) - cameranet.updateVisibility(loc) - -/obj/machinery/camera/New() - ..() - cameranet.addCamera(src) - -/obj/machinery/camera/Del() - cameranet.removeCamera(src) - ..() - -/obj/machinery/camera/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - . = ..(W, user) - if(istype(W, /obj/item/weapon/wirecutters)) - if(status) - cameranet.addCamera(src) - else - cameranet.removeCamera(src) - -/proc/checkcameravis(atom/A) - for(var/obj/machinery/camera/C in view(A,7)) - if(!C.status || C.stat == 2) - continue - return 1 - return 0 diff --git a/code/WorkInProgress/Apples/artifacts.dm b/code/WorkInProgress/Apples/artifacts.dm deleted file mode 100644 index 242a17074e..0000000000 --- a/code/WorkInProgress/Apples/artifacts.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/changestone - name = "An uncut ruby" - desc = "The ruby shines and catches the light, despite being uncut" - icon = 'icons/obj/artifacts.dmi' - icon_state = "changerock" - -obj/item/changestone/attack_hand(var/mob/user as mob) - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(!H.gloves) - if (H.gender == FEMALE) - H.gender = MALE - else - H.gender = FEMALE - H.dna.ready_dna(H) - H.update_body() - ..() - - - - - - diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/falsewall.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/falsewall.dm deleted file mode 100644 index 1a5d46371a..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/falsewall.dm +++ /dev/null @@ -1,59 +0,0 @@ -//simplified copy of /obj/structure/falsewall - -/obj/effect/landmark/falsewall_spawner - name = "falsewall spawner" - -/obj/structure/temple_falsewall - name = "wall" - anchored = 1 - icon = 'icons/turf/walls.dmi' - icon_state = "phoron0" - opacity = 1 - var/closed_wall_dir = 0 - var/opening = 0 - var/mineral = "phoron" - var/is_metal = 0 - -/obj/structure/temple_falsewall/New() - ..() - spawn(10) - if(prob(95)) - desc = pick("Something seems slightly off about it.","") - - var/junction = 0 //will be used to determine from which side the wall is connected to other walls - - for(var/turf/unsimulated/wall/W in orange(src,1)) - if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls - junction |= get_dir(src,W) - - closed_wall_dir = junction - density = 1 - icon_state = "[mineral][closed_wall_dir]" - -/obj/structure/temple_falsewall/attack_hand(mob/user as mob) - if(opening) - return - - if(density) - opening = 1 - if(is_metal) - icon_state = "metalfwall_open" - flick("metalfwall_opening", src) - else - icon_state = "[mineral]fwall_open" - flick("[mineral]fwall_opening", src) - sleep(15) - src.density = 0 - SetOpacity(0) - opening = 0 - else - opening = 1 - icon_state = "[mineral][closed_wall_dir]" - if(is_metal) - flick("metalfwall_closing", src) - else - flick("[mineral]fwall_closing", src) - density = 1 - sleep(15) - SetOpacity(1) - opening = 0 diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dm deleted file mode 100644 index 421e803ec4..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dm +++ /dev/null @@ -1,345 +0,0 @@ -//some testin stuff - -#define PATH_SPREAD_CHANCE_START 90 -#define PATH_SPREAD_CHANCE_LOSS_UPPER 80 -#define PATH_SPREAD_CHANCE_LOSS_LOWER 50 - -#define RIVER_SPREAD_CHANCE_START 100 -#define RIVER_SPREAD_CHANCE_LOSS_UPPER 65 -#define RIVER_SPREAD_CHANCE_LOSS_LOWER 50 - -#define RANDOM_UPPER_X 100 -#define RANDOM_UPPER_Y 100 - -#define RANDOM_LOWER_X 18 -#define RANDOM_LOWER_Y 18 - -/area/jungle - name = "jungle" - icon = 'code/workinprogress/cael_aislinn/jungle/jungle.dmi' - icon_state = "area" - lighting_use_dynamic = 0 - luminosity = 1 - -//randomly spawns, will create paths around the map -/obj/effect/landmark/path_waypoint - name = "path waypoint" - icon_state = "x2" - var/connected = 0 - -/obj/effect/landmark/temple - name = "temple entrance" - icon_state = "x2" - var/obj/structure/ladder/my_ladder - - New() - //pick a random temple to link to - var/list/waypoints = list() - for(var/obj/effect/landmark/temple/destination/T in landmarks_list) - waypoints.Add(T) - if(!T) - return - else continue - var/obj/effect/landmark/temple/destination/dest_temple = pick(waypoints) - dest_temple.init() - - //connect this landmark to the other - my_ladder = new /obj/structure/ladder(src.loc) - my_ladder.id = dest_temple.my_ladder.id - dest_temple.my_ladder.up = my_ladder - - //delete the landmarks now that we're finished - del(dest_temple) - del(src) - -/obj/effect/landmark/temple/destination/New() - //nothing - -/obj/effect/landmark/temple/destination/proc/init() - my_ladder = new /obj/structure/ladder(src.loc) - my_ladder.id = rand(999) - my_ladder.height = -1 - - //loop over the walls in the temple and make them a random pre-chosen mineral (null is a stand in for phoron, which the walls already are) - //treat phoron slightly differently because it's the default wall type - var/mineral = pick("uranium","sandstone","gold","iron","silver","diamond","clown","phoron") - //world << "init [mineral]" - var/area/my_area = get_area(src) - var/list/temple_turfs = get_area_turfs(my_area.type) - - for(var/turf/simulated/floor/T in temple_turfs) - - for(var/obj/effect/landmark/falsewall_spawner/F in T.contents) - var/obj/structure/temple_falsewall/fwall = new(F.loc) - fwall.mineral = mineral - if(mineral == "iron") - fwall.is_metal = 1 - del(F) - - for(var/obj/effect/landmark/door_spawner/D in T.contents) - var/spawn_type - if(mineral == "iron") - spawn_type = text2path("/obj/machinery/door/airlock/vault") - else - spawn_type = text2path("/obj/machinery/door/airlock/[mineral]") - new spawn_type(D.loc) - del(D) - - for(var/turf/unsimulated/wall/T in temple_turfs) - if(mineral != "phoron") - T.icon_state = replacetext(T.icon_state, "phoron", mineral) - - /*for(var/obj/effect/landmark/falsewall_spawner/F in T.contents) - //world << "falsewall_spawner found in wall" - var/obj/structure/temple_falsewall/fwall = new(F.loc) - fwall.mineral = mineral - del(F) - - for(var/obj/effect/landmark/door_spawner/D in T.contents) - //world << "door_spawner found in wall" - T = new /turf/unsimulated/floor(T.loc) - T.icon_state = "dark" - var/spawn_type = text2path("/obj/machinery/door/airlock/[door_mineral]") - new spawn_type(T) - del(D)*/ - -//a shuttle has crashed somewhere on the map, it should have a power cell to let the adventurers get home -/area/jungle/crash_ship_source - icon_state = "crash" - -/area/jungle/crash_ship_clean - icon_state = "crash" - -/area/jungle/crash_ship_one - icon_state = "crash" - -/area/jungle/crash_ship_two - icon_state = "crash" - -/area/jungle/crash_ship_three - icon_state = "crash" - -/area/jungle/crash_ship_four - icon_state = "crash" - -//randomly spawns, will create rivers around the map -//uses the same logic as jungle paths -/obj/effect/landmark/river_waypoint - name = "river source waypoint" - var/connected = 0 - -/obj/machinery/jungle_controller - name = "jungle controller" - desc = "a mysterious and ancient piece of machinery" - var/list/animal_spawners = list() - - -/obj/machinery/jungle_controller/initialize() - world << "\red \b Setting up jungle, this may take a bleeding eternity..." - - //crash dat shuttle - var/area/start_location = locate(/area/jungle/crash_ship_source) - var/area/clean_location = locate(/area/jungle/crash_ship_clean) - var/list/ship_locations = list(/area/jungle/crash_ship_one, /area/jungle/crash_ship_two, /area/jungle/crash_ship_three, /area/jungle/crash_ship_four) - var/area/end_location = locate( pick(ship_locations) ) - ship_locations -= end_location.type - - start_location.move_contents_to(end_location) - for(var/area_type in ship_locations) - var/area/cur_location = locate(area_type) - clean_location.copy_turfs_to(cur_location) - - //drop some random river nodes - var/list/river_nodes = list() - var/max = rand(1,3) - var/num_spawned = 0 - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!istype(J)) - continue - if(!J.bushes_spawn) - continue - river_nodes.Add(new /obj/effect/landmark/river_waypoint(J)) - num_spawned++ - - //make some randomly pathing rivers - for(var/obj/effect/landmark/river_waypoint/W in landmarks_list) - if (W.z != src.z || W.connected) - continue - - W.connected = 1 - var/turf/cur_turf = new /turf/unsimulated/jungle/water(get_turf(W)) - var/turf/target_turf = get_turf(pick(river_nodes)) - - var/detouring = 0 - var/cur_dir = get_dir(cur_turf, target_turf) - // - while(cur_turf != target_turf) - //randomly snake around a bit - if(detouring) - if(prob(20)) - detouring = 0 - cur_dir = get_dir(cur_turf, target_turf) - else if(prob(20)) - detouring = 1 - if(prob(50)) - cur_dir = turn(cur_dir, 45) - else - cur_dir = turn(cur_dir, -45) - else - cur_dir = get_dir(cur_turf, target_turf) - - cur_turf = get_step(cur_turf, cur_dir) - - var/skip = 0 - if(!istype(cur_turf, /turf/unsimulated/jungle) || istype(cur_turf, /turf/unsimulated/jungle/rock)) - detouring = 0 - cur_dir = get_dir(cur_turf, target_turf) - cur_turf = get_step(cur_turf, cur_dir) - continue - - if(!skip) - var/turf/unsimulated/jungle/water/water_turf = new(cur_turf) - water_turf.Spread(75, rand(65, 25)) - - var/list/path_nodes = list() - - //place some ladders leading down to pre-generated temples - max = rand(2,5) - num_spawned = 0 - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !J.bushes_spawn) - continue - new /obj/effect/landmark/temple(J) - path_nodes.Add(new /obj/effect/landmark/path_waypoint(J)) - num_spawned++ - - //put a native tribe somewhere - num_spawned = 0 - while(num_spawned < 1) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !J.bushes_spawn) - continue - new /obj/effect/jungle_tribe_spawn(J) - path_nodes.Add(new /obj/effect/landmark/path_waypoint(J)) - num_spawned++ - - //place some random path waypoints to confuse players - max = rand(1,3) - num_spawned = 0 - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !J.bushes_spawn) - continue - path_nodes.Add(new /obj/effect/landmark/path_waypoint(J)) - num_spawned++ - - //get any path nodes placed on the map - for(var/obj/effect/landmark/path_waypoint/W in landmarks_list) - if (W.z == src.z) - path_nodes.Add(W) - - //make random, connecting paths - for(var/obj/effect/landmark/path_waypoint/W in path_nodes) - if (W.connected) - continue - - W.connected = 1 - var/turf/cur_turf = get_turf(W) - path_nodes.Remove(W) - var/turf/target_turf = get_turf(pick(path_nodes)) - path_nodes.Add(W) - // - cur_turf = new /turf/unsimulated/jungle/path(cur_turf) - - var/detouring = 0 - var/cur_dir = get_dir(cur_turf, target_turf) - // - while(cur_turf != target_turf) - //randomly snake around a bit - if(detouring) - if(prob(20) || get_dist(cur_turf, target_turf) < 5) - detouring = 0 - cur_dir = get_dir(cur_turf, target_turf) - else if(prob(20) && get_dist(cur_turf, target_turf) > 5) - detouring = 1 - if(prob(50)) - cur_dir = turn(cur_dir, 45) - else - cur_dir = turn(cur_dir, -45) - else - cur_dir = get_dir(cur_turf, target_turf) - - //move a step forward - cur_turf = get_step(cur_turf, cur_dir) - - //if we're not a jungle turf, get back to what we were doing - if(!istype(cur_turf, /turf/unsimulated/jungle/)) - cur_dir = get_dir(cur_turf, target_turf) - cur_turf = get_step(cur_turf, cur_dir) - continue - - var/turf/unsimulated/jungle/J = cur_turf - if(istype(J, /turf/unsimulated/jungle/impenetrable) || istype(J, /turf/unsimulated/jungle/water/deep)) - cur_dir = get_dir(cur_turf, target_turf) - cur_turf = get_step(cur_turf, cur_dir) - continue - - if(!istype(J, /turf/unsimulated/jungle/water)) - J = new /turf/unsimulated/jungle/path(cur_turf) - J.Spread(PATH_SPREAD_CHANCE_START, rand(PATH_SPREAD_CHANCE_LOSS_UPPER, PATH_SPREAD_CHANCE_LOSS_LOWER)) - - //create monkey spawners - num_spawned = 0 - max = rand(3,6) - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !J.bushes_spawn) - continue - animal_spawners.Add(new /obj/effect/landmark/animal_spawner/monkey(J)) - num_spawned++ - - //create panther spawners - num_spawned = 0 - max = rand(6,12) - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !istype(J) || !J.bushes_spawn) - continue - animal_spawners.Add(new /obj/effect/landmark/animal_spawner/panther(J)) - num_spawned++ - - //create snake spawners - num_spawned = 0 - max = rand(6,12) - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !istype(J) || !J.bushes_spawn) - continue - animal_spawners.Add(new /obj/effect/landmark/animal_spawner/snake(J)) - num_spawned++ - - //create parrot spawners - num_spawned = 0 - max = rand(3,6) - while(num_spawned < max) - var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) - if(!J || !istype(J) || !J.bushes_spawn) - continue - animal_spawners.Add(new /obj/effect/landmark/animal_spawner/parrot(J)) - num_spawned++ - -#undef PATH_SPREAD_CHANCE_START -#undef PATH_SPREAD_CHANCE_LOSS_UPPER -#undef PATH_SPREAD_CHANCE_LOSS_LOWER - -#undef RIVER_SPREAD_CHANCE_START -#undef RIVER_SPREAD_CHANCE_LOSS_UPPER -#undef RIVER_SPREAD_CHANCE_LOSS_LOWER - -#undef RANDOM_UPPER_X -#undef RANDOM_UPPER_Y - -#undef RANDOM_LOWER_X -#undef RANDOM_LOWER_Y diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm deleted file mode 100644 index 4c95b5be1c..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm +++ /dev/null @@ -1,158 +0,0 @@ - -//spawns one of the specified animal type -/obj/effect/landmark/animal_spawner - icon_state = "x3" - var/spawn_type - var/mob/living/spawned_animal - invisibility = 101 - -/obj/effect/landmark/animal_spawner/New() - if(!spawn_type) - var/new_type = pick(typesof(/obj/effect/landmark/animal_spawner) - /obj/effect/landmark/animal_spawner) - new new_type(get_turf(src)) - del(src) - - processing_objects.Add(src) - spawned_animal = new spawn_type(get_turf(src)) - -/obj/effect/landmark/animal_spawner/process() - //if any of our animals are killed, spawn new ones - if(!spawned_animal || spawned_animal.stat == DEAD) - spawned_animal = new spawn_type(src) - //after a random timeout, and in a random position (6-30 seconds) - spawn(rand(1200,2400)) - spawned_animal.loc = locate(src.x + rand(-12,12), src.y + rand(-12,12), src.z) - -/obj/effect/landmark/animal_spawner/Del() - processing_objects.Remove(src) - -/obj/effect/landmark/animal_spawner/panther - name = "panther spawner" - spawn_type = /mob/living/simple_animal/hostile/panther - -/obj/effect/landmark/animal_spawner/parrot - name = "parrot spawner" - spawn_type = /mob/living/simple_animal/parrot - -/obj/effect/landmark/animal_spawner/monkey - name = "monkey spawner" - spawn_type = /mob/living/carbon/monkey - -/obj/effect/landmark/animal_spawner/snake - name = "snake spawner" - spawn_type = /mob/living/simple_animal/hostile/snake - - -//*********// -// Panther // -//*********// - -/mob/living/simple_animal/hostile/panther - name = "panther" - desc = "A long sleek, black cat with sharp teeth and claws." - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "panther" - icon_living = "panther" - icon_dead = "panther_dead" - icon_gib = "panther_dead" - speak_chance = 0 - turns_per_move = 3 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - stop_automated_movement_when_pulled = 0 - maxHealth = 50 - health = 50 - - harm_intent_damage = 8 - melee_damage_lower = 15 - melee_damage_upper = 15 - attacktext = "slashed" - attack_sound = 'sound/weapons/bite.ogg' - - layer = 3.1 //so they can stay hidde under the /obj/structure/bush - var/stalk_tick_delay = 3 - -/mob/living/simple_animal/hostile/panther/ListTargets() - var/list/targets = list() - for(var/mob/living/carbon/human/H in view(src, 10)) - targets += H - return targets - -/mob/living/simple_animal/hostile/panther/FindTarget() - . = ..() - if(.) - emote("nashes at [.]") - -/mob/living/simple_animal/hostile/panther/AttackingTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") - -/mob/living/simple_animal/hostile/panther/AttackTarget() - ..() - if(stance == HOSTILE_STANCE_ATTACKING && get_dist(src, target_mob)) - stalk_tick_delay -= 1 - if(stalk_tick_delay <= 0) - src.loc = get_step_towards(src, target_mob) - stalk_tick_delay = 3 - -//*******// -// Snake // -//*******// - -/mob/living/simple_animal/hostile/snake - name = "snake" - desc = "A sinuously coiled, venomous looking reptile." - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - icon_gib = "snake_dead" - speak_chance = 0 - turns_per_move = 1 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - stop_automated_movement_when_pulled = 0 - maxHealth = 25 - health = 25 - - harm_intent_damage = 2 - melee_damage_lower = 3 - melee_damage_upper = 10 - attacktext = "bitten" - attack_sound = 'sound/weapons/bite.ogg' - - layer = 3.1 //so they can stay hidde under the /obj/structure/bush - var/stalk_tick_delay = 3 - -/mob/living/simple_animal/hostile/snake/ListTargets() - var/list/targets = list() - for(var/mob/living/carbon/human/H in view(src, 10)) - targets += H - return targets - -/mob/living/simple_animal/hostile/snake/FindTarget() - . = ..() - if(.) - emote("hisses wickedly") - -/mob/living/simple_animal/hostile/snake/AttackingTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - L.apply_damage(rand(3,12), TOX) - -/mob/living/simple_animal/hostile/snake/AttackTarget() - ..() - if(stance == HOSTILE_STANCE_ATTACKING && get_dist(src, target_mob)) - stalk_tick_delay -= 1 - if(stalk_tick_delay <= 0) - src.loc = get_step_towards(src, target_mob) - stalk_tick_delay = 3 diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm deleted file mode 100644 index 3f1a7c2f4b..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm +++ /dev/null @@ -1,119 +0,0 @@ -//*********************// -// Generic undergrowth // -//*********************// - -/obj/structure/bush - name = "foliage" - desc = "Pretty thick scrub, it'll take something sharp and a lot of determination to clear away." - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "bush1" - density = 1 - anchored = 1 - layer = 3.2 - var/indestructable = 0 - var/stump = 0 - -/obj/structure/bush/New() - if(prob(20)) - opacity = 1 - -/obj/structure/bush/Bumped(M as mob) - if (istype(M, /mob/living/simple_animal)) - var/mob/living/simple_animal/A = M - A.loc = get_turf(src) - else if (istype(M, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/A = M - A.loc = get_turf(src) - -/obj/structure/bush/attackby(var/obj/I as obj, var/mob/user as mob) - //hatchets can clear away undergrowth - if(istype(I, /obj/item/weapon/hatchet) && !stump) - if(indestructable) - //this bush marks the edge of the map, you can't destroy it - user << "\red You flail away at the undergrowth, but it's too thick here." - else - user.visible_message("\red [user] begins clearing away [src].","\red You begin clearing away [src].") - spawn(rand(15,30)) - if(get_dist(user,src) < 2) - user << "\blue You clear away [src]." - var/obj/item/stack/sheet/wood/W = new(src.loc) - W.amount = rand(3,15) - if(prob(50)) - icon_state = "stump[rand(1,2)]" - name = "cleared foliage" - desc = "There used to be dense undergrowth here." - density = 0 - stump = 1 - pixel_x = rand(-6,6) - pixel_y = rand(-6,6) - else - del(src) - else - return ..() - -//*******************************// -// Strange, fruit-bearing plants // -//*******************************// - -var/list/fruit_icon_states = list("badrecipe","kudzupod","reishi","lime","grapes","boiledrorocore","chocolateegg") -var/list/reagent_effects = list("toxin","anti_toxin","stoxin","space_drugs","mindbreaker","zombiepowder","impedrezene") -var/jungle_plants_init = 0 - -/proc/init_jungle_plants() - jungle_plants_init = 1 - fruit_icon_states = shuffle(fruit_icon_states) - reagent_effects = shuffle(reagent_effects) - -/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit - name = "jungle fruit" - desc = "It smells weird and looks off." - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "orange" - potency = 1 - -/obj/structure/jungle_plant - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "plant1" - desc = "Looks like some of that fruit might be edible." - var/fruits_left = 3 - var/fruit_type = -1 - var/icon/fruit_overlay - var/plant_strength = 1 - var/fruit_r - var/fruit_g - var/fruit_b - - -/obj/structure/jungle_plant/New() - if(!jungle_plants_init) - init_jungle_plants() - - fruit_type = rand(1,7) - icon_state = "plant[fruit_type]" - fruits_left = rand(1,5) - fruit_overlay = icon('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"fruit[fruits_left]") - fruit_r = 255 - fruit_type * 36 - fruit_g = rand(1,255) - fruit_b = fruit_type * 36 - fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD) - overlays += fruit_overlay - plant_strength = rand(20,200) - -/obj/structure/jungle_plant/attack_hand(var/mob/user as mob) - if(fruits_left > 0) - fruits_left-- - user << "\blue You pick a fruit off [src]." - - var/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit/J = new (src.loc) - J.potency = plant_strength - J.icon_state = fruit_icon_states[fruit_type] - J.reagents.add_reagent(reagent_effects[fruit_type], 1+round((plant_strength / 20), 1)) - J.bitesize = 1+round(J.reagents.total_volume / 2, 1) - J.attack_hand(user) - - overlays -= fruit_overlay - fruit_overlay = icon('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"fruit[fruits_left]") - fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD) - overlays += fruit_overlay - else - user << "\red There are no fruit left on [src]." diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm deleted file mode 100644 index 7e350dc3a0..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm +++ /dev/null @@ -1,398 +0,0 @@ -//randomly generated temples, indiana jones style (minus the cultists, probably) - -/area/jungle/temple_one - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple1" - -/area/jungle/temple_two - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple2" - -/area/jungle/temple_three - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple3" - -/area/jungle/temple_four - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple4" - -/area/jungle/temple_five - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple5" - -/area/jungle/temple_six - name = "temple" - lighting_use_dynamic = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "temple6" - -/obj/effect/landmark/door_spawner - name = "door spawner" - -//******// -// Loot // -//******// - -/obj/effect/landmark/glowshroom_spawn - icon_state = "x3" - invisibility = 101 - New() - if(prob(10)) - new /obj/effect/glowshroom(src.loc) - del(src) - -/obj/effect/landmark/loot_spawn - name = "loot spawner" - icon_state = "grabbed1" - var/low_probability = 0 - New() - - switch(pick( \ - low_probability * 1000;"nothing", \ - 200 - low_probability * 175;"treasure", \ - 25 + low_probability * 75;"remains", \ - 25 + low_probability * 75;"plants", \ - 5; "blob", \ - 50 + low_probability * 50;"clothes", \ - "glasses", \ - 100 - low_probability * 50;"weapons", \ - 100 - low_probability * 50;"spacesuit", \ - "health", \ - 25 + low_probability * 75;"snacks", \ - 25;"alien", \ - "lights", \ - 25 - low_probability * 25;"engineering", \ - 25 - low_probability * 25;"coffin", \ - 25;"mimic", \ - 25;"viscerator", \ - )) - if("treasure") - var/obj/structure/closet/crate/C = new(src.loc) - if(prob(33)) - //coins - - var/amount = rand(2,6) - var/list/possible_spawns = list() - for(var/coin_type in typesof(/obj/item/weapon/coin)) - possible_spawns += coin_type - - var/coin_type = pick(possible_spawns) - for(var/i=0,iA sawblade shoots out of the ground and strikes you!" - M.apply_damage(rand(5,10), BRUTE, sharp=1, edge=1) - - var/atom/myloc = src.loc - var/image/flicker = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"sawblade") - myloc.overlays += flicker - spawn(8) - myloc.overlays -= flicker - del(flicker) - //flick("sawblade",src) - if("poison_dart") - M << "\red You feel something small and sharp strike you!" - M.apply_damage(rand(5,10), TOX) - - var/atom/myloc = src.loc - var/image/flicker = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"dart[rand(1,3)]") - myloc.overlays += flicker - spawn(8) - myloc.overlays -= flicker - del(flicker) - //flick("dart[rand(1,3)]",src) - if("flame_burst") - M << "\red A jet of fire comes out of nowhere!" - M.apply_damage(rand(5,10), BURN) - - var/atom/myloc = src.loc - var/image/flicker = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"flameburst") - myloc.overlays += flicker - spawn(8) - myloc.overlays -= flicker - del flicker - //flick("flameburst",src) - if("phoron_gas") - //spawn a bunch of phoron - if("n2_gas") - //spawn a bunch of sleeping gas - if("thrower") - //edited version of obj/effect/step_trigger/thrower - var/throw_dir = pick(1,2,4,8) - M.visible_message("\red The floor under [M] suddenly tips upward!","\red The floor tips upward under you!") - - var/atom/myloc = src.loc - var/image/flicker = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"throw[throw_dir]") - myloc.overlays += flicker - var/turf/my_turf = get_turf(loc) - if(!my_turf.density) - my_turf.density = 1 - spawn(8) - my_turf.density = 0 - spawn(8) - myloc.overlays -= flicker - del(flicker) - - var/dist = rand(1,5) - var/curtiles = 0 - while(M) - if(curtiles >= dist) - break - if(M.z != src.z) - break - - curtiles++ - sleep(1) - - var/predir = M.dir - step(M, throw_dir) - M.set_dir(predir) - -//gives turf a different description, to try and trick players -/obj/effect/step_trigger/trap/fake - icon_state = "faketrap" - name = "fake trap" - - New() - if(prob(10)) - new /obj/effect/glowshroom(src.loc) - if(prob(90)) - var/turf/T = get_turf(src) - T.desc = pick("It looks a little dustier than the surrounding tiles.","It is somewhat ornate.","It looks a little darker than the surrounding tiles.") - del(src) - -//50% chance of being a trap -/obj/effect/step_trigger/trap/fifty - icon_state = "trap" - name = "fifty fifty trap" - icon_state = "fiftytrap" - - New() - if(prob(50)) - ..() - else - if(prob(10)) - new /obj/effect/glowshroom(src.loc) - del(src) diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_tribe.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_tribe.dm deleted file mode 100644 index 46ad23cedf..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_tribe.dm +++ /dev/null @@ -1,91 +0,0 @@ - - -/obj/item/projectile/jungle_spear - damage = 10 - damage_type = TOX - icon_state = "bullet" - -/obj/effect/jungle_tribe_spawn - name = "campfire" - desc = "Looks cosy, in an alien sort of way." - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "campfire" - anchored = 1 - var/list/tribesmen = list() - var/list/enemy_players = list() - var/tribe_type = 1 - -/obj/effect/jungle_tribe_spawn/New() - processing_objects.Add(src) - tribe_type = rand(1,5) - - var/num_tribesmen = rand(3,6) - for(var/i=0,i[src] throws a spear at [target_mob]!", 1) - flick(src, "native[my_type]_act") - - var/tturf = get_turf(target_mob) - Shoot(tturf, src.loc, src) diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm deleted file mode 100644 index 7daeae006b..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm +++ /dev/null @@ -1,178 +0,0 @@ - -/turf/unsimulated/jungle - var/bushes_spawn = 1 - var/plants_spawn = 1 - name = "wet grass" - desc = "Thick, long wet grass" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "grass1" - var/icon_spawn_state = "grass1" - luminosity = 3 - - New() - icon_state = icon_spawn_state - - if(plants_spawn && prob(40)) - if(prob(90)) - var/image/I - if(prob(35)) - I = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"plant[rand(1,7)]") - else - if(prob(30)) - I = image('icons/obj/flora/ausflora.dmi',"reedbush_[rand(1,4)]") - else if(prob(33)) - I = image('icons/obj/flora/ausflora.dmi',"leafybush_[rand(1,3)]") - else if(prob(50)) - I = image('icons/obj/flora/ausflora.dmi',"fernybush_[rand(1,3)]") - else - I = image('icons/obj/flora/ausflora.dmi',"stalkybush_[rand(1,3)]") - I.pixel_x = rand(-6,6) - I.pixel_y = rand(-6,6) - overlays += I - else - var/obj/structure/jungle_plant/J = new(src) - J.pixel_x = rand(-6,6) - J.pixel_y = rand(-6,6) - if(bushes_spawn && prob(90)) - new /obj/structure/bush(src) - -/turf/unsimulated/jungle/clear - bushes_spawn = 0 - plants_spawn = 0 - icon_state = "grass_clear" - icon_spawn_state = "grass3" - -/turf/unsimulated/jungle/path - bushes_spawn = 0 - name = "wet grass" - desc = "thick, long wet grass" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' - icon_state = "grass_path" - icon_spawn_state = "grass2" - - New() - ..() - for(var/obj/structure/bush/B in src) - del B - -/turf/unsimulated/jungle/proc/Spread(var/probability, var/prob_loss = 50) - if(probability <= 0) - return - - //world << "\blue Spread([probability])" - for(var/turf/unsimulated/jungle/J in orange(1, src)) - if(!J.bushes_spawn) - continue - - var/turf/unsimulated/jungle/P = null - if(J.type == src.type) - P = J - else - P = new src.type(J) - - if(P && prob(probability)) - P.Spread(probability - prob_loss) - -/turf/unsimulated/jungle/impenetrable - bushes_spawn = 0 - icon_state = "grass_impenetrable" - icon_spawn_state = "grass1" - New() - ..() - var/obj/structure/bush/B = new(src) - B.indestructable = 1 - -//copy paste from asteroid mineral turfs -/turf/unsimulated/jungle/rock - bushes_spawn = 0 - plants_spawn = 0 - density = 1 - name = "rock wall" - icon = 'icons/turf/walls.dmi' - icon_state = "rock" - icon_spawn_state = "rock" - -/turf/unsimulated/jungle/rock/New() - spawn(1) - var/turf/T - if(!istype(get_step(src, NORTH), /turf/unsimulated/jungle/rock) && !istype(get_step(src, NORTH), /turf/unsimulated/wall)) - T = get_step(src, NORTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_s") - if(!istype(get_step(src, SOUTH), /turf/unsimulated/jungle/rock) && !istype(get_step(src, SOUTH), /turf/unsimulated/wall)) - T = get_step(src, SOUTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=6) - if(!istype(get_step(src, EAST), /turf/unsimulated/jungle/rock) && !istype(get_step(src, EAST), /turf/unsimulated/wall)) - T = get_step(src, EAST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=6) - if(!istype(get_step(src, WEST), /turf/unsimulated/jungle/rock) && !istype(get_step(src, WEST), /turf/unsimulated/wall)) - T = get_step(src, WEST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6) - -/turf/unsimulated/jungle/water - bushes_spawn = 0 - name = "murky water" - desc = "thick, murky water" - icon = 'icons/misc/beach.dmi' - icon_state = "water" - icon_spawn_state = "water" - -/turf/unsimulated/jungle/water/New() - ..() - for(var/obj/structure/bush/B in src) - del(B) - -/turf/unsimulated/jungle/water/Entered(atom/movable/O) - ..() - if(istype(O, /mob/living/)) - var/mob/living/M = O - //slip in the murky water if we try to run through it - if(prob(10 + (M.m_intent == "run" ? 40 : 0))) - M << pick("\blue You slip on something slimy.","\blue You fall over into the murk.") - M.Stun(2) - M.Weaken(1) - - //piranhas - 25% chance to be an omnipresent risk, although they do practically no damage - if(prob(25)) - M << "\blue You feel something slithering around your legs." - if(prob(50)) - spawn(rand(25,50)) - var/turf/T = get_turf(M) - if(istype(T, /turf/unsimulated/jungle/water)) - M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE, sharp=1) - if(prob(50)) - spawn(rand(25,50)) - var/turf/T = get_turf(M) - if(istype(T, /turf/unsimulated/jungle/water)) - M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE, sharp=1) - if(prob(50)) - spawn(rand(25,50)) - var/turf/T = get_turf(M) - if(istype(T, /turf/unsimulated/jungle/water)) - M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE, sharp=1) - if(prob(50)) - spawn(rand(25,50)) - var/turf/T = get_turf(M) - if(istype(T, /turf/unsimulated/jungle/water)) - M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE, sharp=1) - -/turf/unsimulated/jungle/water/deep - plants_spawn = 0 - density = 1 - icon_state = "water2" - icon_spawn_state = "water2" - -/turf/unsimulated/jungle/temple_wall - name = "temple wall" - desc = "" - density = 1 - icon = 'icons/turf/walls.dmi' - icon_state = "phoron0" - var/mineral = "phoron" diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/misc_helpers.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/misc_helpers.dm deleted file mode 100644 index 7ae07059f7..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/misc_helpers.dm +++ /dev/null @@ -1,122 +0,0 @@ -//put this here because i needed specific functionality, and i wanted to avoid the hassle of getting it onto svn - - -/area/proc/copy_turfs_to(var/area/A , var/platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - if(platingRequired) - if(istype(B, /turf/space)) - continue moving - - var/turf/X = new T.type(B) - X.set_dir(old_dir1) - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/mob/M in T) - - if(!istype(M,/mob) || istype(M, /mob/aiEye)) continue // If we need to check for more mobs, I'll add a variable - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - - - for(var/V in T.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity"))) - X.vars[V] = T.vars[V] - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) -// X.opacity = !X.opacity -// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - - - /*var/list/doors = new/list() - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - for(var/obj/machinery/door/D2 in T1) - doors += D2 - if(T1.parent) - air_master.groups_to_rebuild += T1.parent - else - air_master.tiles_to_update += T1 - - for(var/obj/O in doors) - O:update_nearby_tiles(1)*/ - - - - - return copiedobjs diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/Laser2.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/Laser2.dm deleted file mode 100644 index 3782e76209..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Supermatter/Laser2.dm +++ /dev/null @@ -1,132 +0,0 @@ -//mostly replaced these with emitter code -//they're functionally identical - -/obj/machinery/computer/laser - name = "Zero-point laser" - desc = "A super-powerful laser" - var/visible = 1 - var/state = 1.0 - //var/obj/beam/e_beam/first - var/power = 500 - icon = 'icons/obj/engine.dmi' - icon_state = "laser" - anchored = 1 - var/id - var/on = 0 - var/freq = 50000 - var/phase = 0 - var/phase_variance = 0 - -/obj/machinery/computer/laser/process() - /*if(on) - if(!first) - src.first = new /obj/beam/e_beam(src.loc) - src.first.master = src - src.first.set_dir(src.dir) - src.first.power = src.power - src.first.freq = src.freq - src.first.phase = src.phase - src.first.phase_variance = src.phase_variance - step(first, dir) - if(first) - src.first.updatebeam() - else - src.first.updatebeam() - else - if(first) - del first*/ - -/obj/machinery/computer/laser/proc/setpower(var/powera) - /*src.power = powera - if(first) - first.setpower(src.power)*/ - -/* -/obj/beam/e_beam - name = "Laser beam" - icon = 'icons/obj/projectiles.dmi' - icon_state = "u_laser" - var/obj/machinery/engine/laser/master = null - var/obj/beam/e_beam/next = null - var/power - var/freq = 50000 - var/phase = 0 - var/phase_variance = 0 - anchored = 1 - -/obj/beam/e_beam/New() - sd_SetLuminosity(1, 1, 4) - -/obj/beam/e_beam/proc/updatebeam() - if(!next) - if(get_step(src.loc,src.dir)) - var/obj/beam/e_beam/e = new /obj/beam/e_beam(src.loc) - e.set_dir(src.dir) - src.next = e - e.master = src.master - e.power = src.power - e.phase = src.phase - src.phase+=src.phase_variance - e.freq = src.freq - e.phase_variance = src.phase_variance - if(src.loc.density == 0) - for(var/atom/o in src.loc.contents) - if(o.density || o == src.master || (ismob(o) && !istype(o, /mob/dead)) ) - o.laser_act(src) - del src - return - else - src.loc.laser_act(src) - del e - return - step(e,e.dir) - if(e) - e.updatebeam() - else - next.updatebeam() - -/atom/proc/laser_act(var/obj/beam/e_beam/b) - return - -/mob/living/carbon/laser_act(var/obj/beam/e_beam/b) - for(var/t in organs) - var/datum/organ/external/affecting = organs["[t]"] - if (affecting.take_damage(0, b.power/400,0,0)) - UpdateDamageIcon() - else - UpdateDamage() - -/obj/beam/e_beam/Bump(atom/Obstacle) - Obstacle.laser_act(src) - del(src) - return - - -/obj/beam/e_beam/proc/setpower(var/powera) - src.power = powera - if(src.next) - src.next.setpower(powera) - -/obj/beam/e_beam/Bumped() - src.hit() - return - -/obj/beam/e_beam/HasEntered(atom/movable/AM as mob|obj) - if (istype(AM, /obj/beam)) - return - spawn( 0 ) - AM.laser_act(src) - src.hit() - return - return - -/obj/beam/e_beam/Del() - if(next) - del(next) - ..() - return - -/obj/beam/e_beam/proc/hit() - del src - return - */ \ No newline at end of file diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm deleted file mode 100644 index d606337f4c..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm +++ /dev/null @@ -1,122 +0,0 @@ -//The laser control computer -//Used to control the lasers -/obj/machinery/computer/lasercon - name = "Laser control computer" - var/list/lasers = new/list - icon_state = "atmos" - var/id - //var/advanced = 0 - -/obj/machinery/computer/lasercon - New() - spawn(1) - for(var/obj/machinery/zero_point_emitter/las in world) - if(las.id == src.id) - lasers += las - - process() - ..() - updateDialog() - - interact(mob/user) - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=laser_control") - return - var/t = "Laser status monitor
" - for(var/obj/machinery/zero_point_emitter/laser in lasers) - t += "Zero Point Laser
" - t += "Power level: - - - - [laser.energy]MeV + + + +
" - t += "Frequency: - - [laser.freq] + +
" - t += "Output: [laser.active ? "Online Offline" : "Online Offline "]
" - t += "
" - t += "Close
" - user << browse(t, "window=laser_control;size=500x800") - user.machine = src - -/* -/obj/machinery/computer/lasercon/proc/interact(mob/user) - - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=powcomp") - return - - - user.machine = src - var/t = "Laser status monitor
" - - var/obj/machinery/engine/laser/laser = src.laser[1] - - if(!laser) - t += "\red No laser found" - else - - - t += "Power level: - - - - [add_lspace(laser.power,5)] + + + +
" - if(advanced) - t += "Frequency: - - [add_lspace(laser.freq,5)] + +
" - - t += "Output: [laser.on ? "Online Offline" : "Online Offline "]
" - - t += "

Close
" - - user << browse(t, "window=lascomp;size=420x700") - onclose(user, "lascomp") -*/ - -/obj/machinery/computer/lasercon/Topic(href, href_list) - ..() - if( href_list["close"] ) - usr << browse(null, "window=laser_control") - usr.machine = null - return - - else if( href_list["input"] ) - var/i = text2num(href_list["input"]) - var/d = i - for(var/obj/machinery/zero_point_emitter/laser in lasers) - var/new_power = laser.energy + d - new_power = max(new_power,0.0001) //lowest possible value - new_power = min(new_power,0.01) //highest possible value - laser.energy = new_power - // - src.updateDialog() - else if( href_list["online"] ) - var/obj/machinery/zero_point_emitter/laser = href_list["online"] - laser.active = !laser.active - src.updateDialog() - else if( href_list["freq"] ) - var/amt = text2num(href_list["freq"]) - for(var/obj/machinery/zero_point_emitter/laser in lasers) - var/new_freq = laser.frequency + amt - new_freq = max(new_freq,1) //lowest possible value - new_freq = min(new_freq,20000) //highest possible value - laser.frequency = new_freq - // - src.updateDialog() - -/* -/obj/machinery/computer/lasercon/process() - if(!(stat & (NOPOWER|BROKEN)) ) - use_power(250) - - //src.updateDialog() -*/ - -/* -/obj/machinery/computer/lasercon/power_change() - - if(stat & BROKEN) - icon_state = "broken" - else - if( powered() ) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - stat |= NOPOWER -*/ diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/Shard.dmi b/code/WorkInProgress/Cael_Aislinn/Supermatter/Shard.dmi deleted file mode 100644 index 3d312aa792..0000000000 Binary files a/code/WorkInProgress/Cael_Aislinn/Supermatter/Shard.dmi and /dev/null differ diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/ZeroPointLaser.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/ZeroPointLaser.dm deleted file mode 100644 index 66ccf181bd..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/Supermatter/ZeroPointLaser.dm +++ /dev/null @@ -1,236 +0,0 @@ -//new supermatter lasers - -/obj/machinery/zero_point_emitter - name = "Zero-point laser" - desc = "A super-powerful laser" - icon = 'icons/obj/engine.dmi' - icon_state = "laser" - anchored = 0 - density = 1 - req_access = list(access_research) - - use_power = 1 - idle_power_usage = 10 - active_power_usage = 300 - - var/active = 0 - var/fire_delay = 100 - var/last_shot = 0 - var/shot_number = 0 - var/state = 0 - var/locked = 0 - - var/energy = 0.0001 - var/frequency = 1 - - var/freq = 50000 - var/id - -/obj/machinery/zero_point_emitter/verb/rotate() - set name = "Rotate" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.set_dir(turn(src.dir, 90)) - return 1 - -/obj/machinery/zero_point_emitter/New() - ..() - return - -/obj/machinery/zero_point_emitter/update_icon() - if (active && !(stat & (NOPOWER|BROKEN))) - icon_state = "laser"//"emitter_+a" - else - icon_state = "laser"//"emitter" - -/obj/machinery/zero_point_emitter/attack_hand(mob/user as mob) - src.add_fingerprint(user) - if(state == 2) - if(!src.locked) - if(src.active==1) - src.active = 0 - user << "You turn off the [src]." - src.use_power = 1 - else - src.active = 1 - user << "You turn on the [src]." - src.shot_number = 0 - src.fire_delay = 100 - src.use_power = 2 - update_icon() - else - user << "\red The controls are locked!" - else - user << "\red The [src] needs to be firmly secured to the floor first." - return 1 - - -/obj/machinery/zero_point_emitter/emp_act(var/severity)//Emitters are hardened but still might have issues - use_power(1000) -/* if((severity == 1)&&prob(1)&&prob(1)) - if(src.active) - src.active = 0 - src.use_power = 1 */ - return 1 - -/obj/machinery/zero_point_emitter/process() - if(stat & (NOPOWER|BROKEN)) - return - if(src.state != 2) - src.active = 0 - return - if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) - src.last_shot = world.time - if(src.shot_number < 3) - src.fire_delay = 2 - src.shot_number ++ - else - src.fire_delay = rand(20,100) - src.shot_number = 0 - use_power(1000) - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) - playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) - if(prob(35)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - A.set_dir(src.dir) - switch(dir) - if(NORTH) - A.yo = 20 - A.xo = 0 - if(EAST) - A.yo = 0 - A.xo = 20 - if(WEST) - A.yo = 0 - A.xo = -20 - else // Any other - A.yo = -20 - A.xo = 0 - A.process() //TODO: Carn: check this out - - -/obj/machinery/zero_point_emitter/attackby(obj/item/W, mob/user) - - if(istype(W, /obj/item/weapon/wrench)) - if(active) - user << "Turn off the [src] first." - return - switch(state) - if(0) - state = 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear a ratchet") - src.anchored = 1 - if(1) - state = 0 - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear a ratchet") - src.anchored = 0 - if(2) - user << "\red The [src.name] needs to be unwelded from the floor." - return - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(active) - user << "Turn off the [src] first." - return - switch(state) - if(0) - user << "\red The [src.name] needs to be wrenched to the floor." - if(1) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ - "You start to weld the [src] to the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 2 - user << "You weld the [src] to the floor." - else - user << "\red You need more welding fuel to complete this task." - if(2) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ - "You start to cut the [src] free from the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 1 - user << "You cut the [src] free from the floor." - else - user << "\red You need more welding fuel to complete this task." - return - - if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) - if(emagged) - user << "\red The lock seems to be broken" - return - if(src.allowed(user)) - if(active) - src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" - else - src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is online" - else - user << "\red Access denied." - return - - - if(istype(W, /obj/item/weapon/card/emag) && !emagged) - locked = 0 - emagged = 1 - user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.") - return - - ..() - return - - -/obj/machinery/zero_point_emitter/power_change() - ..() - update_icon() - return - -/obj/machinery/zero_point_emitter/Topic(href, href_list) - ..() - if( href_list["input"] ) - var/i = text2num(href_list["input"]) - var/d = i - var/new_power = energy + d - new_power = max(new_power,0.0001) //lowest possible value - new_power = min(new_power,0.01) //highest possible value - energy = new_power - // - for(var/obj/machinery/computer/lasercon/comp in world) - if(comp.id == src.id) - comp.updateDialog() - else if( href_list["online"] ) - active = !active - // - for(var/obj/machinery/computer/lasercon/comp in world) - if(comp.id == src.id) - comp.updateDialog() - else if( href_list["freq"] ) - var/amt = text2num(href_list["freq"]) - var/new_freq = frequency + amt - new_freq = max(new_freq,1) //lowest possible value - new_freq = min(new_freq,20000) //highest possible value - frequency = new_freq - // - for(var/obj/machinery/computer/lasercon/comp in world) - if(comp.id == src.id) - comp.updateDialog() diff --git a/code/WorkInProgress/Cael_Aislinn/meteor_battery.dm b/code/WorkInProgress/Cael_Aislinn/meteor_battery.dm deleted file mode 100644 index 9ebc5fa5de..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/meteor_battery.dm +++ /dev/null @@ -1,261 +0,0 @@ -#define MISSILE_SPEED 5 - -//automated turret that shoots missiles at meteors - -/obj/item/projectile/missile - name = "missile" - icon = 'code/WorkInProgress/Cael_Aislinn/meteor_turret.dmi' - icon_state = "missile" - var/turf/target - var/tracking = 0 - density = 1 - desc = "It's sparking and shaking slightly." - -/obj/item/projectile/missile/process(var/turf/newtarget) - target = newtarget - set_dir(get_dir(src.loc, target)) - walk_towards(src, target, MISSILE_SPEED) - -/obj/item/projectile/missile/Bump(atom/A) - spawn(0) - if(istype(A,/obj/effect/meteor)) - del(A) - explode() - return - -/obj/item/projectile/missile/proc/explode() - explosion(src.loc, 1, 1, 2, 7, 0) - playsound(src.loc, "explosion", 50, 1) - del(src) - -/obj/item/projectile/missile/attack_hand(mob/user) - ..() - return attackby(null, user) - -/obj/item/projectile/missile/attackby(obj/item/weapon/W, mob/user) - //can't touch this - ..() - explode() - -/obj/machinery/meteor_battery - name = "meteor battery" - icon = 'code/WorkInProgress/Cael_Aislinn/meteor_turret.dmi' - icon_state = "turret0" - var/raised = 0 - var/enabled = 1 - anchored = 1 - layer = 3 - invisibility = 2 - density = 1 - var/health = 18 - var/id = "" - var/obj/machinery/turretcover/cover = null - var/popping = 0 - var/wasvalid = 0 - var/lastfired = 0 - var/shot_delay = 50 - var/datum/effect/effect/system/spark_spread/spark_system - use_power = 1 - idle_power_usage = 50 - active_power_usage = 300 - var/atom/movable/cur_target - var/targeting_active = 0 - var/protect_range = 30 - var/tracking_missiles = 0 - var/list/fired_missiles - -/obj/machinery/meteor_battery/New() - spark_system = new /datum/effect/effect/system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) - fired_missiles = new/list() -// targets = new - ..() - return - -/obj/machinery/meteor_battery/proc/isPopping() - return (popping!=0) - -/obj/machinery/meteor_battery/power_change() - if(stat & BROKEN) - icon_state = "broke" - else - if( powered() ) - if (src.enabled) - icon_state = "turret1" - else - icon_state = "turret0" - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "turret0" - stat |= NOPOWER - -/obj/machinery/meteor_battery/proc/setState(var/enabled) - src.enabled = enabled - src.power_change() - -/obj/machinery/meteor_battery/proc/get_new_target() - var/list/new_targets = new - var/new_target - for(var/obj/effect/meteor/M in view(protect_range, get_turf(src))) - new_targets += M - if(new_targets.len) - new_target = pick(new_targets) - return new_target - -/obj/machinery/meteor_battery/process() - if(stat & (NOPOWER|BROKEN)) - return - if(src.cover==null) - src.cover = new /obj/machinery/turretcover(src.loc) - src.cover.host = src - if(!enabled) - if(!isDown() && !isPopping()) - popDown() - return - - //update our missiles - for(var/obj/item/projectile/missile/M in fired_missiles) - if(!M) - fired_missiles.Remove(M) - continue - if(tracking_missiles && cur_target) - //update homing missile target - M.target = get_turf(cur_target) - walk_towards(M, M.target, MISSILE_SPEED) - - if(get_turf(M) == M.target && M) - //missile has arrived at destination - fired_missiles.Remove(M) - if( istype(get_turf(M), /turf/space) ) - //send the missile shooting off into the distance - walk(M, get_dir(src,M), MISSILE_SPEED) - spawn(rand(3,10) * 10) - if(M) - M.explode() - else if(rand(3) == 3) - //chance to blow up later (between 4 seconds and 2 minutes), or just sit there being ominous - spawn(rand(4,120) * 10) - M.explode() - for(var/mob/P in view(7)) - P.visible_message("\red The missile skids to a halt, vibrating and sparking ominously!") - - if(!cur_target) - cur_target = get_new_target() //get new target - - if(cur_target) //if it's found, proceed - if(!isPopping()) - if(isDown()) - popUp() - use_power = 2 - else - spawn() - if(!targeting_active) - targeting_active = 1 - target() - targeting_active = 0 - else if(!isPopping())//else, pop down - if(!isDown()) - popDown() - use_power = 1 - - return - -/obj/machinery/meteor_battery/proc/target() - while(src && enabled && !stat) - src.set_dir(get_dir(src, cur_target)) - shootAt(cur_target) - sleep(shot_delay) - return - -/obj/machinery/meteor_battery/proc/shootAt(var/atom/movable/target) - var/turf/T = get_turf(src) - var/turf/U = get_turf(target) - if (!T || !U) - return - use_power(500) - var/obj/item/projectile/missile/A = new(T) - A.tracking = tracking_missiles - fired_missiles.Add(A) - spawn(0) - A.process(U) - return - - -/obj/machinery/meteor_battery/proc/isDown() - return (invisibility!=0) - -/obj/machinery/meteor_battery/proc/popUp() - if ((!isPopping()) || src.popping==-1) - invisibility = 0 - popping = 1 - if (src.cover!=null) - flick("popup", src.cover) - src.cover.icon_state = "openTurretCover" - spawn(10) - if (popping==1) popping = 0 - -/obj/machinery/meteor_battery/proc/popDown() - if ((!isPopping()) || src.popping==1) - popping = -1 - if (src.cover!=null) - flick("popdown", src.cover) - src.cover.icon_state = "turretCover" - spawn(10) - if (popping==-1) - invisibility = 2 - popping = 0 - -/obj/machinery/meteor_battery/bullet_act(var/obj/item/projectile/Proj) - src.health -= Proj.damage - ..() - if(prob(45) && Proj.damage > 0) src.spark_system.start() - if (src.health <= 0) - src.die() - return - -/obj/machinery/meteor_battery/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N - ..() - playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1) - src.spark_system.start() - src.health -= W.force * 0.5 - if (src.health <= 0) - src.die() - return - -/obj/machinery/meteor_battery/emp_act(severity) - switch(severity) - if(1) - enabled = 0 - power_change() - ..() - -/obj/machinery/meteor_battery/ex_act(severity) - if(severity < 3) - src.die() - -/obj/machinery/meteor_battery/proc/die() - src.health = 0 - src.density = 0 - src.stat |= BROKEN - src.icon_state = "broke" - if (cover!=null) - del(cover) - sleep(3) - flick("explosion", src) - spawn(13) - del(src) - -/obj/machinery/meteor_battery/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if(!(stat & BROKEN)) - playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has slashed at []!", M, src), 1) - src.health -= 15 - if (src.health <= 0) - src.die() - else - M << "\green That object is useless to you." - return diff --git a/code/WorkInProgress/Cael_Aislinn/sculpture.dm b/code/WorkInProgress/Cael_Aislinn/sculpture.dm deleted file mode 100644 index 808e968f55..0000000000 --- a/code/WorkInProgress/Cael_Aislinn/sculpture.dm +++ /dev/null @@ -1,262 +0,0 @@ - -//sculpture -//SCP-173, nothing more need be said -/mob/living/simple_animal/sculpture - name = "\improper sculpture" - real_name = "sculpture" - desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid. " - icon = 'code/WorkInProgress/Cael_Aislinn/unknown.dmi' - icon_state = "sculpture" - icon_living = "sculpture" - icon_dead = "sculpture" - emote_hear = list("makes a faint scraping sound") - emote_see = list("twitches slightly", "shivers") - response_help = "touches the" - response_disarm = "pushes the" - response_harm = "hits the" - var/obj/item/weapon/grab/G - var/observed = 0 - var/allow_escape = 0 //set this to 1 for src to drop it's target next Life() call and try to escape - var/hibernate = 0 - var/random_escape_chance = 0.5 - -/mob/living/simple_animal/sculpture/proc/GrabMob(var/mob/living/target) - if(target && target != src && ishuman(target)) - G = new /obj/item/weapon/grab(target) - G.assailant = src - G.layer = 20 - G.affecting = target - G.synch() - target.LAssailant = src - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("\red [src] has grabbed [target]!") - target << "\red You feel something suddenly grab you around the neck from behind! Everything goes black..." - - G.state = 3 - G.killing = 1 - - desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid. [G ? "\red The sculpture is holding [G.affecting] in a vice-like grip." : ""]" - target.attack_log += text("\[[time_stamp()]\] Has been grabbed by SCP-173, and is being strangled!") - log_admin("[target] ([target.ckey]) has been grabbed and is being strangled by SCP-173.") - message_admins("Alert: [target.real_name] has been grabbed and is being strangled by SCP-173. Set var/allow_escape = 1 to allow this player to escape temporarily, or var/hibernate = 1 to disable it entirely.") - -/mob/living/simple_animal/sculpture/proc/Escape() - var/list/turfs = new/list() - for(var/turf/thisturf in view(50,src)) - if(istype(thisturf, /turf/space)) - continue - else if(istype(thisturf, /turf/simulated/wall)) - continue - else if(istype(thisturf, /turf/simulated/mineral)) - continue - else if(istype(thisturf, /turf/simulated/shuttle/wall)) - continue - else if(istype(thisturf, /turf/unsimulated/wall)) - continue - turfs += thisturf - var/turf/target_turf = pick(turfs) - src.set_dir(get_dir(src, target_turf)) - src.loc = target_turf - - hibernate = 1 - spawn(rand(20,35) * 10) - hibernate = 0 - -/mob/living/simple_animal/sculpture/Life() - - observed = 0 - - //update the desc - if(!G) - desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid." - - //if we are sent into forced hibernation mode, allow our victim to escape - if(hibernate && G && G.killing == 1) - if(G) - G.affecting << "\red You suddenly feel the grip around your neck being loosened!" - visible_message("\red [src] suddenly loosens it's grip!") - G.killing = 0 - G.state = 1 - return - - // - if(allow_escape) - allow_escape = 0 - if(G) - G.affecting << "\red You suddenly feel the grip around your neck being loosened!" - visible_message("\red [src] suddenly loosens it's grip!") - G.killing = 0 - G.state = 1 - if(!observed) - Escape() - observed = 1 - - //can't do anything in space at all - if(istype(get_turf(src), /turf/space) || hibernate) - return - - for(var/mob/living/M in view(7, src)) - if(M.stat || M == src) - continue - var/xdif = M.x - src.x - var/ydif = M.y - src.y - if(abs(xdif) < abs(ydif)) - //mob is either above or below src - if(ydif < 0 && M.dir == NORTH) - //mob is below src and looking up - observed = 1 - break - else if(ydif > 0 && M.dir == SOUTH) - //mob is above src and looking down - observed = 1 - break - else if(abs(xdif) > abs(ydif)) - //mob is either left or right of src - if(xdif < 0 && M.dir == EAST) - //mob is to the left of src and looking right - observed = 1 - break - else if(xdif > 0 && M.dir == WEST) - //mob is to the right of src and looking left - observed = 1 - break - else if (xdif == 0 && ydif == 0) - //mob is on the same tile as src - observed = 1 - break - - //account for darkness - var/turf/T = get_turf(src) - var/in_darkness = 0 - if(T.luminosity == 0 && !istype(T, /turf/simulated)) - in_darkness = 1 - - //see if we're able to do stuff - if(!observed || in_darkness) - if(G) - if(prob(random_escape_chance)) - //chance to allow the stranglee to escape - allow_escape = 1 - if(G.affecting.stat == 2) - del G - else if(!G) - //see if we're able to strangle anyone - var/turf/myTurf = get_turf(src) - for(var/mob/living/M in myTurf) - GrabMob(M) - if(G) - break - - //find out what mobs we can see - var/list/incapacitated = list() - var/list/conscious = list() - for(var/mob/living/carbon/M in view(7, src)) - //this may not be quite the right test - if(M == src) - continue - if(M.stat == 1) - incapacitated.Add(M) - else if(!M.stat) - conscious.Add(M) - - //pick the nearest valid conscious target - var/mob/living/carbon/target_mob - for(var/mob/living/carbon/M in conscious) - if(!target_mob || get_dist(src, M) < get_dist(src, target_mob)) - target_mob = M - - if(!target_mob) - //get an unconscious mob - for(var/mob/living/carbon/M in incapacitated) - if(!target_mob || get_dist(src, M) < get_dist(src, target_mob)) - target_mob = M - if(target_mob) - var/turf/target_turf - if(in_darkness) - //move to right behind them - target_turf = get_step(target_mob, src) - else - //move to them really really fast and knock them down - target_turf = get_turf(target_mob) - - //rampage along a path to get to them, in the blink of an eye - var/turf/next_turf = get_step_towards(src, target_mob) - var/num_turfs = get_dist(src,target_mob) - while(get_turf(src) != target_turf && num_turfs > 0) - for(var/obj/structure/window/W in next_turf) - W.ex_act(2) - for(var/obj/structure/table/O in next_turf) - O.ex_act(1) - for(var/obj/structure/grille/G in next_turf) - G.ex_act(1) - if(!next_turf.CanPass(src, next_turf)) - break - src.loc = next_turf - src.set_dir(get_dir(src, target_mob)) - next_turf = get_step(src, get_dir(next_turf,target_mob)) - num_turfs-- - - //if we reached them, knock them down and start strangling them - if(get_turf(src) == target_turf) - target_mob.Stun(1) - target_mob.Paralyse(1) - GrabMob(target_mob) - - //if we're not strangling anyone, take a stroll - if(!G && prob(10)) - var/list/turfs = new/list() - for(var/turf/thisturf in view(7,src)) - if(istype(thisturf, /turf/space)) - continue - else if(istype(thisturf, /turf/simulated/wall)) - continue - else if(istype(thisturf, /turf/simulated/mineral)) - continue - else if(istype(thisturf, /turf/simulated/shuttle/wall)) - continue - else if(istype(thisturf, /turf/unsimulated/wall)) - continue - turfs += thisturf - var/turf/target_turf = pick(turfs) - - //rampage along a path to get to it, in the blink of an eye - var/turf/next_turf = get_step_towards(src, target_turf) - var/num_turfs = get_dist(src,target_turf) - while(get_turf(src) != target_turf && num_turfs > 0) - for(var/obj/structure/window/W in next_turf) - W.ex_act(2) - for(var/obj/structure/table/O in next_turf) - O.ex_act(1) - for(var/obj/structure/grille/G in next_turf) - G.ex_act(1) - if(!next_turf.CanPass(src, next_turf)) - break - src.loc = next_turf - src.set_dir(get_dir(src, target_mob)) - next_turf = get_step(src, get_dir(next_turf,target_turf)) - num_turfs-- - else if(G) - //we can't move while observed, so we can't effectively strangle any more - //our grip is still rock solid, but the victim has a chance to escape - G.affecting << "\red You suddenly feel the grip around your neck being loosened!" - visible_message("\red [src] suddenly loosens it's grip!") - G.state = 1 - G.killing = 0 - -/mob/living/simple_animal/sculpture/attackby(var/obj/item/O as obj, var/mob/user as mob) - ..() - -/mob/living/simple_animal/sculpture/Topic(href, href_list) - ..() - -/mob/living/simple_animal/sculpture/Bump(atom/movable/AM as mob, yes) - if(!G) - GrabMob(AM) - -/mob/living/simple_animal/sculpture/Bumped(atom/movable/AM as mob, yes) - if(!G) - GrabMob(AM) - -/mob/living/simple_animal/sculpture/ex_act(var/severity) - //nothing \ No newline at end of file diff --git a/code/WorkInProgress/Cael_Aislinn/unknown.dmi b/code/WorkInProgress/Cael_Aislinn/unknown.dmi deleted file mode 100644 index e254c10197..0000000000 Binary files a/code/WorkInProgress/Cael_Aislinn/unknown.dmi and /dev/null differ diff --git a/code/WorkInProgress/Cib/amorph/amorph.dm b/code/WorkInProgress/Cib/amorph/amorph.dm deleted file mode 100644 index dd1a678f47..0000000000 --- a/code/WorkInProgress/Cib/amorph/amorph.dm +++ /dev/null @@ -1,590 +0,0 @@ -/mob/living/carbon/amorph - name = "amorph" - real_name = "amorph" - voice_name = "amorph" - icon = 'icons/mob/amorph.dmi' - icon_state = "" - - - var/species = "Amorph" - age = 30.0 - - var/used_skillpoints = 0 - var/skill_specialization = null - var/list/skills = null - - var/obj/item/l_ear = null - - // might use this later to recolor armorphs with icon.SwapColor - var/slime_color = null - - var/examine_text = "" - - -/mob/living/carbon/amorph/New() - - ..() - - // Amorphs don't have a blood vessel, but they can have reagents in their body - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src - - // Amorphs have no DNA(they're more like carbon-based machines) - - // Amorphs don't have organs - ..() - -/mob/living/carbon/amorph/Bump(atom/movable/AM as mob|obj, yes) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if (ismob(AM)) - var/mob/tmob = AM - -//BubbleWrap - Should stop you pushing a restrained person out of the way - - if(istype(tmob, /mob/living/carbon/human)) - - for(var/mob/M in range(tmob, 1)) - if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restrained, you cannot push past" - now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restraining [M], you cannot push past" - now_pushing = 0 - return - - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around! - var/turf/oldloc = loc - loc = tmob.loc - tmob.loc = oldloc - now_pushing = 0 - for(var/mob/living/carbon/metroid/Metroid in view(1,tmob)) - if(Metroid.Victim == tmob) - Metroid.UpdateFeed() - return - - if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(tmob.nopush) - now_pushing = 0 - return - - tmob.LAssailant = src - - now_pushing = 0 - spawn(0) - ..() - if (!istype(AM, /atom/movable)) - return - if (!now_pushing) - now_pushing = 1 - - if (!AM.anchored) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = 0 - return - return - -/mob/living/carbon/amorph/movement_delay() - var/tally = 2 // amorphs are a bit slower than humans - var/mob/M = pulling - - if(reagents.has_reagent("hyperzine")) return -1 - - if(reagents.has_reagent("nuka_cola")) return -1 - - if(analgesic) return -1 - - if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything - - var/health_deficiency = traumatic_shock - if(health_deficiency >= 40) tally += (health_deficiency / 25) - - var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80 - if (hungry >= 70) tally += hungry/300 - - if (bodytemperature < 283.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 - if (stuttering < 10) - stuttering = 10 - - if(shock_stage >= 10) tally += 3 - - if(tally < 0) - tally = 0 - - if(istype(M) && M.lying) //Pulling lying down people is slower - tally += 3 - - if(mRun in mutations) - tally = 0 - - return tally - -/mob/living/carbon/amorph/Stat() - ..() - statpanel("Status") - - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") - if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") - if(ticker.mode:malf_mode_declared) - stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(emergency_shuttle) - if(emergency_shuttle.online && emergency_shuttle.location < 2) - var/timeleft = emergency_shuttle.timeleft() - if (timeleft) - stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") - - if (client.statpanel == "Status") - if (internal) - if (!internal.air_contents) - del(internal) - else - stat("Internal Atmosphere Info", internal.name) - stat("Tank Pressure", internal.air_contents.return_pressure()) - stat("Distribution Pressure", internal.distribute_pressure) - if (mind) - if (mind.special_role == "Changeling" && changeling) - stat("Chemical Storage", changeling.chem_charges) - stat("Genetic Damage Time", changeling.geneticdamage) - -/mob/living/carbon/amorph/ex_act(severity) - flick("flash", flash) - - var/shielded = 0 - var/b_loss = null - var/f_loss = null - switch (severity) - if (1.0) - b_loss += 500 - if (!prob(getarmor(null, "bomb"))) - gib() - return - else - var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) - throw_at(target, 200, 4) - - if (2.0) - if (!shielded) - b_loss += 60 - - f_loss += 60 - - if (!prob(getarmor(null, "bomb"))) - b_loss = b_loss/1.5 - f_loss = f_loss/1.5 - - if(3.0) - b_loss += 30 - if (!prob(getarmor(null, "bomb"))) - b_loss = b_loss/2 - if (prob(50) && !shielded) - Paralyse(10) - - src.bruteloss += b_loss - src.fireloss += f_loss - - UpdateDamageIcon() - - -/mob/living/carbon/amorph/blob_act() - if(stat == 2) return - show_message("\red The blob attacks you!") - src.bruteloss += rand(30,40) - UpdateDamageIcon() - return - -/mob/living/carbon/amorph/u_equip(obj/item/W as obj) - // These are the only slots an amorph has - if (W == l_ear) - l_ear = null - else if (W == r_hand) - r_hand = null - - update_clothing() - -/mob/living/carbon/amorph/db_click(text, t1) - var/obj/item/W = equipped() - var/emptyHand = (W == null) - if ((!emptyHand) && (!istype(W, /obj/item))) - return - if (emptyHand) - usr.next_move = usr.prev_move - usr:lastDblClick -= 3 //permit the double-click redirection to proceed. - switch(text) - if("l_ear") - if (l_ear) - if (emptyHand) - l_ear.DblClick() - return - else if(emptyHand) - return - if (!( istype(W, /obj/item/clothing/ears) ) && !( istype(W, /obj/item/device/radio/headset) ) && W.w_class != 1) - return - u_equip(W) - l_ear = W - W.equipped(src, text) - - update_clothing() - - return - -/mob/living/carbon/amorph/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) - if (istype(O, /obj/effect/immovablerod)) - src.bruteloss += 101 - else - src.bruteloss += 25 - UpdateDamageIcon() - updatehealth() - return - -/mob/living/carbon/amorph/Move(a, b, flag) - - if (buckled) - return - - if (restrained()) - pulling = null - - - var/t7 = 1 - if (restrained()) - for(var/mob/M in range(src, 1)) - if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) - t7 = null - if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) - var/turf/T = loc - . = ..() - - if (pulling && pulling.loc) - if(!( isturf(pulling.loc) )) - pulling = null - return - else - if(Debug) - diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]" - diary <<"REPORT THIS" - - ///// - if(pulling && pulling.anchored) - pulling = null - return - - if (!restrained()) - var/diag = get_dir(src, pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, pulling) > 1 || diag)) - if (ismob(pulling)) - var/mob/M = pulling - var/ok = 1 - if (locate(/obj/item/weapon/grab, M.grabbed_by)) - if (prob(75)) - var/obj/item/weapon/grab/G = pick(M.grabbed_by) - if (istype(G, /obj/item/weapon/grab)) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) - //G = null - del(G) - else - ok = 0 - if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) - ok = 0 - if (ok) - var/t = M.pulling - M.pulling = null - - //this is the gay blood on floor shit -- Added back -- Skie - if (M.lying && (prob(M.getBruteLoss() / 6))) - var/turf/location = M.loc - if (istype(location, /turf/simulated)) - location.add_blood(M) - if(ishuman(M)) - var/mob/living/carbon/H = M - var/blood_volume = round(H:vessel.get_reagent_amount("blood")) - if(blood_volume > 0) - H:vessel.remove_reagent("blood",1) - if(prob(5)) - M.adjustBruteLoss(1) - visible_message("\red \The [M]'s wounds open more from being dragged!") - if(M.pull_damage()) - if(prob(25)) - M.adjustBruteLoss(2) - visible_message("\red \The [M]'s wounds worsen terribly from being dragged!") - var/turf/location = M.loc - if (istype(location, /turf/simulated)) - location.add_blood(M) - if(ishuman(M)) - var/mob/living/carbon/H = M - var/blood_volume = round(H:vessel.get_reagent_amount("blood")) - if(blood_volume > 0) - H:vessel.remove_reagent("blood",1) - - step(pulling, get_dir(pulling.loc, T)) - M.pulling = t - else - if (pulling) - if (istype(pulling, /obj/structure/window)) - if(pulling:ini_dir == NORTHWEST || pulling:ini_dir == NORTHEAST || pulling:ini_dir == SOUTHWEST || pulling:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) - pulling = null - if (pulling) - step(pulling, get_dir(pulling.loc, T)) - else - pulling = null - . = ..() - if ((s_active && !( s_active in contents ) )) - s_active.close(src) - - for(var/mob/living/carbon/metroid/M in view(1,src)) - M.UpdateFeed(src) - return - -/mob/living/carbon/amorph/proc/misc_clothing_updates() - // Temporary proc to shove stuff in that was put into update_clothing() - // for questionable reasons - - if (client) - if (i_select) - if (intent) - client.screen += hud_used.intents - - var/list/L = dd_text2list(intent, ",") - L[1] += ":-11" - i_select.screen_loc = dd_list2text(L,",") //ICONS4 - else - i_select.screen_loc = null - if (m_select) - if (m_int) - client.screen += hud_used.mov_int - - var/list/L = dd_text2list(m_int, ",") - L[1] += ":-11" - m_select.screen_loc = dd_list2text(L,",") //ICONS4 - else - m_select.screen_loc = null - - // Probably a lazy way to make sure all items are on the screen exactly once - if (client) - client.screen -= contents - client.screen += contents - -/mob/living/carbon/amorph/rebuild_appearance() - // Lazy method: Just rebuild everything. - // This can be called when the mob is created, but on other occasions, rebuild_body_overlays(), - // rebuild_clothing_overlays() etc. should be called individually. - - misc_clothing_updates() // silly stuff - -/mob/living/carbon/amorph/update_body_appearance() - // Should be called whenever something about the body appearance itself changes. - - misc_clothing_updates() // silly stuff - - if(lying) - icon_state = "lying" - else - icon_state = "standing" - -/mob/living/carbon/amorph/update_lying() - // Should be called whenever something about the lying status of the mob might have changed. - - if(lying) - icon_state = "lying" - else - icon_state = "standing" - -/mob/living/carbon/amorph/hand_p(mob/M as mob) - // not even sure what this is meant to do - return - -/mob/living/carbon/amorph/restrained() - if (handcuffed) - return 0 // handcuffs don't work on amorphs - return 0 - -/mob/living/carbon/amorph/var/co2overloadtime = null -/mob/living/carbon/amorph/var/temperature_resistance = T0C+75 - -/mob/living/carbon/amorph/show_inv(mob/user as mob) - // TODO: add a window for extracting stuff from an amorph's mouth - -// called when something steps onto an amorph -// this could be made more general, but for now just handle mulebot -/mob/living/carbon/amorph/HasEntered(var/atom/movable/AM) - var/obj/machinery/bot/mulebot/MB = AM - if(istype(MB)) - MB.RunOver(src) - -//gets assignment from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/amorph/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") - // TODO: get the ID from the amorph's contents - return - -//gets name from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/amorph/proc/get_authentification_name(var/if_no_id = "Unknown") - // TODO: get the ID from the amorph's contents - return - -//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere -/mob/living/carbon/amorph/proc/get_visible_name() - // amorphs can't wear clothes or anything, so always return face_name - return get_face_name() - -//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable -/mob/living/carbon/amorph/proc/get_face_name() - // there might later be ways for amorphs to change the appearance of their face - return "[real_name]" - - -//gets ID card object from special clothes slot or null. -/mob/living/carbon/amorph/proc/get_idcard() - // TODO: get the ID from the amorph's contents - - -// heal the amorph -/mob/living/carbon/amorph/heal_overall_damage(var/brute, var/burn) - bruteloss -= brute - fireloss -= burn - bruteloss = max(bruteloss, 0) - fireloss = max(fireloss, 0) - - updatehealth() - UpdateDamageIcon() - -// damage MANY external organs, in random order -/mob/living/carbon/amorph/take_overall_damage(var/brute, var/burn, var/used_weapon = null) - bruteloss += brute - fireloss += burn - - updatehealth() - UpdateDamageIcon() - -/mob/living/carbon/amorph/Topic(href, href_list) - if (href_list["refresh"]) - if((machine)&&(in_range(src, usr))) - show_inv(machine) - - if (href_list["mach_close"]) - var/t1 = text("window=[]", href_list["mach_close"]) - machine = null - src << browse(null, t1) - - if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e - var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) - O.source = usr - O.target = src - O.item = usr.equipped() - O.s_loc = usr.loc - O.t_loc = loc - O.place = href_list["item"] - if(href_list["loc"]) - O.internalloc = href_list["loc"] - requests += O - spawn( 0 ) - O.process() - return - - if (href_list["criminal"]) - if(istype(usr, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = usr - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)) - var/perpname = "wot" - var/modified = 0 - - /*if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner - else*/ - perpname = src.name - - for (var/datum/data/record/E in data_core.general) - if (E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if (R.fields["id"] == E.fields["id"]) - - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") - - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)) - if(setcriminal != "Cancel") - R.fields["criminal"] = setcriminal - modified = 1 - - spawn() - H.handle_regular_hud_updates() - - if(!modified) - usr << "\red Unable to locate a data core entry for this person." - ..() - return - - -///eyecheck() -///Returns a number between -1 to 2 -/mob/living/carbon/amorph/eyecheck() - return 1 - - -/mob/living/carbon/amorph/IsAdvancedToolUser() - return 1//Amorphs can use guns and such - - -/mob/living/carbon/amorph/updatehealth() - if(src.nodamage) - src.health = 100 - src.stat = 0 - return - src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.getCloneLoss() -src.halloss - return - -/mob/living/carbon/amorph/abiotic(var/full_body = 0) - return 0 - -/mob/living/carbon/amorph/abiotic2(var/full_body2 = 0) - return 0 - -/mob/living/carbon/amorph/getBruteLoss() - return src.bruteloss - -/mob/living/carbon/amorph/adjustBruteLoss(var/amount, var/used_weapon = null) - src.bruteloss += amount - if(bruteloss < 0) bruteloss = 0 - -/mob/living/carbon/amorph/getFireLoss() - return src.fireloss - -/mob/living/carbon/amorph/adjustFireLoss(var/amount,var/used_weapon = null) - src.fireloss += amount - if(fireloss < 0) fireloss = 0 - -/mob/living/carbon/amorph/get_visible_gender() - return gender diff --git a/code/WorkInProgress/Cib/amorph/amorph_attack.dm b/code/WorkInProgress/Cib/amorph/amorph_attack.dm deleted file mode 100644 index 814b977d1a..0000000000 --- a/code/WorkInProgress/Cib/amorph/amorph_attack.dm +++ /dev/null @@ -1,246 +0,0 @@ - - -/mob/living/carbon/amorph/attack_paw(mob/living/carbon/monkey/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - if (health > 0) - attacked += 10 - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [M.name] has bit [src]!"), 1) - adjustBruteLoss(rand(0, 1)) - updatehealth() - return - -/mob/living/carbon/amorph/attack_hand(mob/living/carbon/human/M as mob) - - if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = M.gloves - if(G.cell) - if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien. - if(G.cell.charge >= 2500) - G.cell.charge -= 2500 - Weaken(5) - if (stuttering < 5) - stuttering = 5 - Stun(5) - - for(var/mob/O in viewers(src, null)) - if (O.client) - O.show_message("\red [src] has been touched with the stun gloves by [M]!", 1, "\red You hear someone fall", 2) - return - else - M << "\red Not enough charge! " - return - - if (M.a_intent == "help") - help_shake_act(M) - else - if (M.a_intent == "hurt") - var/attack_verb - switch(M.mutantrace) - if("lizard") - attack_verb = "scratch" - if("plant") - attack_verb = "slash" - else - attack_verb = "punch" - - if(M.type == /mob/living/carbon/human/tajaran) - attack_verb = "slash" - - if ((prob(75) && health > 0)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has [attack_verb]ed [name]!", M), 1) - - var/damage = rand(5, 10) - if(M.type != /mob/living/carbon/human/tajaran) - playsound(loc, "punch", 25, 1, -1) - else if(M.type == /mob/living/carbon/human/tajaran) - damage += 10 - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - adjustBruteLoss(damage/10) - updatehealth() - else - if(M.type != /mob/living/carbon/human/tajaran) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - else if(M.type == /mob/living/carbon/human/tajaran) - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has attempted to [attack_verb] [name]!", M), 1) - else - if (M.a_intent == "grab") - if (M == src) - return - - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M ) - G.assailant = M - if (M.hand) - M.l_hand = G - else - M.r_hand = G - G.layer = 20 - G.affecting = src - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [name] passively!", M), 1) - - else - if (!( paralysis )) - drop_item() - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has disarmed [name]!", M), 1) - return - - - -/mob/living/carbon/amorph/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - - switch(M.a_intent) - if ("help") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1) - - if ("hurt") - if ((prob(95) && health > 0)) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has slashed [name]!", M), 1) - adjustBruteLoss(damage/10) - updatehealth() - react_to_attack(M) - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has attempted to lunge at [name]!", M), 1) - - if ("grab") - if (M == src) - return - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M ) - G.assailant = M - if (M.hand) - M.l_hand = G - else - M.r_hand = G - G.layer = 20 - G.affecting = src - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [name] passively!", M), 1) - - if ("disarm") - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - if(prob(95)) - Weaken(rand(10,15)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has tackled down [name]!", M), 1) - else - drop_item() - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has disarmed [name]!", M), 1) - adjustBruteLoss(damage) - react_to_attack(M) - updatehealth() - return - - - -/mob/living/carbon/amorph/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.emote("[M.friendly] [src]") - else - for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - bruteloss += damage - -/mob/living/carbon/amorph/attack_metroid(mob/living/carbon/metroid/M as mob) - if(M.Victim) return // can't attack while eating! - - if (health > -100) - - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] has [pick("bit","slashed")] []!", src), 1) - - var/damage = rand(1, 3) - - if(istype(M, /mob/living/carbon/metroid/adult)) - damage = rand(10, 35) - else - damage = rand(5, 25) - - src.cloneloss += damage - - UpdateDamageIcon() - - - if(M.powerlevel > 0) - var/stunprob = 10 - var/power = M.powerlevel + rand(0,3) - - switch(M.powerlevel) - if(1 to 2) stunprob = 20 - if(3 to 4) stunprob = 30 - if(5 to 6) stunprob = 40 - if(7 to 8) stunprob = 60 - if(9) stunprob = 70 - if(10) stunprob = 95 - - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] has shocked []!", src), 1) - - Weaken(power) - if (stuttering < power) - stuttering = power - Stun(power) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - - - updatehealth() - - return diff --git a/code/WorkInProgress/Cib/amorph/amorph_damage.dm b/code/WorkInProgress/Cib/amorph/amorph_damage.dm deleted file mode 100644 index d49d679069..0000000000 --- a/code/WorkInProgress/Cib/amorph/amorph_damage.dm +++ /dev/null @@ -1,12 +0,0 @@ -/mob/living/carbon/amorph/proc/HealDamage(zone, brute, burn) - return heal_overall_damage(brute, burn) - -/mob/living/carbon/amorph/UpdateDamageIcon() - // no damage sprites for amorphs yet - return - -/mob/living/carbon/amorph/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null) - if(damagetype == BRUTE) - take_overall_damage(damage, 0) - else - take_overall_damage(0, damage) \ No newline at end of file diff --git a/code/WorkInProgress/Cib/amorph/amorph_hud.dm b/code/WorkInProgress/Cib/amorph/amorph_hud.dm deleted file mode 100644 index 41a3adc9f5..0000000000 --- a/code/WorkInProgress/Cib/amorph/amorph_hud.dm +++ /dev/null @@ -1,318 +0,0 @@ -/obj/hud/proc/amorph_hud(var/ui_style='icons/mob/screen1_old.dmi') - - src.adding = list( ) - src.other = list( ) - src.intents = list( ) - src.mon_blo = list( ) - src.m_ints = list( ) - src.mov_int = list( ) - src.vimpaired = list( ) - src.darkMask = list( ) - src.intent_small_hud_objects = list( ) - - src.g_dither = new /obj/screen( src ) - src.g_dither.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.g_dither.name = "Mask" - src.g_dither.icon = ui_style - src.g_dither.icon_state = "dither12g" - src.g_dither.layer = 18 - src.g_dither.mouse_opacity = 0 - - src.alien_view = new /obj/screen(src) - src.alien_view.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.alien_view.name = "Alien" - src.alien_view.icon = ui_style - src.alien_view.icon_state = "alien" - src.alien_view.layer = 18 - src.alien_view.mouse_opacity = 0 - - src.blurry = new /obj/screen( src ) - src.blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.blurry.name = "Blurry" - src.blurry.icon = ui_style - src.blurry.icon_state = "blurry" - src.blurry.layer = 17 - src.blurry.mouse_opacity = 0 - - src.druggy = new /obj/screen( src ) - src.druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.druggy.name = "Druggy" - src.druggy.icon = ui_style - src.druggy.icon_state = "druggy" - src.druggy.layer = 17 - src.druggy.mouse_opacity = 0 - - var/obj/screen/using - - using = new /obj/screen( src ) - using.name = "act_intent" - using.set_dir(SOUTHWEST) - using.icon = ui_style - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen( src ) - using.name = "mov_intent" - using.set_dir(SOUTHWEST) - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen( src ) - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_dropbutton - using.layer = 19 - src.adding += using - - using = new /obj/screen( src ) - using.name = "r_hand" - using.set_dir(WEST) - using.icon = ui_style - using.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - using.icon_state = "hand_active" - using.screen_loc = ui_rhand - using.layer = 19 - src.r_hand_hud_object = using - src.adding += using - - using = new /obj/screen( src ) - using.name = "l_hand" - using.set_dir(EAST) - using.icon = ui_style - using.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - using.icon_state = "hand_active" - using.screen_loc = ui_lhand - using.layer = 19 - src.l_hand_hud_object = using - src.adding += using - - using = new /obj/screen( src ) - using.name = "hand" - using.set_dir(SOUTH) - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen( src ) - using.name = "hand" - using.set_dir(SOUTH) - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - using = new /obj/screen( src ) - using.name = "mask" - using.set_dir(NORTH) - using.icon = ui_style - using.icon_state = "equip" - using.screen_loc = ui_monkey_mask - using.layer = 19 - src.adding += using - - using = new /obj/screen( src ) - using.name = "back" - using.set_dir(NORTHEAST) - using.icon = ui_style - using.icon_state = "equip" - using.screen_loc = ui_back - using.layer = 19 - src.adding += using - - using = new /obj/screen( src ) - using.name = null - using.icon = ui_style - using.icon_state = "dither50" - using.screen_loc = "1,1 to 5,15" - using.layer = 17 - using.mouse_opacity = 0 - src.vimpaired += using - using = new /obj/screen( src ) - using.name = null - using.icon = ui_style - using.icon_state = "dither50" - using.screen_loc = "5,1 to 10,5" - using.layer = 17 - using.mouse_opacity = 0 - src.vimpaired += using - using = new /obj/screen( src ) - using.name = null - using.icon = ui_style - using.icon_state = "dither50" - using.screen_loc = "6,11 to 10,15" - using.layer = 17 - using.mouse_opacity = 0 - src.vimpaired += using - using = new /obj/screen( src ) - using.name = null - using.icon = ui_style - using.icon_state = "dither50" - using.screen_loc = "11,1 to 15,15" - using.layer = 17 - using.mouse_opacity = 0 - src.vimpaired += using - - mymob.throw_icon = new /obj/screen(null) - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_throw - - mymob.oxygen = new /obj/screen( null ) - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen( null ) - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen( null ) - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen( null ) - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen( null ) - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen( null ) - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen( null ) - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.pullin = new /obj/screen( null ) - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull - - mymob.blind = new /obj/screen( null ) - mymob.blind.icon = ui_style - mymob.blind.icon_state = "blackanimate" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1 to 15,15" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen( null ) - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel( null ) - mymob.zone_sel.overlays = null - mymob.zone_sel.overlays += image("icon" = 'icons/mob/zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting)) - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.set_dir(2) - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.target) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.set_dir(1) - src.adding += mymob.item_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.set_dir(1) - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.set_dir(1) - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - mymob.client.screen = null - - //, mymob.i_select, mymob.m_select - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach, mymob.hands, ) - mymob.client.screen += src.adding + src.other - - //if(istype(mymob,/mob/living/carbon/monkey)) mymob.client.screen += src.mon_blo - - return diff --git a/code/WorkInProgress/Cib/amorph/life.dm b/code/WorkInProgress/Cib/amorph/life.dm deleted file mode 100644 index 1d254e5768..0000000000 --- a/code/WorkInProgress/Cib/amorph/life.dm +++ /dev/null @@ -1,516 +0,0 @@ -/mob/living/carbon/amorph - var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie - - var/oxygen_alert = 0 - var/phoron_alert = 0 - var/fire_alert = 0 - - var/temperature_alert = 0 - - -/mob/living/carbon/amorph/Life() - set invisibility = 0 - set background = 1 - - if (src.monkeyizing) - return - - ..() - - var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE - if(src.loc) - environment = loc.return_air() - - if (src.stat != 2) //still breathing - - //First, resolve location and get a breath - - if(air_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - breathe() - - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - //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 - - //Disease Check - handle_virus_updates() - - //Handle temperature/pressure differences between body and environment - if(environment) // More error checking -- TLE - handle_environment(environment) - - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - - //Status updates, death etc. -// UpdateLuminosity() - handle_regular_status_updates() - - if(client) - handle_regular_hud_updates() - - //Being buckled to a chair or bed - check_if_buckled() - - // Yup. - update_canmove() - - clamp_values() - - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - -/mob/living/carbon/amorph - proc - - clamp_values() - - AdjustStunned(0) - AdjustParalysis(0) - AdjustWeakened(0) - - handle_disabilities() - if (src.disabilities & 4) - if ((prob(5) && src.paralysis <= 1 && src.r_ch_cou < 1)) - src.drop_item() - spawn( 0 ) - emote("cough") - return - if (src.disabilities & 8) - if ((prob(10) && src.paralysis <= 1 && src.r_Tourette < 1)) - Stun(10) - spawn( 0 ) - emote("twitch") - return - if (src.disabilities & 16) - if (prob(10)) - src.stuttering = max(10, src.stuttering) - - update_mind() - if(!mind && client) - mind = new - mind.current = src - mind.key = key - - handle_mutations_and_radiation() - // amorphs are immune to this stuff - - breathe() - if(src.reagents) - - if(src.reagents.has_reagent("lexorin")) return - - if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite - - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - - if(losebreath>0) //Suffocating so do not take a breath - src.losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE - breath = loc.remove_air(breath_moles) - - // Handle chem smoke effect -- Doohl - var/block = 0 - if(wear_mask) - if(istype(wear_mask, /obj/item/clothing/mask/gas)) - block = 1 - - if(!block) - - for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking - - - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - - get_breath_from_internal(volume_needed) - if(internal) - if (!contents.Find(src.internal)) - internal = null - if (!wear_mask || !(wear_mask.flags|MASKINTERNALS) ) - internal = null - if(internal) - if (src.internals) - src.internals.icon_state = "internal1" - return internal.remove_air_volume(volume_needed) - else - if (src.internals) - src.internals.icon_state = "internal0" - return null - - update_canmove() - if(paralysis || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0 - else canmove = 1 - - handle_breath(datum/gas_mixture/breath) - if(src.nodamage) - return - - if(!breath || (breath.total_moles == 0)) - adjustOxyLoss(7) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_oxygen_min = 8 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/SA_para_min = 0.5 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(prob(20)) - spawn(0) emote("gasp") - if (O2_pp == 0) - O2_pp = 0.01 - var/ratio = safe_oxygen_min/O2_pp - adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1) - else // We're in safe limits - adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - src.sleeping = max(src.sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - - return 1 - - handle_environment(datum/gas_mixture/environment) - if(!environment) - return - var/environment_heat_capacity = environment.heat_capacity() - if(istype(loc, /turf/space)) - environment_heat_capacity = loc:heat_capacity - - 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(stat==2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - - //Account for massive pressure differences - - - var/pressure = environment.return_pressure() - - // if(!wear_suit) Monkies cannot into space. - // if(!istype(wear_suit, /obj/item/clothing/suit/space)) - - /*if(pressure < 20) - if(prob(25)) - src << "You feel the splittle on your lips and the fluid on your eyes boiling away, the capillteries in your skin breaking." - adjustBruteLoss(5) - */ - - if(pressure > HAZARD_HIGH_PRESSURE) - - adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE)) - - - - return //TODO: DEFERRED - - handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(src.nodamage) return - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - if(exposed_temperature > bodytemperature) - adjustFireLoss(20.0*discomfort) - - else - adjustFireLoss(5.0*discomfort) - - handle_chemicals_in_body() - // most chemicals will have no effect on amorphs - //if(reagents) reagents.metabolize(src) - - if (src.drowsyness) - src.drowsyness-- - src.eye_blurry = max(2, src.eye_blurry) - if (prob(5)) - src.sleeping += 1 - Paralyse(5) - - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) - - src.updatehealth() - - return //TODO: DEFERRED - - handle_regular_status_updates() - - health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - - if(getOxyLoss() > 25) Paralyse(3) - - if(src.sleeping) - Paralyse(5) - if (prob(1) && health) spawn(0) emote("snore") - - if(src.resting) - Weaken(5) - - if(health < config.health_threshold_dead && stat != 2) - death() - else if(src.health < config.health_threshold_crit) - if(src.health <= 20 && prob(1)) spawn(0) emote("gasp") - - // shuffle around the chemical effects for amorphs a little ;) - if(!src.reagents.has_reagent("antitoxin") && src.stat != 2) src.adjustOxyLoss(2) - - if(src.stat != 2) src.stat = 1 - Paralyse(5) - - if (src.stat != 2) //Alive. - - if (src.paralysis || src.stunned || src.weakened) //Stunned etc. - if (src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if (src.weakened > 0) - AdjustWeakened(-1) - src.lying = 1 - src.stat = 0 - if (src.paralysis > 0) - AdjustParalysis(-1) - src.blinded = 1 - src.lying = 1 - src.stat = 1 - var/h = src.hand - src.hand = 0 - drop_item() - src.hand = 1 - drop_item() - src.hand = h - - else //Not stunned. - src.lying = 0 - src.stat = 0 - - else //Dead. - src.lying = 1 - src.blinded = 1 - src.stat = 2 - - if (src.stuttering) src.stuttering-- - if (src.slurring) src.slurring-- - - if (src.eye_blind) - src.eye_blind-- - src.blinded = 1 - - if (src.ear_deaf > 0) src.ear_deaf-- - if (src.ear_damage < 25) - src.ear_damage -= 0.05 - src.ear_damage = max(src.ear_damage, 0) - - src.density = !( src.lying ) - - if (src.disabilities & 128) - src.blinded = 1 - if (src.disabilities & 32) - src.ear_deaf = 1 - - if (src.eye_blurry > 0) - src.eye_blurry-- - src.eye_blurry = max(0, src.eye_blurry) - - if (src.druggy > 0) - src.druggy-- - src.druggy = max(0, src.druggy) - - return 1 - - handle_regular_hud_updates() - - if (src.stat == 2 || (XRAY in mutations)) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = 2 - else if (src.stat != 2) - src.sight &= ~SEE_TURFS - src.sight &= ~SEE_MOBS - src.sight &= ~SEE_OBJS - src.see_in_dark = 2 - src.see_invisible = 0 - - if (src.sleep) - src.sleep.icon_state = text("sleep[]", src.sleeping > 0 ? 1 : 0) - src.sleep.overlays = null - if(src.sleeping_willingly) - src.sleep.overlays += icon(src.sleep.icon, "sleep_willing") - if (src.rest) src.rest.icon_state = text("rest[]", src.resting) - - if (src.healths) - if (src.stat != 2) - switch(health) - if(100 to INFINITY) - src.healths.icon_state = "health0" - if(80 to 100) - src.healths.icon_state = "health1" - if(60 to 80) - src.healths.icon_state = "health2" - if(40 to 60) - src.healths.icon_state = "health3" - if(20 to 40) - src.healths.icon_state = "health4" - if(0 to 20) - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" - else - src.healths.icon_state = "health7" - - if (pressure) - var/datum/gas_mixture/environment = loc.return_air() - if(environment) - switch(environment.return_pressure()) - - if(HAZARD_HIGH_PRESSURE to INFINITY) - pressure.icon_state = "pressure2" - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - pressure.icon_state = "pressure1" - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - pressure.icon_state = "pressure0" - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - pressure.icon_state = "pressure-1" - else - pressure.icon_state = "pressure-2" - - if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]" - - - if (src.toxin) src.toxin.icon_state = "tox[src.phoron_alert ? 1 : 0]" - if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]" - if (src.fire) src.fire.icon_state = "fire[src.fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - if(bodytemp) - switch(src.bodytemperature) //310.055 optimal body temp - if(345 to INFINITY) - src.bodytemp.icon_state = "temp4" - if(335 to 345) - src.bodytemp.icon_state = "temp3" - if(327 to 335) - src.bodytemp.icon_state = "temp2" - if(316 to 327) - src.bodytemp.icon_state = "temp1" - if(300 to 316) - src.bodytemp.icon_state = "temp0" - if(295 to 300) - src.bodytemp.icon_state = "temp-1" - if(280 to 295) - src.bodytemp.icon_state = "temp-2" - if(260 to 280) - src.bodytemp.icon_state = "temp-3" - else - src.bodytemp.icon_state = "temp-4" - - src.client.screen -= src.hud_used.blurry - src.client.screen -= src.hud_used.druggy - src.client.screen -= src.hud_used.vimpaired - - if ((src.blind && src.stat != 2)) - if ((src.blinded)) - src.blind.layer = 18 - else - src.blind.layer = 0 - - if (src.disabilities & 1) - src.client.screen += src.hud_used.vimpaired - - if (src.eye_blurry) - src.client.screen += src.hud_used.blurry - - if (src.druggy) - src.client.screen += src.hud_used.druggy - - if (src.stat != 2) - if (src.machine) - if (!( src.machine.check_eye(src) )) - src.reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 - - handle_virus_updates() - // amorphs can't come down with human diseases - return \ No newline at end of file diff --git a/code/WorkInProgress/Cib/amorph/say.dm b/code/WorkInProgress/Cib/amorph/say.dm deleted file mode 100644 index a73c9de5d3..0000000000 --- a/code/WorkInProgress/Cib/amorph/say.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/carbon/amorph/emote(var/act,var/m_type=1,var/message = null) - if(act == "me") - return custom_emote(m_type, message) - -/mob/living/carbon/amorph/say_quote(var/text) - return "[src.say_message], \"[text]\""; diff --git a/code/WorkInProgress/Cib/meme.dm b/code/WorkInProgress/Cib/meme.dm deleted file mode 100644 index cbd536da93..0000000000 --- a/code/WorkInProgress/Cib/meme.dm +++ /dev/null @@ -1,600 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05 - -// === MEMETIC ANOMALY === -// ======================= - -/** -This life form is a form of parasite that can gain a certain level of control -over its host. Its player will share vision and hearing with the host, and it'll -be able to influence the host through various commands. -**/ - -// The maximum amount of points a meme can gather. -var/global/const/MAXIMUM_MEME_POINTS = 750 - - -// === PARASITE === -// ================ - -// a list of all the parasites in the mob -mob/living/carbon/var/list/parasites = list() - -mob/living/parasite - var/mob/living/carbon/host // the host that this parasite occupies - - Login() - ..() - - // make the client see through the host instead - client.eye = host - client.perspective = EYE_PERSPECTIVE - - -mob/living/parasite/proc/enter_host(mob/living/carbon/host) - // by default, parasites can't share a body with other life forms - if(host.parasites.len > 0) - return 0 - - src.host = host - src.loc = host - host.parasites.Add(src) - - if(client) client.eye = host - - return 1 - -mob/living/parasite/proc/exit_host() - src.host.parasites.Remove(src) - src.host = null - src.loc = null - - return 1 - - -// === MEME === -// ============ - -// Memes use points for many actions -mob/living/parasite/meme/var/meme_points = 100 -mob/living/parasite/meme/var/dormant = 0 - -// Memes have a list of indoctrinated hosts -mob/living/parasite/meme/var/list/indoctrinated = list() - -mob/living/parasite/meme/Life() - ..() - - if(client) - if(blinded) client.eye = null - else client.eye = host - - if(!host) return - - // recover meme points slowly - var/gain = 3 - if(dormant) gain = 9 // dormant recovers points faster - - meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS) - - // if there are sleep toxins in the host's body, that's bad - if(host.reagents.has_reagent("stoxin")) - src << "\red Something in your host's blood makes you lose consciousness.. you fade away.." - src.death() - return - // a host without brain is no good - if(!host.mind) - src << "\red Your host has no mind.. you fade away.." - src.death() - return - if(host.stat == 2) - src << "\red Your host has died.. you fade away.." - src.death() - return - - if(host.blinded && host.stat != 1) src.blinded = 1 - else src.blinded = 0 - - -mob/living/parasite/meme/death() - // make sure the mob is on the actual map before gibbing - if(host) src.loc = host.loc - src.stat = 2 - ..() - del src - -// When a meme speaks, it speaks through its host -mob/living/parasite/meme/say(message as text) - if(dormant) - usr << "\red You're dormant!" - return - if(!host) - usr << "\red You can't speak without host!" - return - - return host.say(message) - -// Same as speak, just with whisper -mob/living/parasite/meme/whisper(message as text) - if(dormant) - usr << "\red You're dormant!" - return - if(!host) - usr << "\red You can't speak without host!" - return - - return host.whisper(message) - -// Make the host do things -mob/living/parasite/meme/me_verb(message as text) - set name = "Me" - - - if(dormant) - usr << "\red You're dormant!" - return - - if(!host) - usr << "\red You can't emote without host!" - return - - return host.me_verb(message) - -// A meme understands everything their host understands -mob/living/parasite/meme/say_understands(mob/other) - if(!host) return 0 - - return host.say_understands(other) - -// Try to use amount points, return 1 if successful -mob/living/parasite/meme/proc/use_points(amount) - if(dormant) - usr << "\red You're dormant!" - return - if(src.meme_points < amount) - src << "* You don't have enough meme points(need [amount])." - return 0 - - src.meme_points -= round(amount) - return 1 - -// Let the meme choose one of his indoctrinated mobs as target -mob/living/parasite/meme/proc/select_indoctrinated(var/title, var/message) - var/list/candidates - - // Can only affect other mobs thant he host if not blinded - if(blinded) - candidates = list() - src << "\red You are blinded, so you can not affect mobs other than your host." - else - candidates = indoctrinated.Copy() - - candidates.Add(src.host) - - var/mob/target = null - if(candidates.len == 1) - target = candidates[1] - else - var/selected - - var/list/text_candidates = list() - var/list/map_text_to_mob = list() - - for(var/mob/living/carbon/human/M in candidates) - text_candidates += M.real_name - map_text_to_mob[M.real_name] = M - - selected = input(message,title) as null|anything in text_candidates - if(!selected) return null - - target = map_text_to_mob[selected] - - return target - - -// A meme can make people hear things with the thought ability -mob/living/parasite/meme/verb/Thought() - set category = "Meme" - set name = "Thought(50)" - set desc = "Implants a thought into the target, making them think they heard someone talk." - - if(meme_points < 50) - // just call use_points() to give the standard failure message - use_points(50) - return - - var/list/candidates = indoctrinated.Copy() - if(!(src.host in candidates)) - candidates.Add(src.host) - - var/mob/target = select_indoctrinated("Thought", "Select a target which will hear your thought.") - - if(!target) return - - var/speaker = input("Select the voice in which you would like to make yourself heard.", "Voice") as null|text - if(!speaker) return - - var/message = input("What would you like to say?", "Message") as null - if(!message) return - - // Use the points at the end rather than the beginning, because the user might cancel - if(!use_points(50)) return - - message = say_quote(message) - var/rendered = "[speaker] [message]" - target.show_message(rendered) - - usr << "You make [target] hear: [rendered]" - -// Mutes the host -mob/living/parasite/meme/verb/Mute() - set category = "Meme" - set name = "Mute(250)" - set desc = "Prevents your host from talking for a while." - - if(!src.host) return - if(!host.speech_allowed) - usr << "\red Your host already can't speak.." - return - if(!use_points(250)) return - - spawn - // backup the host incase we switch hosts after using the verb - var/mob/host = src.host - - host << "\red Your tongue feels numb.. You lose your ability to speak." - usr << "\red Your host can't speak anymore." - - host.speech_allowed = 0 - - sleep(1200) - - host.speech_allowed = 1 - host << "\red Your tongue has feeling again.." - usr << "\red [host] can speak again." - -// Makes the host unable to emote -mob/living/parasite/meme/verb/Paralyze() - set category = "Meme" - set name = "Paralyze(250)" - set desc = "Prevents your host from using emote for a while." - - if(!src.host) return - if(!host.use_me) - usr << "\red Your host already can't use body language.." - return - if(!use_points(250)) return - - spawn - // backup the host incase we switch hosts after using the verb - var/mob/host = src.host - - host << "\red Your body feels numb.. You lose your ability to use body language." - usr << "\red Your host can't use body language anymore." - - host.use_me = 0 - - sleep(1200) - - host.use_me = 1 - host << "\red Your body has feeling again.." - usr << "\red [host] can use body language again." - - - -// Cause great agony with the host, used for conditioning the host -mob/living/parasite/meme/verb/Agony() - set category = "Meme" - set name = "Agony(200)" - set desc = "Causes significant pain in your host." - - if(!src.host) return - if(!use_points(200)) return - - spawn - // backup the host incase we switch hosts after using the verb - var/mob/living/carbon/host = src.host - - if (host.species && (host.species.flags & NO_PAIN)) - usr << "Nothing seems to happen." - return - - host.paralysis = max(host.paralysis, 2) - - host.flash_weak_pain() - host << "\red You feel excrutiating pain all over your body! It is so bad you can't think or articulate yourself properly.." - - usr << "You send a jolt of agonizing pain through [host], they should be unable to concentrate on anything else for half a minute." - - host.emote("scream") - - for(var/i=0, i<10, i++) - host.stuttering = 2 - sleep(50) - if(prob(80)) host.flash_weak_pain() - if(prob(10)) host.paralysis = max(host.paralysis, 2) - if(prob(15)) host.emote("twitch") - else if(prob(15)) host.emote("scream") - else if(prob(10)) host.emote("collapse") - - if(i == 10) - host << "\red THE PAIN! AGHH, THE PAIN! MAKE IT STOP! ANYTHING TO MAKE IT STOP!" - - host << "\red The pain subsides.." - -// Cause great joy with the host, used for conditioning the host -mob/living/parasite/meme/verb/Joy() - set category = "Meme" - set name = "Joy(200)" - set desc = "Causes significant joy in your host." - - if(!src.host) return - if(!use_points(200)) return - - spawn - var/mob/host = src.host - host.druggy = max(host.druggy, 50) - host.slurring = max(host.slurring, 10) - - usr << "You stimulate [host.name]'s brain, injecting waves of endorphines and dopamine into the tissue. They should now forget all their worries, particularly relating to you, for around a minute." - - host << "\red You are feeling wonderful! Your head is numb and drowsy, and you can't help forgetting all the worries in the world." - - while(host.druggy > 0) - sleep(10) - - host << "\red You are feeling clear-headed again.." - -// Cause the target to hallucinate. -mob/living/parasite/meme/verb/Hallucinate() - set category = "Meme" - set name = "Hallucinate(300)" - set desc = "Makes your host hallucinate, has a short delay." - - var/mob/target = select_indoctrinated("Hallucination", "Who should hallucinate?") - - if(!target) return - if(!use_points(300)) return - - target.hallucination += 100 - - usr << "You make [target] hallucinate." - -// Jump to a closeby target through a whisper -mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob in world) - set category = "Meme" - set name = "Subtle Jump(350)" - set desc = "Move to a closeby human through a whisper." - - if(!istype(target, /mob/living/carbon/human) || !target.mind) - src << "You can't jump to this creature.." - return - if(!(target in view(1, host)+src)) - src << "The target is not close enough." - return - - // Find out whether we can speak - if (host.silent || (host.disabilities & 64)) - src << "Your host can't speak.." - return - - if(!use_points(350)) return - - for(var/mob/M in view(1, host)) - M.show_message("[host] whispers something incoherent.",2) // 2 stands for hearable message - - // Find out whether the target can hear - if(target.disabilities & 32 || target.ear_deaf) - src << "Your target doesn't seem to hear you.." - return - - if(target.parasites.len > 0) - src << "Your target already is possessed by something.." - return - - src.exit_host() - src.enter_host(target) - - usr << "You successfully jumped to [target]." - log_admin("[src.key] has jumped to [target]") - message_admins("[src.key] has jumped to [target]") - -// Jump to a distant target through a shout -mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob in world) - set category = "Meme" - set name = "Obvious Jump(750)" - set desc = "Move to any mob in view through a shout." - - if(!istype(target, /mob/living/carbon/human) || !target.mind) - src << "You can't jump to this creature.." - return - if(!(target in view(host))) - src << "The target is not close enough." - return - - // Find out whether we can speak - if (host.silent || (host.disabilities & 64)) - src << "Your host can't speak.." - return - - if(!use_points(750)) return - - for(var/mob/M in view(host)+src) - M.show_message("[host] screams something incoherent!",2) // 2 stands for hearable message - - // Find out whether the target can hear - if(target.disabilities & 32 || target.ear_deaf) - src << "Your target doesn't seem to hear you.." - return - - if(target.parasites.len > 0) - src << "Your target already is possessed by something.." - return - - src.exit_host() - src.enter_host(target) - - usr << "You successfully jumped to [target]." - log_admin("[src.key] has jumped to [target]") - message_admins("[src.key] has jumped to [target]") - -// Jump to an attuned mob for free -mob/living/parasite/meme/verb/AttunedJump(mob/living/carbon/human/target as mob in world) - set category = "Meme" - set name = "Attuned Jump(0)" - set desc = "Move to a mob in sight that you have already attuned." - - if(!istype(target, /mob/living/carbon/human) || !target.mind) - src << "You can't jump to this creature.." - return - if(!(target in view(host))) - src << "You need to make eye-contact with the target." - return - if(!(target in indoctrinated)) - src << "You need to attune the target first." - return - - src.exit_host() - src.enter_host(target) - - usr << "You successfully jumped to [target]." - - log_admin("[src.key] has jumped to [target]") - message_admins("[src.key] has jumped to [target]") - -// ATTUNE a mob, adding it to the indoctrinated list -mob/living/parasite/meme/verb/Attune() - set category = "Meme" - set name = "Attune(400)" - set desc = "Change the host's brain structure, making it easier for you to manipulate him." - - if(host in src.indoctrinated) - usr << "You have already attuned this host." - return - - if(!host) return - if(!use_points(400)) return - - src.indoctrinated.Add(host) - - usr << "You successfully indoctrinated [host]." - host << "\red Your head feels a bit roomier.." - - log_admin("[src.key] has attuned [host]") - message_admins("[src.key] has attuned [host]") - -// Enables the mob to take a lot more damage -mob/living/parasite/meme/verb/Analgesic() - set category = "Meme" - set name = "Analgesic(500)" - set desc = "Combat drug that the host to move normally, even under life-threatening pain." - - if(!host) return - if(!(host in indoctrinated)) - usr << "\red You need to attune the host first." - return - if(!use_points(500)) return - - usr << "You inject drugs into [host]." - host << "\red You feel your body strengthen and your pain subside.." - host.analgesic = 60 - while(host.analgesic > 0) - sleep(10) - host << "\red The dizziness wears off, and you can feel pain again.." - - -mob/proc/clearHUD() - if(client) client.screen.Cut() - -// Take control of the mob -mob/living/parasite/meme/verb/Possession() - set category = "Meme" - set name = "Possession(500)" - set desc = "Take direct control of the host for a while." - - if(!host) return - if(!(host in indoctrinated)) - usr << "\red You need to attune the host first." - return - if(!use_points(500)) return - - usr << "You take control of [host]!" - host << "\red Everything goes black.." - - spawn - var/mob/dummy = new() - dummy.loc = 0 - dummy.sight = BLIND - - var/datum/mind/host_mind = host.mind - var/datum/mind/meme_mind = src.mind - - host_mind.transfer_to(dummy) - meme_mind.transfer_to(host) - host_mind.current.clearHUD() - host.update_clothing() - - dummy << "\blue You feel very drowsy.. Your eyelids become heavy..." - - log_admin("[meme_mind.key] has taken possession of [host]([host_mind.key])") - message_admins("[meme_mind.key] has taken possession of [host]([host_mind.key])") - - sleep(600) - - log_admin("[meme_mind.key] has lost possession of [host]([host_mind.key])") - message_admins("[meme_mind.key] has lost possession of [host]([host_mind.key])") - - meme_mind.transfer_to(src) - host_mind.transfer_to(host) - meme_mind.current.clearHUD() - host.update_clothing() - src << "\red You lose control.." - - del dummy - -// Enter dormant mode, increases meme point gain -mob/living/parasite/meme/verb/Dormant() - set category = "Meme" - set name = "Dormant(100)" - set desc = "Speed up point recharging, will force you to cease all actions until all points are recharged." - - if(!host) return - if(!use_points(100)) return - - usr << "You enter dormant mode.. You won't be able to take action until all your points have recharged." - - dormant = 1 - - while(meme_points < MAXIMUM_MEME_POINTS) - sleep(10) - - dormant = 0 - - usr << "\red You have regained all points and exited dormant mode!" - -mob/living/parasite/meme/verb/Show_Points() - set category = "Meme" - - usr << "Meme Points: [src.meme_points]/[MAXIMUM_MEME_POINTS]" - -// Stat panel to show meme points, copypasted from alien -/mob/living/parasite/meme/Stat() - ..() - - statpanel("Status") - if (client && client.holder) - stat(null, "([x], [y], [z])") - - if (client && client.statpanel == "Status") - stat(null, "Meme Points: [src.meme_points]") - -// Game mode helpers, used for theft objectives -// -------------------------------------------- -mob/living/parasite/check_contents_for(t) - if(!host) return 0 - - return host.check_contents_for(t) - -mob/living/parasite/check_contents_for_reagent(t) - if(!host) return 0 - - return host.check_contents_for_reagent(t) diff --git a/code/WorkInProgress/Mini/asay_trap.dm b/code/WorkInProgress/Mini/asay_trap.dm deleted file mode 100644 index 4cbd9e3c20..0000000000 --- a/code/WorkInProgress/Mini/asay_trap.dm +++ /dev/null @@ -1,12 +0,0 @@ -/obj/effect/admin_log_trap - name = "Herprpr" - desc = "Stepping on this is good." - icon = 'icons/mob/screen1.dmi' - icon_state = "x2" - anchored = 1.0 - unacidable = 1 - invisibility = 101 - -/obj/effect/admin_log_trap/HasEntered(AM as mob|obj) - if(istype(AM,/mob)) - message_admins("[AM] ([AM:ckey]) stepped on an alerted tile in [get_area(src)]. Jump", admin_ref = 1) diff --git a/code/WorkInProgress/Mini/pipe_heater.dm b/code/WorkInProgress/Mini/pipe_heater.dm deleted file mode 100644 index 3845758432..0000000000 --- a/code/WorkInProgress/Mini/pipe_heater.dm +++ /dev/null @@ -1,84 +0,0 @@ -//copy pastad freezer -//remove this shit when someonething better is done -/obj/machinery/atmospherics/unary/heat_reservoir/heater - name = "Heat Regulator" - icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "freezer_0" - density = 1 - - anchored = 1.0 - - current_heat_capacity = 1000 - - New() - ..() - initialize_directions = dir - - initialize() - if(node) return - - var/node_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - - update_icon() - - - update_icon() - if(src.node) - if(src.on) - icon_state = "freezer_1" - else - icon_state = "freezer" - else - icon_state = "freezer_0" - return - - attack_ai(mob/user as mob) - return src.attack_hand(user) - - attack_paw(mob/user as mob) - return src.attack_hand(user) - - attack_hand(mob/user as mob) - user.machine = src - var/temp_text = "" - if(air_contents.temperature > (T0C - 20)) - temp_text = "[air_contents.temperature]" - else if(air_contents.temperature < (T0C - 20) && air_contents.temperature > (T0C - 100)) - temp_text = "[air_contents.temperature]" - else - temp_text = "[air_contents.temperature]" - - var/dat = {"Cryo gas cooling system
- Current status: [ on ? "Off On" : "Off On"]
- Current gas temperature: [temp_text]
- Current air pressure: [air_contents.return_pressure()]
- Target gas temperature: - - - [current_temperature] + + +
- "} - - user << browse(dat, "window=freezer;size=400x500") - onclose(user, "freezer") - - Topic(href, href_list) - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if (href_list["start"]) - src.on = !src.on - update_icon() - if(href_list["temp"]) - var/amount = text2num(href_list["temp"]) - if(amount > 0) - src.current_temperature = min(350, src.current_temperature+amount) - else - src.current_temperature = max(150, src.current_temperature+amount) - src.updateUsrDialog() - src.add_fingerprint(usr) - return - - process() - ..() - src.updateUsrDialog() \ No newline at end of file diff --git a/code/WorkInProgress/Mloc/Shortcuts.dm b/code/WorkInProgress/Mloc/Shortcuts.dm deleted file mode 100644 index 361e647cbc..0000000000 --- a/code/WorkInProgress/Mloc/Shortcuts.dm +++ /dev/null @@ -1,65 +0,0 @@ -/mob/verb/shortcut_changeintent(var/changeto as num) - set name = "_changeintent" - set hidden = 1 - if(istype(usr,/mob/living/carbon)) - if(changeto == 1) - switch(usr.a_intent) - if("help") - usr.a_intent = "disarm" - usr.hud_used.action_intent.icon_state = "disarm" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small_active" - if("disarm") - usr.a_intent = "hurt" - usr.hud_used.action_intent.icon_state = "harm" - usr.hud_used.hurt_intent.icon_state = "harm_small_active" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - if("hurt") - usr.a_intent = "grab" - usr.hud_used.action_intent.icon_state = "grab" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small_active" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - if("grab") - usr.a_intent = "help" - usr.hud_used.action_intent.icon_state = "help" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small_active" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - else if(changeto == -1) - switch(usr.a_intent) - if("help") - usr.a_intent = "grab" - usr.hud_used.action_intent.icon_state = "grab" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small_active" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - if("disarm") - usr.a_intent = "help" - usr.hud_used.action_intent.icon_state = "help" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small_active" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - if("hurt") - usr.a_intent = "disarm" - usr.hud_used.action_intent.icon_state = "disarm" - usr.hud_used.hurt_intent.icon_state = "harm_small" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small_active" - if("grab") - usr.a_intent = "hurt" - usr.hud_used.action_intent.icon_state = "harm" - usr.hud_used.hurt_intent.icon_state = "harm_small_active" - usr.hud_used.help_intent.icon_state = "help_small" - usr.hud_used.grab_intent.icon_state = "grab_small" - usr.hud_used.disarm_intent.icon_state = "disarm_small" - return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Abi79/uplink_kits.dm b/code/WorkInProgress/Ported/Abi79/uplink_kits.dm deleted file mode 100644 index b7b053135e..0000000000 --- a/code/WorkInProgress/Ported/Abi79/uplink_kits.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/weapon/storage/syndie_kit - name = "Box" - desc = "A sleek, sturdy box" - icon_state = "box_of_doom" - item_state = "syringe_kit" - -/obj/item/weapon/storage/syndie_kit/imp_freedom - name = "Freedom Implant (with injector)" - -/obj/item/weapon/storage/syndie_kit/imp_freedom/New() - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) - O.imp = new /obj/item/weapon/implant/freedom(O) - O.update() - ..() - return - -/obj/item/weapon/storage/syndie_kit/imp_compress - name = "Compressed Matter Implant (with injector)" - -/obj/item/weapon/storage/syndie_kit/imp_compress/New() - new /obj/item/weapon/implanter/compressed(src) - ..() - return - -/obj/item/weapon/storage/syndie_kit/imp_explosive - name = "Explosive Implant (with injector)" - -/obj/item/weapon/storage/syndie_kit/imp_explosive/New() - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) - O.imp = new /obj/item/weapon/implant/explosive(O) - O.name = "(BIO-HAZARD) BIO-detpack" - O.update() - ..() - return - -/obj/item/weapon/storage/syndie_kit/imp_uplink - name = "Uplink Implant (with injector)" - -/obj/item/weapon/storage/syndie_kit/imp_uplink/New() - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) - O.imp = new /obj/item/weapon/implant/uplink(O) - O.update() - ..() - return - -/obj/item/weapon/storage/syndie_kit/space - name = "Space Suit and Helmet" - -/obj/item/weapon/storage/syndie_kit/space/New() - new /obj/item/clothing/suit/space/syndicate(src) - new /obj/item/clothing/head/helmet/space/syndicate(src) - ..() - return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Abi79/uplinks.dm b/code/WorkInProgress/Ported/Abi79/uplinks.dm deleted file mode 100644 index 58d9fa0ace..0000000000 --- a/code/WorkInProgress/Ported/Abi79/uplinks.dm +++ /dev/null @@ -1,467 +0,0 @@ -/* - -SYNDICATE UPLINKS - -TO-DO: - Once wizard is fixed, make sure the uplinks work correctly for it. wizard.dm is right now uncompiled and with broken code in it. - - Clean the code up and comment it. Part of it is right now copy-pasted, with the general Topic() and modifications by Abi79. - - I should take a more in-depth look at both the copy-pasted code for the individual uplinks below, and at each gamemode's code - to see how uplinks are assigned and if there are any bugs with those. - - -A list of items and costs is stored under the datum of every game mode, alongside the number of crystals, and the welcoming message. - -*/ - -/obj/item/device/uplink - var/welcome // Welcoming menu message - var/menu_message = "" // The actual menu text - var/items // List of items - var/list/ItemList // Parsed list of items - var/uses // Numbers of crystals - var/uplink_data // designated uplink items - // List of items not to shove in their hands. - var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate) - - New() - if(!welcome) - welcome = ticker.mode.uplink_welcome - if(!uplink_data) - uplink_data = ticker.mode.uplink_items - - items = replacetext(uplink_data, "\n", "") // Getting the text string of items - ItemList = dd_text2list(src.items, ";") // Parsing the items text string - uses = ticker.mode.uplink_uses - -//Let's build a menu! - proc/generate_menu() - src.menu_message = "[src.welcome]
" - src.menu_message += "Tele-Crystals left: [src.uses]
" - src.menu_message += "
" - src.menu_message += "Request item:
" - src.menu_message += "Each item costs a number of tele-crystals as indicated by the number following their name.

" - - var/cost - var/item - var/name - var/path_obj - var/path_text - var/category_items = 1 //To prevent stupid :P - - for(var/D in ItemList) - var/list/O = stringsplit(D, ":") - if(O.len != 3) //If it is not an actual item, make a break in the menu. - if(O.len == 1) //If there is one item, it's probably a title - src.menu_message += "[O[1]]
" - category_items = 0 - else //Else, it's a white space. - if(category_items < 1) //If there were no itens in the last category... - src.menu_message += "We apologize, as you could not afford anything from this category.
" - src.menu_message += "
" - continue - - path_text = O[1] - cost = text2num(O[2]) - - if(cost>uses) - continue - - path_obj = text2path(path_text) - item = new path_obj() - name = O[3] - del item - - src.menu_message += "[name] ([cost])
" - category_items++ - -// src.menu_message += "Random Item (??)
" - src.menu_message += "
" - return - - Topic(href, href_list) - if (href_list["buy_item"]) -/* if(href_list["buy_item"] == "random") - var/list/randomItems = list() - - //Sorry for all the ifs, but it makes it 1000 times easier for other people/servers to add or remove items from this list - //Add only items the player can afford: - if(uses > 19) - randomItems.Add("/obj/item/weapon/circuitboard/teleporter") //Teleporter Circuit Board (costs 20, for nuke ops) - - if(uses > 9) - randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon - randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_uplink") //Uplink Implanter - randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle - - //if(uses > 8) //Nothing... yet. - //if(uses > 7) //Nothing... yet. - - if(uses > 6) - randomItems.Add("/obj/item/weapon/aiModule/syndicate") //Hacked AI Upload Module - randomItems.Add("/obj/item/device/radio/beacon/syndicate") //Singularity Beacon - - if(uses > 5) - randomItems.Add("/obj/item/weapon/gun/projectile") //Revolver - - if(uses > 4) - randomItems.Add("/obj/item/weapon/gun/energy/crossbow") //Energy Crossbow - randomItems.Add("/obj/item/device/powersink") //Powersink - - if(uses > 3) - randomItems.Add("/obj/item/weapon/melee/energy/sword") //Energy Sword - randomItems.Add("/obj/item/clothing/mask/gas/voice") //Voice Changer - randomItems.Add("/obj/item/device/chameleon") //Chameleon Projector - - if(uses > 2) - randomItems.Add("/obj/item/weapon/storage/emp_kit") //EMP Grenades - randomItems.Add("/obj/item/weapon/pen/paralysis") //Paralysis Pen - randomItems.Add("/obj/item/weapon/cartridge/syndicate") //Detomatix Cartridge - randomItems.Add("/obj/item/clothing/under/chameleon") //Chameleon Jumpsuit - randomItems.Add("/obj/item/weapon/card/id/syndicate") //Agent ID Card - randomItems.Add("/obj/item/weapon/card/emag") //Cryptographic Sequencer - randomItems.Add("/obj/item/weapon/storage/syndie_kit/space") //Syndicate Space Suit - randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key - randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_freedom") //Freedom Implant - randomItems.Add("/obj/item/clothing/glasses/thermal") //Thermal Imaging Goggles - - if(uses > 1) -/* - var/list/usrItems = usr.get_contents() //Checks to see if the user has a revolver before giving ammo - var/hasRevolver = 0 - for(var/obj/I in usrItems) //Only add revolver ammo if the user has a gun that can shoot it - if(istype(I,/obj/item/weapon/gun/projectile)) - hasRevolver = 1 - - if(hasRevolver) randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo -*/ - randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo - randomItems.Add("/obj/item/clothing/shoes/syndigaloshes") //No-Slip Syndicate Shoes - randomItems.Add("/obj/item/weapon/plastique") //C4 - - if(uses > 0) - randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap - randomItems.Add("/obj/item/weapon/storage/toolbox/syndicate") //Syndicate Toolbox - - if(!randomItems) - del(randomItems) - return 0 - else - href_list["buy_item"] = pick(randomItems) - - switch(href_list["buy_item"]) //Ok, this gets a little messy, sorry. - if("/obj/item/weapon/circuitboard/teleporter") - uses -= 20 - if("/obj/item/toy/syndicateballoon" , "/obj/item/weapon/storage/syndie_kit/imp_uplink" , "/obj/item/weapon/storage/box/syndicate") - uses -= 10 - if("/obj/item/weapon/aiModule/syndicate" , "/obj/item/device/radio/beacon/syndicate") - uses -= 7 - if("/obj/item/weapon/gun/projectile") - uses -= 6 - if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink") - uses -= 5 - if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon") - uses -= 4 - if("/obj/item/weapon/storage/emp_kit" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \ - "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \ - "/obj/item/weapon/storage/syndie_kit/imp_freedom" , "/obj/item/clothing/glasses/thermal") - uses -= 3 - if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique") - uses -= 2 - if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate") - uses -= 1 - - del(randomItems) - return 1 -*/ - - - if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item - return 0 - - if(usr:mind && ticker.mode.traitors[usr:mind]) - var/datum/traitorinfo/info = ticker.mode.traitors[usr:mind] - info.spawnlist += href_list["buy_item"] - - uses -= text2num(href_list["cost"]) - - return 1 - - -/* - *PDA uplink - */ - -//Syndicate uplink hidden inside a traitor PDA -//Communicate with traitor through the PDA's note function. - -/obj/item/device/uplink/pda - name = "uplink module" - desc = "An electronic uplink system of unknown origin." - icon = 'icons/obj/module.dmi' - icon_state = "power_mod" - var/obj/item/device/pda/hostpda = null - - var/orignote = null //Restore original notes when locked. - var/active = 0 //Are we currently active? - var/lock_code = "" //The unlocking password. - - proc - unlock() - if ((isnull(src.hostpda)) || (src.active)) - return - - src.orignote = src.hostpda.note - src.active = 1 - src.hostpda.mode = 1 //Switch right to the notes program - - src.generate_menu() - print_to_host(menu_message) - - for (var/mob/M in viewers(1, src.hostpda.loc)) - if (M.client && M.machine == src.hostpda) - src.hostpda.attack_self(M) - - return - - print_to_host(var/text) - if (isnull(hostpda)) - return - hostpda.note = text - - for (var/mob/M in viewers(1, hostpda.loc)) - if (M.client && M.machine == hostpda) - hostpda.attack_self(M) - return - - shutdown_uplink() - if (isnull(src.hostpda)) - return - active = 0 - hostpda.note = orignote - if (hostpda.mode==1) - hostpda.mode = 0 - hostpda.updateDialog() - return - - attack_self(mob/user as mob) - src.generate_menu() - src.hostpda.note = src.menu_message - - - Topic(href, href_list) - if ((isnull(src.hostpda)) || (!src.active)) - return - - if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr)) - return - - if(..() == 1) // We can afford the item - var/path_obj = text2path(href_list["buy_item"]) - var/mob/A = src.hostpda.loc - var/item = new path_obj(get_turf(src.hostpda)) - if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner)) - if(!A.r_hand) - item:loc = A - A.r_hand = item - item:layer = 20 - else if(!A.l_hand) - item:loc = A - A.l_hand = item - item:layer = 20 - else - item:loc = get_turf(A) - usr.update_clothing() - usr.client.onBought("[item:name]") - /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind - del item*/ - //HEADFINDBACK - src.attack_self(usr) - src.hostpda.attack_self(usr) - return - - -/* - *Portable radio uplink - */ - -//A Syndicate uplink disguised as a portable radio -/obj/item/device/uplink/radio/implanted - New() - ..() - uses = 5 - return - - explode() - var/turf/location = get_turf(src.loc) - if(location) - location.hotspot_expose(700,125) - explosion(location, 0, 0, 2, 4, 1) - - var/obj/item/weapon/implant/uplink/U = src.loc - var/mob/living/A = U.imp_in - var/datum/organ/external/head = A:organs["head"] - head.destroyed = 1 - spawn(2) - head.droplimb() - del(src.master) - del(src) - return - - -/obj/item/device/uplink/radio - name = "ship bounced radio" - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null //Temporary storage area for a message offering the option to destroy the radio - var/selfdestruct = 0 //Set to 1 while the radio is self destructing itself. - var/obj/item/device/radio/origradio = null - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - w_class = 2.0 - item_state = "radio" - throwforce = 5 - throw_speed = 4 - throw_range = 20 - m_amt = 100 - - attack_self(mob/user as mob) - var/dat - - if (src.selfdestruct) - dat = "Self Destructing..." - else - if (src.temp) - dat = "[src.temp]

Clear" - else - src.generate_menu() - dat = src.menu_message - if (src.origradio) // Checking because sometimes the radio uplink may be spawned by itself, not as a normal unlockable radio - dat += "Lock
" - dat += "
" - dat += "Self-Destruct" - - user << browse(dat, "window=radio") - onclose(user, "radio") - return - - Topic(href, href_list) - if (usr.stat || usr.restrained()) - return - - if (!( istype(usr, /mob/living/carbon/human))) - return 1 - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)) || istype(src.loc,/obj/item/weapon/implant/uplink))) - usr.machine = src - - if(href_list["buy_item"]) - if(..() == 1) // We can afford the item - var/path_obj = text2path(href_list["buy_item"]) - var/item = new path_obj(get_turf(src.loc)) - var/mob/A = src.loc - if(istype(src.loc,/obj/item/weapon/implant/uplink)) - var/obj/item/weapon/implant/uplink/U = src.loc - A = U.imp_in - if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner)) - if(!A.r_hand) - item:loc = A - A.r_hand = item - item:layer = 20 - else if(!A.l_hand) - item:loc = A - A.l_hand = item - item:layer = 20 - else - item:loc = get_turf(A) - /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind - del item*/ - usr.client.onBought("[item:name]") - src.attack_self(usr) - return - - else if (href_list["lock"] && src.origradio) - // presto chango, a regular radio again! (reset the freq too...) - usr.machine = null - usr << browse(null, "window=radio") - var/obj/item/device/radio/T = src.origradio - var/obj/item/device/uplink/radio/R = src - R.loc = T - T.loc = usr - // R.layer = initial(R.layer) - R.layer = 0 - if (usr.client) - usr.client.screen -= R - if (usr.r_hand == R) - usr.u_equip(R) - usr.r_hand = T - - else - usr.u_equip(R) - usr.l_hand = T - R.loc = T - T.layer = 20 - T.set_frequency(initial(T.frequency)) - T.attack_self(usr) - return - - else if (href_list["selfdestruct"]) - src.temp = "Self-Destruct" - - else if (href_list["selfdestruct2"]) - src.selfdestruct = 1 - spawn (100) - explode() - return - - else if (href_list["clear_selfdestruct"]) - src.temp = null - - attack_self(usr) -// if (istype(src.loc, /mob)) -// attack_self(src.loc) -// else -// for(var/mob/M in viewers(1, src)) -// if (M.client) -// src.attack_self(M) - return - - proc/explode() - var/turf/location = get_turf(src.loc) - if(location) - location.hotspot_expose(700,125) - explosion(location, 0, 0, 2, 4, 1) - - del(src.master) - del(src) - return - - proc/shutdown_uplink() - if (!src.origradio) - return - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if (M.client && M.machine == src) - M << browse(null, "window=radio") - M.machine = null - - var/obj/item/device/radio/T = src.origradio - var/obj/item/device/uplink/radio/R = src - var/mob/L = src.loc - R.loc = T - T.loc = L - // R.layer = initial(R.layer) - R.layer = 0 - if (istype(L)) - if (L.client) - L.client.screen -= R - if (L.r_hand == R) - L.u_equip(R) - L.r_hand = T - else - L.u_equip(R) - L.l_hand = T - T.layer = 20 - T.set_frequency(initial(T.frequency)) - return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Bureaucracy/copier.dm b/code/WorkInProgress/Ported/Bureaucracy/copier.dm deleted file mode 100644 index 1374dc5520..0000000000 --- a/code/WorkInProgress/Ported/Bureaucracy/copier.dm +++ /dev/null @@ -1,145 +0,0 @@ -// Contains: copy machine - -/obj/machinery/copier - name = "Copy Machine" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "copier_o" - density = 1 - anchored = 1 - var/num_copies = 1 // number of copies selected, will be maintained between jobs - var/copying = 0 // are we copying - var/job_num_copies = 0 // number of copies remaining - var/obj/item/weapon/template // the paper OR photo being scanned - var/max_copies = 10 // MAP EDITOR: can set the number of max copies, possibly to 5 or something for public, more for QM, robutist, etc. - -/obj/machinery/copier/attackby(obj/item/weapon/O as obj, mob/user as mob) - if(template) - return - - if (istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo)) - // put it inside - template = O - usr.drop_item() - O.loc = src - update() - updateDialog() - -/obj/machinery/copier/attack_paw(user as mob) - return src.attack_hand(user) - -/obj/machinery/copier/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/copier/attack_hand(mob/user as mob) - // da UI - var/dat - if(..()) - return - user.machine = src - - if(src.stat) - user << "[name] does not seem to be responding to your button mashing." - return - - dat = "Copy MachineXeno Corp. Copying Machine
" - - if(copying) - dat += "[job_num_copies] copies remaining.

" - dat += "Cancel" - else - if(template) - dat += "Open Lid" - else - dat += "No paper to be copied.
" - dat += "Please place a paper or photograph on top and close the lid.
" - - - dat += "

Number of Copies: " - dat += "-" - dat += "-" - dat += " [num_copies] " - dat += "+" - dat += "+
" - - if(template) - dat += "Copy" - - dat += "
" - - user << browse(dat, "window=copy_machine") - onclose(user, "copy_machine") - -/obj/machinery/copier/proc/update() - if(template) - icon_state = "copier" - else - icon_state = "copier_o" - -/obj/machinery/copier/Topic(href, href_list) - if(..()) - return - usr.machine = src - - if(href_list["num"]) - num_copies += text2num(href_list["num"]) - if(num_copies < 1) - num_copies = 1 - else if(num_copies > max_copies) - num_copies = max_copies - updateDialog() - if(href_list["open"]) - if(copying) - return - template.loc = src.loc - template = null - updateDialog() - update() - if(href_list["copy"]) - if(copying) - return - job_num_copies = num_copies - spawn(0) - do_copy(usr) - - if(href_list["cancel"]) - job_num_copies = 0 - -/obj/machinery/copier/proc/do_copy(mob/user) - if(!copying && job_num_copies > 0) - copying = 1 - updateDialog() - while(job_num_copies > 0) - if(stat) - copying = 0 - return - - // fx - flick("copier_s", src) - playsound(src, 'sound/items/polaroid1.ogg', 50, 1) - - // dup the file - if(istype(template, /obj/item/weapon/paper)) - // make duplicate paper - var/obj/item/weapon/paper/P = new(src.loc) - P.name = template.name - P.info = template:info - P.stamped = template:stamped - P.icon_state = template.icon_state - P.overlays = null - for(var/overlay in template.overlays) - P.overlays += overlay - else if(istype(template, /obj/item/weapon/photo)) - // make duplicate photo - var/obj/item/weapon/photo/P = new(src.loc) - P.name = template.name - P.desc = template.desc - P.icon = template.icon - P.img = template:img - - sleep(30) - job_num_copies -= 1 - updateDialog() - for(var/mob/O in hearers(src)) - O.show_message("[name] beeps happily.", 2) - copying = 0 - updateDialog() \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Bureaucracy/filing.dm b/code/WorkInProgress/Ported/Bureaucracy/filing.dm deleted file mode 100644 index bf01c6dd27..0000000000 --- a/code/WorkInProgress/Ported/Bureaucracy/filing.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/structure/filingcabinet - name = "Filing Cabinet" - desc = "A large cabinet with drawers." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "filingcabinet" - density = 1 - anchored = 1 - -/obj/structure/filingcabinet/attackby(obj/item/weapon/paper/P,mob/M) - if(istype(P)) - M << "You put \the [P] in the [src]." - M.drop_item() - P.loc = src - else - M << "You can't put a [P] in the [src]!" - -/obj/structure/filingcabinet/attack_hand(mob/user) - if(src.contents.len <= 0) - user << "The [src] is empty." - return - var/obj/item/weapon/paper/P = input(user,"Choose a sheet to take out.","[src]", "Cancel") as null|obj in src.contents - if(!isnull(P) && in_range(src,user)) - P.loc = user.loc \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Spawners/spawner.dm b/code/WorkInProgress/Ported/Spawners/spawner.dm deleted file mode 100644 index 90f2f90039..0000000000 --- a/code/WorkInProgress/Ported/Spawners/spawner.dm +++ /dev/null @@ -1,208 +0,0 @@ -/obj/spawner - name = "object spawner" - -/obj/spawner/bomb - name = "bomb" - icon = 'icons/mob/screen1.dmi' - icon_state = "x" - var/btype = 0 //0 = radio, 1= prox, 2=time - var/explosive = 1 // 0= firebomb - var/btemp = 500 // bomb temperature (degC) - var/active = 0 - -/obj/spawner/bomb/radio - btype = 0 - -/obj/spawner/bomb/proximity - btype = 1 - -/obj/spawner/bomb/timer - btype = 2 - -/obj/spawner/bomb/timer/syndicate - btemp = 450 - -/obj/spawner/bomb/suicide - btype = 3 - -/obj/spawner/newbomb - // Remember to delete it if you use it for anything else other than uplinks. See the commented line in its New() - Abi - // Going in depth: the reason we do not do a Del() in its New()is because then we cannot access its properties. - // I might be doing this wrong / not knowing of a Byond function. If I'm doing it wrong, let me know please. - name = "bomb" - icon = 'icons/mob/screen1.dmi' - icon_state = "x" - var/btype = 0 // 0=radio, 1=prox, 2=time - var/btemp1 = 1500 - var/btemp2 = 1000 // tank temperatures - -/obj/spawner/newbomb/timer - btype = 2 - -/obj/spawner/newbomb/timer/syndicate - name = "Low-Yield Bomb" - btemp1 = 1500 - btemp2 = 1000 - -/obj/spawner/newbomb/proximity - btype = 1 - -/obj/spawner/newbomb/radio - btype = 0 - -/obj/spawner/bomb/New() - ..() - - switch (src.btype) - // radio - if (0) - var/obj/item/assembly/r_i_ptank/R = new /obj/item/assembly/r_i_ptank(src.loc) - var/obj/item/weapon/tank/phoron/p3 = new /obj/item/weapon/tank/phoron(R) - var/obj/item/device/radio/signaler/p1 = new /obj/item/device/radio/signaler(R) - var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) - R.part1 = p1 - R.part2 = p2 - R.part3 = p3 - p1.master = R - p2.master = R - p3.master = R - R.status = explosive - p1.b_stat = 0 - p2.status = 1 - p3.air_contents.temperature = btemp + T0C - - // proximity - if (1) - var/obj/item/assembly/m_i_ptank/R = new /obj/item/assembly/m_i_ptank(src.loc) - var/obj/item/weapon/tank/phoron/p3 = new /obj/item/weapon/tank/phoron(R) - var/obj/item/device/prox_sensor/p1 = new /obj/item/device/prox_sensor(R) - var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) - R.part1 = p1 - R.part2 = p2 - R.part3 = p3 - p1.master = R - p2.master = R - p3.master = R - R.status = explosive - - p3.air_contents.temperature = btemp + T0C - p2.status = 1 - - if(src.active) - R.part1.state = 1 - R.part1.icon_state = text("motion[]", 1) - R.c_state(1, src) - - // timer - if (2) - var/obj/item/assembly/t_i_ptank/R = new /obj/item/assembly/t_i_ptank(src.loc) - var/obj/item/weapon/tank/phoron/p3 = new /obj/item/weapon/tank/phoron(R) - var/obj/item/device/timer/p1 = new /obj/item/device/timer(R) - var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) - R.part1 = p1 - R.part2 = p2 - R.part3 = p3 - p1.master = R - p2.master = R - p3.master = R - R.status = explosive - - p3.air_contents.temperature = btemp + T0C - p2.status = 1 - //bombvest - if(3) - var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new /obj/item/clothing/suit/armor/a_i_a_ptank(src.loc) - var/obj/item/weapon/tank/phoron/p4 = new /obj/item/weapon/tank/phoron(R) - var/obj/item/device/healthanalyzer/p1 = new /obj/item/device/healthanalyzer(R) - var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) - var/obj/item/clothing/suit/armor/vest/p3 = new /obj/item/clothing/suit/armor/vest(R) - R.part1 = p1 - R.part2 = p2 - R.part3 = p3 - R.part4 = p4 - p1.master = R - p2.master = R - p3.master = R - p4.master = R - R.status = explosive - - p4.air_contents.temperature = btemp + T0C - p2.status = 1 - - del(src) - - -/obj/spawner/newbomb/New() - ..() - - switch (src.btype) - // radio - if (0) - - var/obj/item/device/transfer_valve/V = new(src.loc) - var/obj/item/weapon/tank/phoron/PT = new(V) - var/obj/item/weapon/tank/oxygen/OT = new(V) - - var/obj/item/device/radio/signaler/S = new(V) - - V.tank_one = PT - V.tank_two = OT - V.attached_device = S - - S.master = V - PT.master = V - OT.master = V - - S.b_stat = 0 - - PT.air_contents.temperature = btemp1 + T0C - OT.air_contents.temperature = btemp2 + T0C - - V.update_icon() - - // proximity - if (1) - - var/obj/item/device/transfer_valve/V = new(src.loc) - var/obj/item/weapon/tank/phoron/PT = new(V) - var/obj/item/weapon/tank/oxygen/OT = new(V) - - var/obj/item/device/prox_sensor/P = new(V) - - V.tank_one = PT - V.tank_two = OT - V.attached_device = P - - P.master = V - PT.master = V - OT.master = V - - - PT.air_contents.temperature = btemp1 + T0C - OT.air_contents.temperature = btemp2 + T0C - - V.update_icon() - - - // timer - if (2) - var/obj/item/device/transfer_valve/V = new(src.loc) - var/obj/item/weapon/tank/phoron/PT = new(V) - var/obj/item/weapon/tank/oxygen/OT = new(V) - - var/obj/item/device/timer/T = new(V) - - V.tank_one = PT - V.tank_two = OT - V.attached_device = T - - T.master = V - PT.master = V - OT.master = V - T.time = 30 - - PT.air_contents.temperature = btemp1 + T0C - OT.air_contents.temperature = btemp2 + T0C - - V.update_icon() - //del(src) \ No newline at end of file diff --git a/code/WorkInProgress/Ported/sql.dm b/code/WorkInProgress/Ported/sql.dm deleted file mode 100644 index 9e0cad90ad..0000000000 --- a/code/WorkInProgress/Ported/sql.dm +++ /dev/null @@ -1,71 +0,0 @@ -//This looks to be the traitor win tracker code. -client/proc/add_roundsjoined() - if(!makejson) - return - var/DBConnection/dbcon = new() - - dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]") - if(!dbcon.IsConnected()) return - - var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `roundsjoined` (`ckey`) VALUES ('[ckey(src.key)]')") - if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) - -client/proc/add_roundssurvived() - if(!makejson) - return - var/DBConnection/dbcon = new() - - dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]") - if(!dbcon.IsConnected()) return - - var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `roundsurvived` (`ckey`) VALUES ('[ckey(src.key)]')") - if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) - -client/proc/onDeath() - if(!makejson) - return - roundinfo.deaths++ - if(!ismob(mob)) - return - var/area = get_area(mob) - var/attacker - var/tod = time2text(world.realtime) - var/health - var/last - if(ishuman(mob.lastattacker)) - attacker = mob.lastattacker:name - else - attacker = "None" - health = "Oxy:[mob.oxyloss]Brute:[mob.bruteloss]Burn:[mob.fireloss]Toxins:[mob.toxloss]Brain:[mob.brainloss]" - if(mob.attack_log.len >= 1) - last = mob.attack_log[mob.attack_log.len] - else - last = "None" - - var/DBConnection/dbcon = new() - - dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]") - if(!dbcon.IsConnected()) return - - var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `deathlog` (`ckey`,`location`,`lastattacker`,`ToD`,`health`,`lasthit`) VALUES ('[ckey]',[dbcon.Quote(area)],[dbcon.Quote(attacker)],'[tod]','[health]',[dbcon.Quote(last)])") - if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) - -client/proc/onBought(names) - if(!makejson) return - if(!names) return - var/DBConnection/dbcon = new() - - dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]") - if(!dbcon.IsConnected()) return - - var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `traitorbuy` (`type`) VALUES ([dbcon.Quote(names)])") - if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) - -datum/roundinfo - var/core = 0 - var/deaths = 0 - var/revies = 0 - var/starttime = 0 - var/endtime = 0 - var/lenght = 0 - var/mode = 0 \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Department Sec/__README.dm b/code/WorkInProgress/Sigyn/Department Sec/__README.dm deleted file mode 100644 index e6b3f7967f..0000000000 --- a/code/WorkInProgress/Sigyn/Department Sec/__README.dm +++ /dev/null @@ -1,8 +0,0 @@ -/* - -Hey you! -You only need to untick maps/tgstation.2.0.9.dmm for this if you download the modified map from: -http://tgstation13.googlecode.com/files/tgstation.2.1.0_deptsec.zip - -Everything else can just be ticked on top of the original stuff. -*/ \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm deleted file mode 100644 index 7f98a7b6ec..0000000000 --- a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm +++ /dev/null @@ -1,126 +0,0 @@ -var/list/sec_departments = list("engineering", "supply", "medical", "science") - -proc/assign_sec_to_department(var/mob/living/carbon/human/H) - if(sec_departments.len) - var/department = pick(sec_departments) - sec_departments -= department - var/access = null - var/destination = null - switch(department) - if("supply") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears) - access = list(access_mailsorting, access_mining) - destination = /area/security/checkpoint/supply - if("engineering") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears) - access = list(access_construction, access_engine) - destination = /area/security/checkpoint/engineering - if("medical") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears) - access = list(access_medical) - destination = /area/security/checkpoint/medical - if("science") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears) - access = list(access_research) - destination = /area/security/checkpoint/science - else - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - - - if(destination) - var/teleport = 0 - if(!ticker || ticker.current_state <= GAME_STATE_SETTING_UP) - teleport = 1 - spawn(15) - if(H) - if(teleport) - var/turf/T - var/safety = 0 - while(safety < 25) - T = pick(get_area_turfs(destination)) - if(!H.Move(T)) - safety += 1 - continue - else - break - H << "You have been assigned to [department]!" - if(locate(/obj/item/weapon/card/id, H)) - var/obj/item/weapon/card/id/I = locate(/obj/item/weapon/card/id, H) - if(I) - I.access |= access - - -/datum/job/officer - title = "Security Officer" - flag = OFFICER - department_flag = ENGSEC - faction = "Station" - total_positions = 5 - spawn_positions = 5 - supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) - if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - assign_sec_to_department(H) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) - 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/head/helmet(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) - H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - - implant_loyalty(H) - - return 1 - -/obj/item/device/radio/headset/headset_sec/department/New() - if(radio_controller) - initialize() - recalculateChannels() - -/obj/item/device/radio/headset/headset_sec/department/engi - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_eng - -/obj/item/device/radio/headset/headset_sec/department/supply - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_cargo - -/obj/item/device/radio/headset/headset_sec/department/med - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_med - -/obj/item/device/radio/headset/headset_sec/department/sci - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_sci - -/obj/item/clothing/under/rank/security/cargo/New() - var/obj/item/clothing/tie/armband/cargo/A = new /obj/item/clothing/tie/armband/cargo - hastie = A - -/obj/item/clothing/under/rank/security/engine/New() - var/obj/item/clothing/tie/armband/engine/A = new /obj/item/clothing/tie/armband/engine - hastie = A - -/obj/item/clothing/under/rank/security/science/New() - var/obj/item/clothing/tie/armband/science/A = new /obj/item/clothing/tie/armband/science - hastie = A - -/obj/item/clothing/under/rank/security/med/New() - var/obj/item/clothing/tie/armband/medgreen/A = new /obj/item/clothing/tie/armband/medgreen - hastie = A \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Softcurity/__README.dm b/code/WorkInProgress/Sigyn/Softcurity/__README.dm deleted file mode 100644 index 75c62c277d..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/__README.dm +++ /dev/null @@ -1,10 +0,0 @@ -/* - -Hey you! -You'll need to untick code/game/jobs/access.dm for this to all work correctly! - -Everything else can just be ticked on top of the original stuff. - -You'll also need to download a modified map from http://tgstation13.googlecode.com/files/tgstation.2.0.9_Softcurity.zip. -Make sure to untick the original map! -*/ \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Softcurity/access.dm b/code/WorkInProgress/Sigyn/Softcurity/access.dm deleted file mode 100644 index de0179fad4..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/access.dm +++ /dev/null @@ -1,522 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/var/const/access_security = 1 // Security equipment -/var/const/access_brig = 2 // Brig timers and permabrig -/var/const/access_armory = 3 -/var/const/access_forensics_lockers= 4 -/var/const/access_medical = 5 -/var/const/access_morgue = 6 -/var/const/access_tox = 7 -/var/const/access_tox_storage = 8 -/var/const/access_genetics = 9 -/var/const/access_engine = 10 -/var/const/access_engine_equip= 11 -/var/const/access_maint_tunnels = 12 -/var/const/access_external_airlocks = 13 -/var/const/access_emergency_storage = 14 -/var/const/access_change_ids = 15 -/var/const/access_ai_upload = 16 -/var/const/access_teleporter = 17 -/var/const/access_eva = 18 -/var/const/access_heads = 19 -/var/const/access_captain = 20 -/var/const/access_all_personal_lockers = 21 -/var/const/access_chapel_office = 22 -/var/const/access_tech_storage = 23 -/var/const/access_atmospherics = 24 -/var/const/access_bar = 25 -/var/const/access_janitor = 26 -/var/const/access_crematorium = 27 -/var/const/access_kitchen = 28 -/var/const/access_robotics = 29 -/var/const/access_rd = 30 -/var/const/access_cargo = 31 -/var/const/access_construction = 32 -/var/const/access_chemistry = 33 -/var/const/access_cargo_bot = 34 -/var/const/access_hydroponics = 35 -/var/const/access_manufacturing = 36 -/var/const/access_library = 37 -/var/const/access_lawyer = 38 -/var/const/access_virology = 39 -/var/const/access_cmo = 40 -/var/const/access_qm = 41 -/var/const/access_court = 42 -/var/const/access_clown = 43 -/var/const/access_mime = 44 -/var/const/access_surgery = 45 -/var/const/access_theatre = 46 -/var/const/access_research = 47 -/var/const/access_mining = 48 -/var/const/access_mining_office = 49 //not in use -/var/const/access_mailsorting = 50 -/var/const/access_mint = 51 -/var/const/access_mint_vault = 52 -/var/const/access_heads_vault = 53 -/var/const/access_mining_station = 54 -/var/const/access_xenobiology = 55 -/var/const/access_ce = 56 -/var/const/access_hop = 57 -/var/const/access_hos = 58 -/var/const/access_RC_announce = 59 //Request console announcements -/var/const/access_keycard_auth = 60 //Used for events which require at least two people to confirm them -/var/const/access_tcomsat = 61 // has access to the entire telecomms satellite / machinery -/var/const/access_gateway = 62 -/var/const/access_sec_doors = 63 // Security front doors - - //BEGIN CENTCOM ACCESS - /*Should leave plenty of room if we need to add more access levels. -/var/const/Mostly for admin fun times.*/ -/var/const/access_cent_general = 101//General facilities. -/var/const/access_cent_thunder = 102//Thunderdome. -/var/const/access_cent_specops = 103//Special Ops. -/var/const/access_cent_medical = 104//Medical/Research -/var/const/access_cent_living = 105//Living quarters. -/var/const/access_cent_storage = 106//Generic storage areas. -/var/const/access_cent_teleporter = 107//Teleporter. -/var/const/access_cent_creed = 108//Creed's office. -/var/const/access_cent_captain = 109//Captain's office/ID comp/AI. - - //The Syndicate -/var/const/access_syndicate = 150//General Syndicate Access - - //MONEY -/var/const/access_crate_cash = 200 - -/obj/var/list/req_access = null -/obj/var/req_access_txt = "0" -/obj/var/list/req_one_access = null -/obj/var/req_one_access_txt = "0" - -/obj/New() - ..() - //NOTE: If a room requires more than one access (IE: Morgue + medbay) set the req_acesss_txt to "5;6" if it requires 5 and 6 - if(src.req_access_txt) - var/list/req_access_str = text2list(req_access_txt,";") - if(!req_access) - req_access = list() - for(var/x in req_access_str) - var/n = text2num(x) - if(n) - req_access += n - - if(src.req_one_access_txt) - var/list/req_one_access_str = text2list(req_one_access_txt,";") - if(!req_one_access) - req_one_access = list() - for(var/x in req_one_access_str) - var/n = text2num(x) - if(n) - req_one_access += n - - - -//returns 1 if this mob has sufficient access to use this object -/obj/proc/allowed(mob/M) - //check if it doesn't require any access at all - if(src.check_access(null)) - return 1 - if(istype(M, /mob/living/silicon)) - //AI can do whatever he wants - return 1 - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id)) - return 1 - else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid)) - var/mob/living/carbon/george = M - //they can only hold things :( - if(george.get_active_hand() && (istype(george.get_active_hand(), /obj/item/weapon/card/id) || istype(george.get_active_hand(), /obj/item/device/pda)) && src.check_access(george.get_active_hand())) - return 1 - return 0 - -/obj/item/proc/GetAccess() - return list() - -/obj/item/proc/GetID() - return null - -/obj/proc/check_access(obj/item/weapon/card/id/I) - - if (istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - - if(!src.req_access && !src.req_one_access) //no requirements - return 1 - if(!istype(src.req_access, /list)) //something's very wrong - return 1 - - var/list/L = src.req_access - if(!L.len && (!src.req_one_access || !src.req_one_access.len)) //no requirements - return 1 - if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access - return 0 - for(var/req in src.req_access) - if(!(req in I.access)) //doesn't have this access - return 0 - if(src.req_one_access && src.req_one_access.len) - for(var/req in src.req_one_access) - if(req in I.access) //has an access from the single access list - return 1 - return 0 - return 1 - - -/obj/proc/check_access_list(var/list/L) - if(!src.req_access && !src.req_one_access) return 1 - if(!istype(src.req_access, /list)) return 1 - if(!src.req_access.len && (!src.req_one_access || !src.req_one_access.len)) return 1 - if(!L) return 0 - if(!istype(L, /list)) return 0 - for(var/req in src.req_access) - if(!(req in L)) //doesn't have this access - return 0 - if(src.req_one_access && src.req_one_access.len) - for(var/req in src.req_one_access) - if(req in L) //has an access from the single access list - return 1 - return 0 - return 1 - - -/proc/get_access(job) - switch(job) - if("Geneticist") - return list(access_medical, access_morgue, access_genetics) - if("Station Engineer") - return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) - if("Assistant") - if(config.assistant_maint) - return list(access_maint_tunnels) - else - return list() - if("Chaplain") - return list(access_morgue, access_chapel_office, access_crematorium) - if("Detective") - return list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - if("Medical Doctor") - return list(access_medical, access_morgue, access_surgery) - if("Gardener") // -- TLE - return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. - if("Librarian") // -- TLE - return list(access_library) - if("Lawyer") //Muskets 160910 - return list(access_lawyer, access_court, access_sec_doors) - if("Captain") - return get_all_accesses() - if("Crew Supervisor") - return list(access_security, access_sec_doors, access_brig, access_court) - if("Correctional Advisor") - return list(access_security, access_sec_doors, access_brig, access_armory, access_court) - if("Scientist") - return list(access_tox, access_tox_storage, access_research, access_xenobiology) - if("Safety Administrator") - return list(access_medical, access_morgue, access_tox, access_tox_storage, access_chemistry, access_genetics, access_court, - access_teleporter, access_heads, access_tech_storage, access_security, access_sec_doors, access_brig, access_atmospherics, - access_maint_tunnels, access_bar, access_janitor, access_kitchen, access_robotics, access_armory, access_hydroponics, - access_theatre, access_research, access_hos, access_RC_announce, access_forensics_lockers, access_keycard_auth, access_gateway) - if("Head of Personnel") - return list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, - access_tox, access_tox_storage, access_chemistry, access_medical, access_genetics, access_engine, - access_emergency_storage, access_change_ids, access_ai_upload, access_eva, access_heads, - access_all_personal_lockers, access_tech_storage, access_maint_tunnels, access_bar, access_janitor, - access_crematorium, access_kitchen, access_robotics, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway) - if("Atmospheric Technician") - return list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) - if("Bartender") - return list(access_bar) - if("Chemist") - return list(access_medical, access_chemistry) - if("Janitor") - return list(access_janitor, access_maint_tunnels) - if("Clown") - return list(access_clown, access_theatre) - if("Mime") - return list(access_mime, access_theatre) - if("Chef") - return list(access_kitchen, access_morgue) - if("Roboticist") - return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access. - if("Cargo Technician") - return list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) - if("Shaft Miner") - return list(access_mining, access_mint, access_mining_station) - if("Quartermaster") - return list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) - if("Chief Engineer") - return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, - access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, - access_heads, access_ai_upload, access_construction, access_robotics, - access_mint, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_sec_doors) - if("Research Director") - return list(access_rd, access_heads, access_tox, access_genetics, - access_tox_storage, access_teleporter, - access_research, access_robotics, access_xenobiology, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_sec_doors) - if("Virologist") - return list(access_medical, access_virology) - if("Chief Medical Officer") - return list(access_medical, access_morgue, access_genetics, access_heads, - access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors) - else - return list() - -/proc/get_centcom_access(job) - switch(job) - if("VIP Guest") - return list(access_cent_general) - if("Custodian") - return list(access_cent_general, access_cent_living, access_cent_storage) - if("Thunderdome Overseer") - return list(access_cent_general, access_cent_thunder) - if("Intel Officer") - return list(access_cent_general, access_cent_living) - if("Medical Officer") - return list(access_cent_general, access_cent_living, access_cent_medical) - if("Death Commando") - return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) - if("Research Officer") - return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage) - if("BlackOps Commander") - return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed) - if("Supreme Commander") - return get_all_centcom_access() - -/proc/get_all_accesses() - return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court, - access_medical, access_genetics, access_morgue, access_rd, - access_tox, access_tox_storage, access_chemistry, access_engine, access_engine_equip, access_maint_tunnels, - access_external_airlocks, access_emergency_storage, access_change_ids, access_ai_upload, - access_teleporter, access_eva, access_heads, access_captain, access_all_personal_lockers, - access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen, - access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_cargo_bot, access_construction, - access_hydroponics, access_library, access_manufacturing, access_lawyer, access_virology, access_cmo, access_qm, access_clown, access_mime, access_surgery, - access_theatre, access_research, access_mining, access_mailsorting, access_mint_vault, access_mint, - access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce, - access_keycard_auth, access_tcomsat, access_gateway) - -/proc/get_all_centcom_access() - return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain) - -/proc/get_all_syndicate_access() - return list(access_syndicate) - -/proc/get_region_accesses(var/code) - switch(code) - if(0) - return get_all_accesses() - if(1) //security - return list(access_sec_doors, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_hos) - if(2) //medbay - return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo) - if(3) //research - return list(access_research, access_tox, access_tox_storage, access_xenobiology, access_rd) - if(4) //engineering and maintenance - return list(access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_construction, access_robotics, access_ce) - if(5) //command - return list(access_heads, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_all_personal_lockers, access_heads_vault, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_hop, access_captain) - if(6) //station general - return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_clown, access_mime) - if(7) //supply - return list(access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_mining, access_mining_station) - -/proc/get_region_accesses_name(var/code) - switch(code) - if(0) - return "All" - if(1) //security - return "Security" - if(2) //medbay - return "Medbay" - if(3) //research - return "Research" - if(4) //engineering and maintenance - return "Engineering" - if(5) //command - return "Command" - if(6) //station general - return "Station General" - if(7) //supply - return "Supply" - - -/proc/get_access_desc(A) - switch(A) - if(access_cargo) - return "Cargo Bay" - if(access_cargo_bot) - return "Cargo Bot Delivery" - if(access_security) - return "Security" - if(access_brig) - return "Holding Cells" - if(access_court) - return "Courtroom" - if(access_forensics_lockers) - return "Detective's Office" - if(access_medical) - return "Medical" - if(access_genetics) - return "Genetics Lab" - if(access_morgue) - return "Morgue" - if(access_tox) - return "Research Lab" - if(access_tox_storage) - return "Toxins Storage" - if(access_chemistry) - return "Chemistry Lab" - if(access_rd) - return "RD Private" - if(access_bar) - return "Bar" - if(access_janitor) - return "Custodial Closet" - if(access_engine) - return "Engineering" - if(access_engine_equip) - return "APCs" - if(access_maint_tunnels) - return "Maintenance" - if(access_external_airlocks) - return "External Airlocks" - if(access_emergency_storage) - return "Emergency Storage" - if(access_change_ids) - return "ID Computer" - if(access_ai_upload) - return "AI Upload" - if(access_teleporter) - return "Teleporter" - if(access_eva) - return "EVA" - if(access_heads) - return "Bridge" - if(access_captain) - return "Captain Private" - if(access_all_personal_lockers) - return "Personal Lockers" - if(access_chapel_office) - return "Chapel Office" - if(access_tech_storage) - return "Technical Storage" - if(access_atmospherics) - return "Atmospherics" - if(access_crematorium) - return "Crematorium" - if(access_armory) - return "Armory" - if(access_construction) - return "Construction Areas" - if(access_kitchen) - return "Kitchen" - if(access_hydroponics) - return "Hydroponics" - if(access_library) - return "Library" - if(access_lawyer) - return "Law Office" - if(access_robotics) - return "Robotics" - if(access_virology) - return "Virology" - if(access_cmo) - return "CMO Private" - if(access_qm) - return "Quartermaster's Office" - if(access_clown) - return "HONK! Access" - if(access_mime) - return "Silent Access" - if(access_surgery) - return "Surgery" - if(access_theatre) - return "Theatre" - if(access_manufacturing) - return "Manufacturing" - if(access_research) - return "Science" - if(access_mining) - return "Mining" - if(access_mining_office) - return "Mining Office" - if(access_mailsorting) - return "Delivery Office" - if(access_mint) - return "Mint" - if(access_mint_vault) - return "Mint Vault" - if(access_heads_vault) - return "Main Vault" - if(access_mining_station) - return "Mining Station EVA" - if(access_xenobiology) - return "Xenobiology Lab" - if(access_hop) - return "HoP Private" - if(access_hos) - return "HoS Private" - if(access_ce) - return "CE Private" - if(access_RC_announce) - return "RC Announcements" - if(access_keycard_auth) - return "Keycode Auth. Device" - if(access_tcomsat) - return "Telecommunications" - if(access_gateway) - return "Gateway" - if(access_sec_doors) - return "Brig" - -/proc/get_centcom_access_desc(A) - switch(A) - if(access_cent_general) - return "Code Grey" - if(access_cent_thunder) - return "Code Yellow" - if(access_cent_storage) - return "Code Orange" - if(access_cent_living) - return "Code Green" - if(access_cent_medical) - return "Code White" - if(access_cent_teleporter) - return "Code Blue" - if(access_cent_specops) - return "Code Black" - if(access_cent_creed) - return "Code Silver" - if(access_cent_captain) - return "Code Gold" - -/proc/get_all_jobs() - return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Gardener", "Quartermaster", "Cargo Technician", - "Shaft Miner", "Clown", "Mime", "Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", - "Atmospheric Technician", "Roboticist", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", - "Research Director", "Scientist", "Head of Security", "Warden", "Detective", "Security Officer") - -/proc/get_all_centcom_jobs() - return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander") - -/obj/proc/GetJobName() - if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) - return - - var/jobName - - if(istype(src, /obj/item/device/pda)) - if(src:id) - jobName = src:id:assignment - if(istype(src, /obj/item/weapon/card/id)) - jobName = src:assignment - - if(jobName in get_all_jobs()) - return jobName - else - return "Unknown" diff --git a/code/WorkInProgress/Sigyn/Softcurity/clothing.dm b/code/WorkInProgress/Sigyn/Softcurity/clothing.dm deleted file mode 100644 index 057c10cb57..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/clothing.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/item/clothing/under/rank/administrator - name = "safety administrator's jumpsuit" - desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Safety Administrator\"." - icon_state = "hosblueclothes" - item_state = "ba_suit" - color = "hosblueclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL - -/obj/item/clothing/under/rank/advisor - name = "correctional advisor's jumpsuit" - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the words \"Correctional Advisor\" written on the shoulders." - icon_state = "wardenblueclothes" - item_state = "ba_suit" - color = "wardenblueclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL - -/obj/item/clothing/under/rank/supervisor - name = "crew supervisor's jumpsuit" - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." - icon_state = "officerblueclothes" - item_state = "ba_suit" - color = "officerblueclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL - -/obj/item/clothing/shoes/boots - name = "boots" - desc = "Nanotrasen-issue hard-toe safety boots." - icon_state = "secshoes" - item_state = "secshoes" - color = "hosred" \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Softcurity/jobs.dm b/code/WorkInProgress/Sigyn/Softcurity/jobs.dm deleted file mode 100644 index a47e4ea43e..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/jobs.dm +++ /dev/null @@ -1,150 +0,0 @@ -/datum/job/hos - title = "Safety Administrator" - flag = HOS - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffdddd" - idtype = /obj/item/weapon/card/id/silver - req_admin_notify = 1 - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/administrator(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) - 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/weapon/gun/energy/taser(H), slot_s_store) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - - H.implant_loyalty(src) // Will not do so if config is set to disallow. - - return 1 - - - -/datum/job/warden - title = "Correctional Advisor" - flag = WARDEN - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the safety administrator" - selection_color = "#ffeeee" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/advisor(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) - H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - - H.implant_loyalty(src) // // Will not do so if config is set to disallow. - - return 1 - - - -/datum/job/detective - title = "Detective" - flag = DETECTIVE - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the safety administrator" - selection_color = "#ffeeee" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) - 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/device/pda/detective(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) - var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) - CIG.light("") - H.equip_to_slot_or_del(CIG, slot_wear_mask) - 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) - H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store) - - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack) - - H.implant_loyalty(src) // Will not do so if config is set to disallow. - return 1 - - - -/datum/job/officer - title = "Crew Supervisor" - flag = OFFICER - department_flag = ENGSEC - faction = "Station" - total_positions = 5 - spawn_positions = 5 - supervisors = "the safety administrator" - selection_color = "#ffeeee" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/supervisor(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_r_store) - H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - - H.implant_loyalty(src) // Will not do so if config is set to disallow. - - return 1 - -/datum/job/hop - title = "Head of Personnel" - flag = HOP - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ddddff" - idtype = /obj/item/weapon/card/id/silver - req_admin_notify = 1 - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_ears) - if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) - if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - 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/device/pda/heads/hop(H), slot_belt) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H.back), slot_in_backpack) - return 1 diff --git a/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm b/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm deleted file mode 100644 index 1f65f9f8d2..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm +++ /dev/null @@ -1,227 +0,0 @@ -/obj/structure/closet/secure_closet/captains - name = "Captain's Locker" - req_access = list(access_captain) - icon_state = "capsecure1" - icon_closed = "capsecure" - icon_locked = "capsecure1" - icon_opened = "capsecureopen" - icon_broken = "capsecurebroken" - icon_off = "capsecureoff" - - New() - if(prob(50)) - new /obj/item/weapon/storage/backpack/captain(src) - else - new /obj/item/weapon/storage/backpack/satchel_cap(src) - new /obj/item/clothing/suit/captunic(src) - new /obj/item/clothing/head/helmet/cap(src) - new /obj/item/clothing/under/rank/captain(src) - new /obj/item/clothing/suit/armor/vest(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/device/radio/headset/heads/captain(src) - new /obj/item/weapon/reagent_containers/food/drinks/flask(src) - new /obj/item/clothing/gloves/captain(src) - new /obj/item/weapon/gun/energy/gun(src) - return - - - -/obj/structure/closet/secure_closet/hop - name = "Head of Personnel's Locker" - req_access = list(access_hop) - icon_state = "hopsecure1" - icon_closed = "hopsecure" - icon_locked = "hopsecure1" - icon_opened = "hopsecureopen" - icon_broken = "hopsecurebroken" - icon_off = "hopsecureoff" - - New() - new /obj/item/clothing/under/rank/head_of_personnel(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/head/helmet(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/weapon/storage/id_kit(src) - new /obj/item/weapon/storage/id_kit( src ) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses(src) - return - - - -/obj/structure/closet/secure_closet/hos - name = "Safety Administrator's Locker" - req_access = list(access_hos) - icon_state = "hossecure1" - icon_closed = "hossecure" - icon_locked = "hossecure1" - icon_opened = "hossecureopen" - icon_broken = "hossecurebroken" - icon_off = "hossecureoff" - - New() - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/weapon/cartridge/hos(src) - new /obj/item/device/radio/headset/heads/hos(src) - if (config.use_loyalty_implants) new /obj/item/weapon/storage/lockbox/loyalty(src) - new /obj/item/weapon/storage/flashbang_kit(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - return - - - -/obj/structure/closet/secure_closet/warden - name = "Correctional Advisor's Locker" - req_access = list(access_armory) - icon_state = "wardensecure1" - icon_closed = "wardensecure" - icon_locked = "wardensecure1" - icon_opened = "wardensecureopen" - icon_broken = "wardensecurebroken" - icon_off = "wardensecureoff" - - - New() - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/clothing/under/rank/advisor(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/weapon/storage/flashbang_kit(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/melee/baton(src) - return - - - -/obj/structure/closet/secure_closet/security - name = "Crew Supervisor's Locker" - req_access = list(access_security) - icon_state = "sec1" - icon_closed = "sec" - icon_locked = "sec1" - icon_opened = "secopen" - icon_broken = "secbroken" - icon_off = "secoff" - - New() - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/clothing/glasses/sunglasses(src) - return - - - -/obj/structure/closet/secure_closet/detective - name = "Detective's Cabinet" - req_access = list(access_forensics_lockers) - icon_state = "cabinetdetective_locked" - icon_closed = "cabinetdetective" - icon_locked = "cabinetdetective_locked" - icon_opened = "cabinetdetective_open" - icon_broken = "cabinetdetective_broken" - icon_off = "cabinetdetective_broken" - - New() - new /obj/item/clothing/under/det(src) - new /obj/item/clothing/suit/armor/det_suit(src) - 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/device/radio/headset/headset_sec(src) - new /obj/item/weapon/cartridge/detective(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/weapon/storage/box/evidence(src) - return - -/obj/structure/closet/secure_closet/detective/update_icon() - if(broken) - icon_state = icon_broken - else - if(!opened) - if(locked) - icon_state = icon_locked - else - icon_state = icon_closed - else - icon_state = icon_opened - -/obj/structure/closet/secure_closet/injection - name = "Lethal Injections" - req_access = list(access_hos) - - - New() - new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src) - new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src) - return - - - -/obj/structure/closet/secure_closet/brig - name = "Brig Locker" - req_access = list(access_brig) - anchored = 1 - - New() - new /obj/item/clothing/under/color/orange( src ) - new /obj/item/clothing/shoes/orange( src ) - return - - - -/obj/structure/closet/secure_closet/courtroom - name = "Courtroom Locker" - req_access = list(access_court) - - New() - new /obj/item/clothing/shoes/brown(src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/pen (src) - new /obj/item/clothing/suit/judgerobe (src) - new /obj/item/clothing/head/powdered_wig (src) - new /obj/item/weapon/storage/briefcase(src) - return - -/obj/structure/closet/secure_closet/wall - name = "wall locker" - req_access = list(access_security) - icon_state = "wall-locker1" - density = 1 - icon_closed = "wall-locker" - icon_locked = "wall-locker1" - icon_opened = "wall-lockeropen" - icon_broken = "wall-lockerbroken" - icon_off = "wall-lockeroff" - - //too small to put a man in - large = 0 - -/obj/structure/closet/secure_closet/wall/update_icon() - if(broken) - icon_state = icon_broken - else - if(!opened) - if(locked) - icon_state = icon_locked - else - icon_state = icon_closed - else - icon_state = icon_opened diff --git a/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm b/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm deleted file mode 100644 index 00a6b83d91..0000000000 --- a/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm +++ /dev/null @@ -1,311 +0,0 @@ -/obj/structure/closet/wardrobe - name = "wardrobe" - desc = "It's a storage unit for standard-issue Nanotrasen attire." - icon_state = "blue" - icon_closed = "blue" - -/obj/structure/closet/wardrobe/New() - 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) - return - - -/obj/structure/closet/wardrobe/red - name = "security wardrobe" - icon_state = "red" - icon_closed = "red" - -/obj/structure/closet/wardrobe/red/New() - new /obj/item/clothing/under/rank/supervisor(src) - new /obj/item/clothing/under/rank/supervisor(src) - new /obj/item/clothing/under/rank/supervisor(src) - new /obj/item/clothing/shoes/boots(src) - new /obj/item/clothing/shoes/boots(src) - new /obj/item/clothing/shoes/boots(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) - return - - -/obj/structure/closet/wardrobe/pink - name = "pink wardrobe" - icon_state = "pink" - icon_closed = "pink" - -/obj/structure/closet/wardrobe/pink/New() - 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) - return - -/obj/structure/closet/wardrobe/black - name = "black wardrobe" - icon_state = "black" - icon_closed = "black" - -/obj/structure/closet/wardrobe/black/New() - 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/head/that(src) - new /obj/item/clothing/head/that(src) - new /obj/item/clothing/head/that(src) - return - - -/obj/structure/closet/wardrobe/chaplain_black - name = "chapel wardrobe" - desc = "It's a storage unit for Nanotrasen-approved religious attire." - icon_state = "black" - icon_closed = "black" - -/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/suit/nun(src) - new /obj/item/clothing/head/nun_hood(src) - new /obj/item/clothing/suit/chaplain_hoodie(src) - new /obj/item/clothing/head/chaplain_hood(src) - new /obj/item/clothing/suit/holidaypriest(src) - new /obj/item/weapon/storage/backpack/cultpack (src) - new /obj/item/weapon/storage/fancy/candle_box(src) - new /obj/item/weapon/storage/fancy/candle_box(src) - return - - -/obj/structure/closet/wardrobe/green - name = "green wardrobe" - icon_state = "green" - icon_closed = "green" - -/obj/structure/closet/wardrobe/green/New() - 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) - return - - -/obj/structure/closet/wardrobe/orange - name = "prison wardrobe" - desc = "It's a storage unit for Nanotrasen-regulation prisoner attire." - icon_state = "orange" - icon_closed = "orange" - -/obj/structure/closet/wardrobe/orange/New() - 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) - return - - -/obj/structure/closet/wardrobe/yellow - name = "yellow wardrobe" - icon_state = "wardrobe-y" - icon_closed = "wardrobe-y" - -/obj/structure/closet/wardrobe/yellow/New() - 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) - return - - -/obj/structure/closet/wardrobe/atmospherics_yellow - name = "atmospherics wardrobe" - icon_state = "yellow" - icon_closed = "yellow" - -/obj/structure/closet/wardrobe/atmospherics_yellow/New() - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/shoes/black(src) - return - - - -/obj/structure/closet/wardrobe/engineering_yellow - name = "engineering wardrobe" - icon_state = "yellow" - icon_closed = "yellow" - -/obj/structure/closet/wardrobe/engineering_yellow/New() - 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) - return - - -/obj/structure/closet/wardrobe/white - name = "white wardrobe" - icon_state = "white" - icon_closed = "white" - -/obj/structure/closet/wardrobe/white/New() - 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) - return - - -/obj/structure/closet/wardrobe/pjs - name = "Pajama wardrobe" - icon_state = "white" - icon_closed = "white" - -/obj/structure/closet/wardrobe/pjs/New() - new /obj/item/clothing/under/pj/red(src) - 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) - return - - -/obj/structure/closet/wardrobe/science_white - name = "science wardrobe" - icon_state = "white" - icon_closed = "white" - -/obj/structure/closet/wardrobe/science_white/New() - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - 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) - return - - -/obj/structure/closet/wardrobe/robotics_black - name = "robotics wardrobe" - icon_state = "black" - icon_closed = "black" - -/obj/structure/closet/wardrobe/robotics_black/New() - new /obj/item/clothing/under/rank/roboticist(src) - 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/gloves/black(src) - new /obj/item/clothing/gloves/black(src) - return - - -/obj/structure/closet/wardrobe/chemistry_white - name = "chemistry wardrobe" - icon_state = "white" - icon_closed = "white" - -/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/suit/labcoat/chemist(src) - new /obj/item/clothing/suit/labcoat/chemist(src) - return - - -/obj/structure/closet/wardrobe/genetics_white - name = "genetics wardrobe" - icon_state = "white" - icon_closed = "white" - -/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/suit/labcoat/genetics(src) - new /obj/item/clothing/suit/labcoat/genetics(src) - return - - -/obj/structure/closet/wardrobe/virology_white - name = "virology wardrobe" - icon_state = "white" - icon_closed = "white" - -/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/suit/labcoat/virologist(src) - new /obj/item/clothing/suit/labcoat/virologist(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - return - - -/obj/structure/closet/wardrobe/grey - name = "grey wardrobe" - icon_state = "grey" - icon_closed = "grey" - -/obj/structure/closet/wardrobe/grey/New() - 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/head/soft/grey(src) - new /obj/item/clothing/head/soft/grey(src) - new /obj/item/clothing/head/soft/grey(src) - return - - -/obj/structure/closet/wardrobe/mixed - name = "mixed wardrobe" - icon_state = "mixed" - icon_closed = "mixed" - -/obj/structure/closet/wardrobe/mixed/New() - new /obj/item/clothing/under/color/white(src) - new /obj/item/clothing/under/color/blue(src) - new /obj/item/clothing/under/color/yellow(src) - 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) - return diff --git a/code/WorkInProgress/SkyMarshal/Ultralight.dm b/code/WorkInProgress/SkyMarshal/Ultralight.dm deleted file mode 100644 index f5065223c9..0000000000 --- a/code/WorkInProgress/SkyMarshal/Ultralight.dm +++ /dev/null @@ -1,385 +0,0 @@ -//UltraLight system, by Sukasa - - -#define UL_I_FALLOFF_SQUARE 0 -#define UL_I_FALLOFF_ROUND 1 - -#define UL_I_LIT 0 -#define UL_I_EXTINGUISHED 1 -#define UL_I_ONZERO 2 -#define UL_I_CHANGING 3 - -#define ul_LightingEnabled 1 -//#define ul_LightingResolution 2 -//Uncomment if you want maybe slightly smoother lighting -#define ul_Steps 7 -#define ul_FalloffStyle UL_I_FALLOFF_ROUND // Sets the lighting falloff to be either squared or circular. -#define ul_Layer 10 -#define ul_TopLuminosity 12 //Maximum brightness an object can have. - -//#define ul_LightLevelChangedUpdates -//Uncomment if you have code that you want triggered when the light level on an atom changes. - - -#define ul_Clamp(Value) min(max(Value, 0), ul_Steps) -#define ul_IsLuminous(A) (A.ul_Red || A.ul_Green || A.ul_Blue) -#define ul_Luminosity(A) max(A.ul_Red, A.ul_Green, A.ul_Blue) - - -#ifdef ul_LightingResolution -var/ul_LightingResolutionSqrt = sqrt(ul_LightingResolution) -#endif -var/ul_SuppressLightLevelChanges = 0 - - -var/list/ul_FastRoot = list(0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7) - -var/list/ul_IconCache = list() - - -proc/ul_UnblankLocal(var/list/ReApply = view(ul_TopLuminosity, src)) - for(var/atom/Light in ReApply) - if(ul_IsLuminous(Light)) - Light.ul_Illuminate() - return - -atom/var/ul_Red = 0 -atom/var/ul_Green = 0 -atom/var/ul_Blue = 0 -atom/var/turf/ul_LastIlluminated - -atom/var/ul_Extinguished = UL_I_ONZERO - -atom/proc/ul_SetLuminosity(var/Red = 0, var/Green = Red, var/Blue = Red) - - if(ul_Extinguished == UL_I_CHANGING) //Changing state, just supress any changes, to prevent glitches. - return - - if(ul_Red == min(Red, ul_TopLuminosity) && ul_Green == min(Green, ul_TopLuminosity) && ul_Blue == min(Blue, ul_TopLuminosity)) - return //No point doing all that work if it won't have any effect anyways... - - if (ul_Extinguished == UL_I_EXTINGUISHED) - ul_Red = min(Red,ul_TopLuminosity) - ul_Green = min(Green,ul_TopLuminosity) - ul_Blue = min(Blue,ul_TopLuminosity) - - return - - if (ul_IsLuminous(src)) - ul_Extinguish() - - ul_Red = min(Red,ul_TopLuminosity) - ul_Green = min(Green,ul_TopLuminosity) - ul_Blue = min(Blue,ul_TopLuminosity) - - ul_Extinguished = UL_I_ONZERO - - if (ul_IsLuminous(src)) - ul_Illuminate() - - return - -atom/proc/ul_Illuminate() - if (ul_Extinguished == UL_I_LIT) - return - - ul_Extinguished = UL_I_CHANGING - - luminosity = ul_Luminosity(src) - - for(var/turf/Affected in view(luminosity, src)) - var/Falloff = ul_FalloffAmount(Affected) - - var/DeltaRed = ul_Red - Falloff - var/DeltaGreen = ul_Green - Falloff - var/DeltaBlue = ul_Blue - Falloff - - if(DeltaRed > 0 || DeltaGreen > 0 || DeltaBlue > 0) - - if(DeltaRed > 0) - if(!Affected.MaxRed) - Affected.MaxRed = list() - Affected.MaxRed += DeltaRed - - if(DeltaGreen > 0) - if(!Affected.MaxGreen) - Affected.MaxGreen = list() - Affected.MaxGreen += DeltaGreen - - if(DeltaBlue > 0) - if(!Affected.MaxBlue) - Affected.MaxBlue = list() - Affected.MaxBlue += DeltaBlue - - Affected.ul_UpdateLight() - - #ifdef ul_LightLevelChangedUpdates - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - #endif - - ul_LastIlluminated = get_turf(src) - ul_Extinguished = UL_I_LIT - - return - -atom/proc/ul_Extinguish() - - if (ul_Extinguished != UL_I_LIT) - return - - ul_Extinguished = UL_I_CHANGING - - for(var/turf/Affected in view(ul_Luminosity(src), ul_LastIlluminated)) - - var/Falloff = ul_LastIlluminated.ul_FalloffAmount(Affected) - - var/DeltaRed = ul_Red - Falloff - var/DeltaGreen = ul_Green - Falloff - var/DeltaBlue = ul_Blue - Falloff - - if(DeltaRed > 0 || DeltaGreen > 0 || DeltaBlue > 0) - - if(DeltaRed > 0) - if(Affected.MaxRed) - var/removed_light_source = Affected.MaxRed.Find(DeltaRed) - if(removed_light_source) - Affected.MaxRed.Cut(removed_light_source, removed_light_source+1) - if(!Affected.MaxRed.len) - del Affected.MaxRed - - if(DeltaGreen > 0) - if(Affected.MaxGreen) - var/removed_light_source = Affected.MaxGreen.Find(DeltaGreen) - if(removed_light_source) - Affected.MaxGreen.Cut(removed_light_source, removed_light_source+1) - if(!Affected.MaxGreen.len) - del Affected.MaxGreen - - if(DeltaBlue > 0) - if(Affected.MaxBlue) - var/removed_light_source = Affected.MaxBlue.Find(DeltaBlue) - if(removed_light_source) - Affected.MaxBlue.Cut(removed_light_source, removed_light_source+1) - if(!Affected.MaxBlue.len) - del Affected.MaxBlue - - Affected.ul_UpdateLight() - - #ifdef ul_LightLevelChangedUpdates - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - #endif - - ul_Extinguished = UL_I_EXTINGUISHED - luminosity = 0 - ul_LastIlluminated = null - - return - - -/* - Calculates the correct lighting falloff value (used to calculate what brightness to set the turf to) to use, - when called on a luminous atom and passed an atom in the turf to be lit. - - Supports multiple configurations, BS12 uses the circular falloff setting. This setting uses an array lookup - to avoid the cost of the square root function. -*/ -atom/proc/ul_FalloffAmount(var/atom/ref) - if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) - var/delta_x = (ref.x - src.x) - var/delta_y = (ref.y - src.y) - - #ifdef ul_LightingResolution - if (round((delta_x*delta_x + delta_y*delta_y)*ul_LightingResolutionSqrt,1) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= round(delta_x*delta_x+delta_y*delta_y*ul_LightingResolutionSqrt,1), i++) - ul_FastRoot += round(sqrt(i)) - return ul_FastRoot[round((delta_x*delta_x + delta_y*delta_y)*ul_LightingResolutionSqrt, 1) + 1]/ul_LightingResolution - - #else - if ((delta_x*delta_x + delta_y*delta_y) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= delta_x*delta_x+delta_y*delta_y, i++) - ul_FastRoot += round(sqrt(i)) - return ul_FastRoot[delta_x*delta_x + delta_y*delta_y + 1] - - #endif - - else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) - return get_dist(src, ref) - - return 0 - -atom/proc/ul_SetOpacity(var/NewOpacity) - if(opacity != NewOpacity) - - var/list/Blanked = ul_BlankLocal() - - opacity = NewOpacity - - ul_UnblankLocal(Blanked) - - return - -atom/proc/ul_BlankLocal() - var/list/Blanked = list( ) - var/TurfAdjust = isturf(src) ? 1 : 0 - - for(var/atom/Affected in view(ul_TopLuminosity, src)) - if(ul_IsLuminous(Affected) && Affected.ul_Extinguished == UL_I_LIT && (ul_FalloffAmount(Affected) <= ul_Luminosity(Affected) + TurfAdjust)) - Affected.ul_Extinguish() - Blanked += Affected - - return Blanked - -atom/proc/ul_LightLevelChanged() - //Designed for client projects to use. Called on items when the turf they are in has its light level changed - return - -atom/New() - . = ..() - if(ul_IsLuminous(src)) - spawn(5) - ul_Illuminate() - -atom/Del() - if(ul_IsLuminous(src)) - ul_Extinguish() - . = ..() - -atom/movable/Move() - if(ul_IsLuminous(src)) - ul_Extinguish() - . = ..() - ul_Illuminate() - else - return ..() - - -turf/var/list/MaxRed -turf/var/list/MaxGreen -turf/var/list/MaxBlue - -turf/proc/ul_GetRed() - if(MaxRed) - return ul_Clamp(max(MaxRed)) - return 0 -turf/proc/ul_GetGreen() - if(MaxGreen) - return ul_Clamp(max(MaxGreen)) - return 0 -turf/proc/ul_GetBlue() - if(MaxBlue) - return ul_Clamp(max(MaxBlue)) - return 0 - -turf/proc/ul_UpdateLight() - var/area/CurrentArea = loc - - if(!isarea(CurrentArea) || !CurrentArea.ul_Lighting) - return - - var/LightingTag = copytext(CurrentArea.tag, 1, findtext(CurrentArea.tag, ":UL")) + ":UL[ul_GetRed()]_[ul_GetGreen()]_[ul_GetBlue()]" - - if(CurrentArea.tag != LightingTag) - var/area/NewArea = locate(LightingTag) - - if(!NewArea) - NewArea = new CurrentArea.type() - NewArea.tag = LightingTag - - for(var/V in CurrentArea.vars - "contents") - if(issaved(CurrentArea.vars[V])) - NewArea.vars[V] = CurrentArea.vars[V] - - NewArea.tag = LightingTag - - NewArea.ul_Light(ul_GetRed(), ul_GetGreen(), ul_GetBlue()) - - - NewArea.contents += src - - return - -turf/proc/ul_Recalculate() - - ul_SuppressLightLevelChanges++ - - var/list/Lights = ul_BlankLocal() - - ul_UnblankLocal(Lights) - - ul_SuppressLightLevelChanges-- - - return - -area/var/ul_Overlay = null -area/var/ul_Lighting = 1 - -area/var/LightLevelRed = 0 -area/var/LightLevelGreen = 0 -area/var/LightLevelBlue = 0 -area/var/list/LightLevels - -area/proc/ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blue = LightLevelBlue) - - if(!src || !src.ul_Lighting) - return - - overlays -= ul_Overlay - if(LightLevels) - if(Red < LightLevels["Red"]) - Red = LightLevels["Red"] - if(Green < LightLevels["Green"]) - Green = LightLevels["Green"] - if(Blue < LightLevels["Blue"]) - Blue = LightLevels["Blue"] - - LightLevelRed = Red - LightLevelGreen = Green - LightLevelBlue = Blue - - luminosity = LightLevelRed || LightLevelGreen || LightLevelBlue - - var/ul_CachedOverlay = ul_IconCache["[LightLevelRed]-[LightLevelGreen]-[LightLevelBlue]"] - if(ul_CachedOverlay) - ul_Overlay = ul_CachedOverlay - else - ul_IconCache["[LightLevelRed]-[LightLevelGreen]-[LightLevelBlue]"] = image('icons/effects/ULIcons.dmi', , "[LightLevelRed]-[LightLevelGreen]-[LightLevelBlue]", ul_Layer) - ul_Overlay = ul_IconCache["[LightLevelRed]-[LightLevelGreen]-[LightLevelBlue]"] - - overlays += ul_Overlay - - return - -area/proc/ul_Prep() - - if(!tag) - tag = "[type]" - if(ul_Lighting) - if(!findtext(tag,":UL")) - ul_Light() - //world.log << tag - - return - -#undef UL_I_FALLOFF_SQUARE -#undef UL_I_FALLOFF_ROUND -#undef UL_I_LIT -#undef UL_I_EXTINGUISHED -#undef UL_I_ONZERO -#undef ul_LightingEnabled -#undef ul_LightingResolution -#undef ul_Steps -#undef ul_FalloffStyle -#undef ul_Layer -#undef ul_TopLuminosity -#undef ul_Clamp -#undef ul_LightLevelChangedUpdates \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/Ultralight_procs.dm b/code/WorkInProgress/SkyMarshal/Ultralight_procs.dm deleted file mode 100644 index 81ba9c458c..0000000000 --- a/code/WorkInProgress/SkyMarshal/Ultralight_procs.dm +++ /dev/null @@ -1,32 +0,0 @@ - -// MOVED HERE FROM ULTRALIGHT WHICH IS PROBABLY A BAD THING -#define UL_I_FALLOFF_SQUARE 0 -#define UL_I_FALLOFF_ROUND 1 -#define ul_FalloffStyle UL_I_FALLOFF_ROUND // Sets the lighting falloff to be either squared or circular. -var/list/ul_FastRoot = list(0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7) - -atom/proc/ul_FalloffAmount(var/atom/ref) - if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) - var/delta_x = (ref.x - src.x) - var/delta_y = (ref.y - src.y) - - #ifdef ul_LightingResolution - if (round((delta_x*delta_x + delta_y*delta_y)*ul_LightingResolutionSqrt,1) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= round(delta_x*delta_x+delta_y*delta_y*ul_LightingResolutionSqrt,1), i++) - ul_FastRoot += round(sqrt(i)) - return ul_FastRoot[round((delta_x*delta_x + delta_y*delta_y)*ul_LightingResolutionSqrt, 1) + 1]/ul_LightingResolution - - #else - if ((delta_x*delta_x + delta_y*delta_y) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= delta_x*delta_x+delta_y*delta_y, i++) - ul_FastRoot += round(sqrt(i)) - return ul_FastRoot[delta_x*delta_x + delta_y*delta_y + 1] - - #endif - - else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) - return get_dist(src, ref) - - return 0 \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/coatrack.dm b/code/WorkInProgress/SkyMarshal/coatrack.dm deleted file mode 100644 index efc64b1e2f..0000000000 --- a/code/WorkInProgress/SkyMarshal/coatrack.dm +++ /dev/null @@ -1,96 +0,0 @@ -/obj/machinery/coatrack/attack_hand(mob/user as mob) - switch(alert("What do you want from the coat rack?",,"Coat","Hat")) - if("Coat") - if(coat) - if(!user.get_active_hand()) - user.put_in_hand(coat) - else - coat.loc = get_turf(user) - coat = null - if(!hat) - icon_state = "coatrack0" - else - icon_state = "coatrack1" - return - else - user << "\blue There is no coat to take!" - return - if("Hat") - if(hat) - if(!user.get_active_hand()) - user.put_in_hand(hat) - else - hat.loc = get_turf(user) - hat = null - if(!coat) - icon_state = "coatrack0" - else - icon_state = "coatrack2" - return - else - user << "\blue There is no hat to take!" - return - user << "Something went wrong." - return - -/obj/machinery/coatrack/attackby(obj/item/weapon/W as obj, mob/user as mob) - var/obj/item/I = user.equipped() - if ( istype(I,/obj/item/clothing/head/det_hat) && !hat) - user.drop_item() - I.loc = src - hat = I - if(!coat) - icon_state = "coatrack1" - else - icon_state = "coatrack3" - for(var/mob/M in viewers(src, null)) - if(M.client) - M.show_message(text("\blue [user] puts his hat onto the rack."), 2) - return - if ( istype(I,/obj/item/clothing/suit/storage/det_suit) && !coat) - user.drop_item() - I.loc = src - coat = I - if(!hat) - icon_state = "coatrack2" - else - icon_state = "coatrack3" - for(var/mob/M in viewers(src, null)) - if(M.client) - M.show_message(text("\blue [user] puts his coat onto the rack."), 2) - return - if ( istype(I,/obj/item/clothing/head/det_hat) && hat) - user << "There's already a hat on the rack!" - return ..() - if ( istype(I,/obj/item/clothing/suit/storage/det_suit) && coat) - user << "There's already a coat on the rack!" - return ..() - user << "The coat rack wants none of what you offer." - return ..() - - -/obj/machinery/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if ( istype(mover,/obj/item/clothing/head/det_hat) && !hat) - mover.loc = src - hat = mover - if(!coat) - icon_state = "coatrack1" - else - icon_state = "coatrack3" - for(var/mob/M in viewers(src, null)) - if(M.client) - M.show_message(text("\blue The hat lands perfectly atop its hanger!"), 2) - return 0 - if ( istype(mover,/obj/item/clothing/suit/storage/det_suit) && !coat) - mover.loc = src - coat = mover - if(!hat) - icon_state = "coatrack2" - else - icon_state = "coatrack3" - for(var/mob/M in viewers(src, null)) - if(M.client) - M.show_message(text("\blue The coat lands perfectly atop its hanger!"), 2) - return 0 - else - return 0 \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/officer_stuff.dm b/code/WorkInProgress/SkyMarshal/officer_stuff.dm deleted file mode 100644 index 13cca94a8b..0000000000 --- a/code/WorkInProgress/SkyMarshal/officer_stuff.dm +++ /dev/null @@ -1,43 +0,0 @@ - // Reference: http://www.teuse.net/personal/harrington/hh_bible.htm - // http://www.trmn.org/portal/images/uniforms/rmn/rmn_officer_srv_dress_lrg.png - -/obj/item/clothing/head/beret/centcom/officer - name = "officers beret" - desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the NanoTrasen security forces, announcing to the world that the wearer is a defender of NanoTrasen." - icon_state = "centcomofficerberet" - flags = FPRINT | TABLEPASS - -/obj/item/clothing/head/beret/centcom/captain - name = "captains beret" - desc = "A white beret adorned with the shield—a cobalt kite shield with an engraved sword—of the NanoTrasen security forces, worn only by those captaining a vessel of the NanoTrasen Navy." - icon_state = "centcomcaptain" - flags = FPRINT | TABLEPASS - -/obj/item/clothing/shoes/centcom - name = "dress shoes" - desc = "They appear impeccably polished." - icon_state = "laceups" - -/obj/item/clothing/under/rank/centcom/representative - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." - name = "\improper NanoTrasen Navy Uniform" - icon_state = "officer" - item_state = "g_suit" - item_color = "officer" - displays_id = 0 - -/obj/item/clothing/under/rank/centcom/officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." - name = "\improper NanoTrasen Officers Uniform" - icon_state = "officer" - item_state = "g_suit" - item_color = "officer" - displays_id = 0 - -/obj/item/clothing/under/rank/centcom/captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." - name = "\improper NanoTrasen Captains Uniform" - icon_state = "centcom" - item_state = "dg_suit" - item_color = "centcom" - displays_id = 0 \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/portalathe.dm b/code/WorkInProgress/SkyMarshal/portalathe.dm deleted file mode 100644 index 1c2ceb15b2..0000000000 --- a/code/WorkInProgress/SkyMarshal/portalathe.dm +++ /dev/null @@ -1,21 +0,0 @@ -//May expand later, but right now it just repairs lights. -/obj/item/device/portalathe - name = "portable autolathe" - desc = "A device which can repair broken lights instantly. Must be advanced." - icon = 'icons/obj/janitor.dmi' - icon_state = "portalathe" - - afterattack(var/atom/target, mob/user as mob) - if(!target || !user) - return - if(!istype(target)) - return - if(!istype(target, /obj/machinery/light)) - return - var/obj/machinery/light/L = target - if(L.status > 1) //Burned or broke - L.status = 0 - L.on = 1 - L.update() - user.visible_message("[user] repairs \the [target] on the spot with their [src]!","You repair the lightbulb!","You hear a soft whiiir-pop noise over the sound of flexing glass, followed by the soft hum of an activated [target].") - return \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/traitoritems.dm b/code/WorkInProgress/SkyMarshal/traitoritems.dm deleted file mode 100644 index b42a36685e..0000000000 --- a/code/WorkInProgress/SkyMarshal/traitoritems.dm +++ /dev/null @@ -1,76 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:06 - -/obj/item/weapon/stamperaser - name = "eraser" - desc = "It looks like some kind of eraser." - flags = FPRINT | TABLEPASS - icon = 'icons/obj/items.dmi' - icon_state = "zippo" - item_state = "zippo" - w_class = 1.0 - m_amt = 80 -/* -/obj/item/device/jammer - name = "strange device" - desc = "It blinks and has an antenna on it. Weird." - icon_state = "t-ray0" - var/on = 0 - flags = FPRINT|TABLEPASS - w_class = 1 - var/list/obj/item/device/radio/Old = list() - var/list/obj/item/device/radio/Curr = list() - var/time_remaining = 5 - -/obj/item/device/jammer/New() - ..() - time_remaining = rand(10,20) // ~2-4 BYOND seconds of use. - return - -/obj/item/device/jammer/attack_self(mob/user) - - if(time_remaining > 0) - on = !on - icon_state = "t-ray[on]" - - if(on) - processing_objects.Add(src) - else - on = 0 - icon_state = "t-ray0" - user << "It's fried itself from overuse!" - if(Old) - for(var/obj/item/device/radio/T in Old) - T.scrambleoverride = 0 - Old = null - Curr = null - - -/obj/item/device/jammer/process() - if(!on) - processing_objects.Remove(src) - return null - - Old = Curr - Curr = list() - - for(var/obj/item/device/radio/T in range(3, src.loc) ) - - T.scrambleoverride = 1 - Curr |= T - for(var/obj/item/device/radio/V in Old) - if(V == T) - Old -= V - break - - for(var/obj/item/device/radio/T in Old) - T.scrambleoverride = 0 - - time_remaining-- - if(time_remaining <= 0) - for(var/mob/O in viewers(src)) - O.show_message("\red You hear a loud pop, like circuits frying.", 1) - on = 0 - icon_state = "t-ray0" - - sleep(2) - */ diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm deleted file mode 100755 index ffbf4d6983..0000000000 --- a/code/WorkInProgress/SkyMarshal/wardrobes.dm +++ /dev/null @@ -1,611 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:06 - -/obj/item/wardrobe - name = "\improper Wardrobe" - desc = "A standard-issue bag for clothing and equipment. Usually comes sealed, stocked with everything you need for a particular job." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "wardrobe_sealed" - item_state = "wardrobe" - w_class = 4 - layer = 2.99 - var/descriptor = "various clothing" - var/seal_torn = 0 - - attack_self(mob/user) - if(!contents.len) - user << "It's empty!" - else - user.visible_message("\blue [user] unwraps the clothing from the [src][seal_torn ? "" : ", tearing the seal"].") - seal_torn = 1 - - for(var/obj/item/I in src) - I.loc = get_turf(src) - update_icon() - return - - attackby(var/obj/item/I as obj, var/mob/user as mob) - if(istype(I, /obj/item/wardrobe) || istype(I, /obj/item/weapon/evidencebag)) - return - if(contents.len < 20) - if(istype(I, /obj/item/weapon/grab)) - return - user.drop_item() - - if(I) - I.loc = src - - update_icon() - else - user << "\red There's not enough space to fit that!" - return - - afterattack(atom/A as obj|turf, mob/user as mob) - if(A in user) - return - if(!istype(A.loc,/turf)) - user << "It's got to be on the ground to do that!" - return - var/could_fill = 1 - for (var/obj/O in locate(A.x,A.y,A.z)) - if (contents.len < 20) - if(istype(O,/obj/item/wardrobe)) - continue - if(O.anchored || O.density || istype(O,/obj/structure)) - continue - contents += O; - else - could_fill = 0 - break - if(could_fill) - user << "\blue You pick up all the items." - else - user << "\blue You try to pick up all of the items, but run out of space in the bag." - user.visible_message("\blue [user] gathers up[could_fill ? " " : " most of "]the pile of items and puts it into [src].") - update_icon() - - examine(mob/user) - ..(user) - user << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]." - if(seal_torn && !contents.len) - user << "The seal on the bag is broken." - else - user << "The seal on the bag is[seal_torn ? ", however, not intact" : " intact"]." - - update_icon() - if(contents.len) - icon_state = "wardrobe" - else - icon_state = "wardrobe_empty" - return - - New() - ..() - pixel_x = rand(0,4) -2 - pixel_y = rand(0,4) -2 - -/obj/item/wardrobe/assistant - name = "\improper Assistant Wardrobe" - descriptor = "clothing and basic equipment for an assistant" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda(src) - new /obj/item/device/radio/headset(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/color/grey(src) - -/obj/item/wardrobe/chief_engineer - name = "\improper Chief Engineer Wardrobe" - descriptor = "clothing and basic equipment for a Chief Engineer" - - New() - ..() - var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/heads/ce(src) - new /obj/item/device/multitool(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/head/helmet/hardhat/white(src) - new /obj/item/clothing/head/helmet/welding(src) - new /obj/item/weapon/storage/belt/utility/full(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/device/radio/headset/heads/ce(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/under/rank/chief_engineer(src) - -/obj/item/wardrobe/engineer - name = "\improper Station Engineer Wardrobe" - descriptor = "clothing and basic equipment for a Station Engineer" - - New() - ..() - var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/engineering(src) - new /obj/item/device/t_scanner(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/weapon/storage/belt/utility/full(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/head/helmet/hardhat(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/clothing/shoes/orange(src) - new /obj/item/clothing/under/rank/engineer(src) - -/obj/item/wardrobe/atmos - name = "\improper Atmospheric Technician Wardrobe" - descriptor = "clothing and basic equipment for an Atmospheric Technician" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/engineering(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - -/obj/item/wardrobe/roboticist - name = "\improper Roboticist Wardrobe" - descriptor = "clothing and basic equipment for a Roboticist" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/engineering(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/gloves/black(src) - new /obj/item/device/radio/headset/headset_rob(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/roboticist(src) - -/obj/item/wardrobe/chaplain - name = "\improper Chaplain Wardrobe" - descriptor = "clothing and basic equipment for a Chaplain" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/storage/bible(src) - new /obj/item/device/pda/chaplain(src) - new /obj/item/device/radio/headset(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/chaplain(src) - -/obj/item/wardrobe/captain - name = "\improper Captain Wardrobe" - descriptor = "clothing and basic equipment for a Captain" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/captain(src) - new /obj/item/weapon/storage/id_kit(src) - new /obj/item/weapon/reagent_containers/food/drinks/flask(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/suit/storage/captunic(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/head/caphat(src) - new /obj/item/clothing/gloves/captain(src) - new /obj/item/clothing/head/helmet/swat(src) - new /obj/item/device/radio/headset/heads/captain(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/under/rank/captain(src) - -/obj/item/wardrobe/hop - name = "\improper Head of Personnel Wardrobe" - descriptor = "clothing and basic equipment for a Head of Personnel" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/pda/heads/hop(src) - new /obj/item/weapon/storage/id_kit(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/gloves/blue(src) - new /obj/item/device/radio/headset/heads/hop(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/under/rank/head_of_personnel(src) - -/obj/item/wardrobe/cmo - name = "\improper Chief Medical Officer Wardrobe" - descriptor = "clothing and basic equipment for a Chief Medical Officer" - - New() - ..() - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/heads/cmo(src) - new /obj/item/weapon/storage/firstaid/adv(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/suit/bio_suit/cmo(src) - new /obj/item/clothing/head/bio_hood/cmo(src) - new /obj/item/clothing/suit/storage/labcoat/cmo(src) - new /obj/item/clothing/suit/storage/labcoat/cmoalt(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/heads/cmo(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) - new /obj/item/device/healthanalyzer(src) - -/obj/item/wardrobe/doctor - name = "\improper Medical Doctor Wardrobe" - descriptor = "clothing and basic equipment for a Medical Doctor" - - New() - ..() - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/medical(src) - new /obj/item/weapon/storage/firstaid/adv(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/head/nursehat (src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/clothing/under/rank/nursesuit (src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/device/healthanalyzer(src) - -/obj/item/wardrobe/geneticist - name = "\improper Geneticist Wardrobe" - descriptor = "clothing and basic equipment for a Geneticist" - - New() - ..() - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/medical(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/clothing/suit/storage/labcoat/genetics(src) - new /obj/item/device/radio/headset/headset_medsci(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/under/rank/geneticist(src) - -/obj/item/wardrobe/virologist - name = "\improper Virologist Wardrobe" - descriptor = "clothing and basic equipment for a Virologist" - - New() - ..() - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/device/pda/medical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/suit/storage/labcoat/virologist(src) - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/under/rank/medical(src) - -/obj/item/wardrobe/rd - name = "\improper Research Director Wardrobe" - descriptor = "clothing and basic equipment for a Research Director" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/device/pda/heads/rd(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/suit/bio_suit/scientist(src) - new /obj/item/clothing/head/bio_hood/scientist(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/device/radio/headset/heads/rd(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/under/rank/research_director(src) - -/obj/item/wardrobe/scientist - name = "\improper Scientist Wardrobe" - descriptor = "clothing and basic equipment for a Scientist" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/science(src) - new /obj/item/weapon/tank/oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/suit/storage/labcoat/science(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/under/rank/scientist(src) - -/obj/item/wardrobe/chemist - name = "\improper Chemist Wardrobe" - descriptor = "clothing and basic equipment for a Chemist" - - New() - ..() - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/radio/headset/headset_medsci(src) - new /obj/item/clothing/under/rank/chemist(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/pda/science(src) - new /obj/item/clothing/suit/storage/labcoat/chemist(src) - -/obj/item/wardrobe/hos - name = "\improper Head of Security Wardrobe" - descriptor = "clothing and basic equipment for a Head of Security" - - New() - ..() - var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/device/flash(src) - new /obj/item/device/pda/heads/hos(src) - new /obj/item/clothing/suit/storage/armourrigvest(src) - new /obj/item/clothing/suit/armor/hos(src) - new /obj/item/clothing/head/helmet/HoS(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/clothing/gloves/hos(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) - new /obj/item/device/radio/headset/heads/hos(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/under/rank/head_of_security(src) - -/obj/item/wardrobe/warden - name = "\improper Warden Wardrobe" - descriptor = "clothing and basic equipment for a Warden" - - New() - ..() - var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/device/pda/security(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/storage/gearharness(src) - new /obj/item/clothing/head/helmet/warden(src) - new /obj/item/clothing/gloves/red(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/under/rank/warden(src) - new /obj/item/clothing/suit/armor/vest/warden(src) - new /obj/item/weapon/pepperspray(src) - -/obj/item/wardrobe/detective - name = "\improper Detective Wardrobe" - descriptor = "clothing and basic equipment for a Detective" - - New() - ..() - var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/fcardholder(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/weapon/clipboard/notebook(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/taperoll/police(src) - new /obj/item/weapon/storage/box/evidence(src) - new /obj/item/device/pda/detective(src) - new /obj/item/clothing/suit/storage/det_suit/armor(src) - new /obj/item/clothing/suit/storage/det_suit(src) - new /obj/item/clothing/gloves/detective(src) - new /obj/item/clothing/head/det_hat(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/under/det(src) - new /obj/item/weapon/camera_film(src) - -/obj/item/wardrobe/officer - name = "\improper Security Officer Wardrobe" - descriptor = "clothing and basic equipment for a Security Officer" - - New() - ..() - var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/pepperspray(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/taperoll/police(src) - new /obj/item/weapon/flashbang(src) - new /obj/item/device/pda/security(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/storage/gearharness(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/clothing/head/helmet(src) - new /obj/item/clothing/head/secsoft(src) - new /obj/item/clothing/gloves/red(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/under/rank/security(src) - - - -/obj/item/wardrobe/bartender - name = "\improper Bartender Wardrobe" - descriptor = "clothing and basic equipment for a Bartender" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/radio/headset(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/bartender(src) - -/obj/item/wardrobe/chef - name = "\improper Chef Wardrobe" - descriptor = "clothing and basic equipment for a Chef" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/clothing/suit/storage/chef(src) - new /obj/item/clothing/head/chefhat(src) - new /obj/item/device/radio/headset(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/chef(src) - -/obj/item/wardrobe/hydro - name = "\improper Botanist Wardrobe" - descriptor = "clothing and basic equipment for a Botanist" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/analyzer/plant_analyzer(src) - new /obj/item/clothing/suit/storage/apron(src) - new /obj/item/clothing/gloves/botanic_leather(src) - new /obj/item/device/radio/headset(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/hydroponics(src) - -/obj/item/wardrobe/qm - name = "\improper Quartermaster Wardrobe" - descriptor = "clothing and basic equipment for a Quartermaster" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/pda/quartermaster(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/device/radio/headset/heads/qm(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/under/rank/cargo(src) - -/obj/item/wardrobe/cargo_tech - name = "\improper Cargo Technician Wardrobe" - descriptor = "clothing and basic equipment for a Cargo Technician" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/quartermaster(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/gloves/fingerless/black(src) - -/obj/item/wardrobe/mining - name = "\improper Shaft Miner Wardrobe" - descriptor = "clothing and basic equipment for a Shaft Miner" - - New() - ..() - var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/analyzer(src) - new /obj/item/weapon/satchel(src) - new /obj/item/device/flashlight/lantern(src) - new /obj/item/weapon/shovel(src) - new /obj/item/weapon/pickaxe(src) - new /obj/item/weapon/crowbar(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/device/radio/headset/headset_mine(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/gloves/fingerless/black(src) - -/obj/item/wardrobe/janitor - name = "\improper Janitor Wardrobe" - descriptor = "clothing and basic equipment for a Janitor" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/janitor(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/rank/janitor(src) - new /obj/item/device/portalathe(src) - -/obj/item/wardrobe/librarian - name = "\improper Librarian Wardrobe" - descriptor = "clothing and basic equipment for a Librarian" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/weapon/barcodescanner(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/under/suit_jacket/red(src) - -/obj/item/wardrobe/lawyer - name = "\improper Lawyer Wardrobe" - descriptor = "clothing and basic equipment for a Lawyer" - - New() - ..() - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/box(BPK) - new /obj/item/weapon/pen(src) - new /obj/item/device/pda/lawyer(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/weapon/storage/briefcase(src) - new /obj/item/clothing/shoes/brown(src) - if(prob(50)) - new /obj/item/clothing/under/lawyer/bluesuit(src) - new /obj/item/clothing/suit/storage/lawyer/bluejacket(src) - else - new /obj/item/clothing/under/lawyer/purpsuit(src) - new /obj/item/clothing/suit/storage/lawyer/purpjacket(src) - - diff --git a/code/WorkInProgress/Susan/susan_desert_turfs.dm b/code/WorkInProgress/Susan/susan_desert_turfs.dm deleted file mode 100644 index a52f90a4bc..0000000000 --- a/code/WorkInProgress/Susan/susan_desert_turfs.dm +++ /dev/null @@ -1,467 +0,0 @@ -//this is everything i'm going to be using in my outpost zeta map, and possibly future maps. - -turf/unsimulated/desert - name = "desert" - icon = 'code/WorkInProgress/Susan/desert.dmi' - icon_state = "desert" - temperature = 393.15 - luminosity = 5 - lighting_lumcount = 8 - -turf/unsimulated/desert/New() - icon_state = "desert[rand(0,4)]" - -turf/simulated/wall/impassable_rock - name = "Mountain Wall" - - //so that you can see the impassable sections in the map editor - icon_state = "riveted" - New() - icon_state = "rock" - -/area/awaymission/labs/researchdivision - name = "Research" - icon_state = "away3" - -/area/awaymission/labs/militarydivision - name = "Military" - icon_state = "away2" - -/area/awaymission/labs/gateway - name = "Gateway" - icon_state = "away1" - -/area/awaymission/labs/command - name = "Command" - icon_state = "away" - -/area/awaymission/labs/civilian - name = "Civilian" - icon_state = "away3" - -/area/awaymission/labs/cargo - name = "Cargo" - icon_state = "away2" - -/area/awaymission/labs/medical - name = "Medical" - icon_state = "away1" - -/area/awaymission/labs/security - name = "Security" - icon_state = "away" - -/area/awaymission/labs/solars - name = "Solars" - icon_state = "away3" - -/area/awaymission/labs/cave - name = "Caves" - icon_state = "away2" - -//corpses and possibly other decorative items - -/obj/effect/landmark/corpse/alien - mutantrace = "lizard" - -/obj/effect/landmark/corpse/alien/cargo - name = "Cargo Technician" - corpseuniform = /obj/item/clothing/under/rank/cargo - corpseradio = /obj/item/device/radio/headset/headset_cargo - corpseid = 1 - corpseidjob = "Cargo Technician" - corpseidaccess = "Quartermaster" - -/obj/effect/landmark/corpse/alien/laborer - name = "Laborer" - corpseuniform = /obj/item/clothing/under/overalls - corpseradio = /obj/item/device/radio/headset/headset_eng - corpseback = /obj/item/weapon/storage/backpack/industrial - corpsebelt = /obj/item/weapon/storage/belt/utility/full - corpsehelmet = /obj/item/clothing/head/hardhat - corpseid = 1 - corpseidjob = "Laborer" - corpseidaccess = "Engineer" - -/obj/effect/landmark/corpse/alien/testsubject - name = "Unfortunate Test Subject" - corpseuniform = /obj/item/clothing/under/color/white - corpseid = 0 - -/obj/effect/landmark/corpse/overseer - name = "Overseer" - corpseuniform = /obj/item/clothing/under/rank/navyhead_of_security - corpsesuit = /obj/item/clothing/suit/armor/hosnavycoat - corpseradio = /obj/item/device/radio/headset/heads/captain - corpsegloves = /obj/item/clothing/gloves/black/hos - corpseshoes = /obj/item/clothing/shoes/swat - corpsehelmet = /obj/item/clothing/head/beret/navyhos - corpseglasses = /obj/item/clothing/glasses/eyepatch - corpseid = 1 - corpseidjob = "Facility Overseer" - corpseidaccess = "Captain" - -/obj/effect/landmark/corpse/officer - name = "Security Officer" - corpseuniform = /obj/item/clothing/under/rank/navysecurity - corpsesuit = /obj/item/clothing/suit/armor/navysecvest - corpseradio = /obj/item/device/radio/headset/headset_sec - corpseshoes = /obj/item/clothing/shoes/swat - corpsehelmet = /obj/item/clothing/head/beret/navysec - corpseid = 1 - corpseidjob = "Security Officer" - corpseidaccess = "Security Officer" - -/* - * Weeds - */ -#define NODERANGE 1 - -/obj/effect/alien/flesh/weeds - name = "Fleshy Growth" - desc = "A pulsating grouping of odd, alien tissues. It's almost like it has a heartbeat..." - icon = 'code/WorkInProgress/Susan/biocraps.dmi' - icon_state = "flesh" - - anchored = 1 - density = 0 - var/health = 15 - var/obj/effect/alien/weeds/node/linked_node = null - -/obj/effect/alien/flesh/weeds/node - icon_state = "fleshnode" - icon = 'code/WorkInProgress/Susan/biocraps.dmi' - name = "Throbbing Pustule" - desc = "A grotquese, oozing, pimple-like growth. You swear you can see something moving around in the bulb..." - luminosity = NODERANGE - var/node_range = NODERANGE - -/obj/effect/alien/flesh/weeds/node/New() - ..(src.loc, src) - - -/obj/effect/alien/flesh/weeds/New(pos, node) - ..() - linked_node = node - if(istype(loc, /turf/space)) - del(src) - return - if(icon_state == "flesh")icon_state = pick("flesh", "flesh1", "flesh2") - spawn(rand(150, 200)) - if(src) - Life() - return - -/obj/effect/alien/flesh/weeds/proc/Life() - set background = 1 - var/turf/U = get_turf(src) -/* - if (locate(/obj/movable, U)) - U = locate(/obj/movable, U) - if(U.density == 1) - del(src) - return - -Alien plants should do something if theres a lot of poison - if(U.poison> 200000) - health -= round(U.poison/200000) - update() - return -*/ - if (istype(U, /turf/space)) - del(src) - return - - direction_loop: - for(var/dirn in cardinal) - var/turf/T = get_step(src, dirn) - - if (!istype(T) || T.density || locate(/obj/effect/alien/flesh/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space)) - continue - - if(!linked_node || get_dist(linked_node, src) > linked_node.node_range) - return - - // if (locate(/obj/movable, T)) // don't propogate into movables - // continue - - for(var/obj/O in T) - if(O.density) - continue direction_loop - - new /obj/effect/alien/flesh/weeds(T, linked_node) - - -/obj/effect/alien/flesh/weeds/ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(2.0) - if (prob(50)) - del(src) - if(3.0) - if (prob(5)) - del(src) - return - -/obj/effect/alien/flesh/weeds/attackby(var/obj/item/weapon/W, var/mob/user) - if(W.attack_verb.len) - visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(loc, 'sound/items/Welder.ogg', 100, 1) - - health -= damage - healthcheck() - -/obj/effect/alien/flesh/weeds/proc/healthcheck() - if(health <= 0) - del(src) - - -/obj/effect/alien/flesh/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - health -= 5 - healthcheck() - -/*/obj/effect/alien/weeds/burn(fi_amount) - if (fi_amount > 18000) - spawn( 0 ) - del(src) - return - return 0 - return 1 -*/ - -#undef NODERANGE - -//clothing, weapons, and other items that can be worn or used in some way - -/obj/item/clothing/under/rank/navywarden - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the word \"Warden\" written on the shoulders." - name = "warden's jumpsuit" - icon_state = "wardendnavyclothes" - item_state = "wardendnavyclothes" - item_color = "wardendnavyclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS - -/obj/item/clothing/under/rank/navysecurity - name = "security officer's jumpsuit" - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." - icon_state = "officerdnavyclothes" - item_state = "officerdnavyclothes" - item_color = "officerdnavyclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS - -/obj/item/clothing/under/rank/navyhead_of_security - desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer." - name = "head of security's jumpsuit" - icon_state = "hosdnavyclothes" - item_state = "hosdnavyclothes" - item_color = "hosdnavyclothes" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS - -/obj/item/clothing/suit/armor/hosnavycoat - name = "armored coat" - desc = "A coat enchanced with a special alloy for some protection and style." - icon_state = "hosdnavyjacket" - item_state = "armor" - armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) - -/obj/item/clothing/head/beret/navysec - name = "security beret" - desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety." - icon_state = "officerberet" - flags = FPRINT | TABLEPASS - -/obj/item/clothing/head/beret/navywarden - name = "warden's beret" - desc = "A beret with a two-colored security insignia emblazoned on it. For wardens that are more inclined towards style than safety." - icon_state = "wardenberet" - flags = FPRINT | TABLEPASS - -/obj/item/clothing/head/beret/navyhos - name = "security head's beret" - desc = "A stylish beret bearing a golden insignia that proudly displays the security coat of arms. A commander's must-have." - icon_state = "hosberet" - flags = FPRINT | TABLEPASS - -/obj/item/clothing/suit/armor/navysecvest - name = "armored coat" - desc = "An armored coat that protects against some damage." - icon_state = "officerdnavyjacket" - item_state = "armor" - flags = FPRINT | TABLEPASS - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) - -/obj/item/clothing/suit/armor/navywardenvest - name = "Warden's jacket" - desc = "An armoured jacket with silver rank pips and livery." - icon_state = "wardendnavyjacket" - item_state = "armor" - flags = FPRINT | TABLEPASS - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) - -//hostile entities or npcs - -/obj/item/projectile/slimeglob - icon = 'icons/obj/projectiles.dmi' - icon_state = "toxin" - damage = 20 - damage_type = BRUTE - -/obj/effect/critter/fleshmonster - name = "Fleshy Horror" - desc = "A grotesque, shambling fleshy horror... was this once a... a person?" - icon = 'icons/mob/mob.dmi' - icon_state = "horror" -/* - health = 120 - max_health = 120 - aggressive = 1 - defensive = 1 - wanderer = 1 - opensdoors = 1 - atkcarbon = 1 - atksilicon = 1 - atkcritter = 1 - atksame = 0 - atkmech = 1 - firevuln = 0.5 - brutevuln = 1 - seekrange = 25 - armor = 15 - melee_damage_lower = 12 - melee_damage_upper = 17 - angertext = "shambles" - attacktext = "slashes" - var/ranged = 0 - var/rapid = 0 - proc - Shoot(var/target, var/start, var/user, var/bullet = 0) - OpenFire(var/thing)//bluh ill rename this later or somethin - - - Die() - if (!src.alive) return - src.alive = 0 - walk_to(src,0) - src.visible_message("[src] disintegrates into mush!") - playsound(loc, 'sound/voice/hiss6.ogg', 80, 1, 1) - var/turf/Ts = get_turf(src) - new /obj/effect/decal/cleanable/blood(Ts) - del(src) - - seek_target() - src.anchored = 0 - var/T = null - for(var/mob/living/C in view(src.seekrange,src))//TODO: mess with this - if (src.target) - src.task = "chasing" - break - if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue - if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue - if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue - if(C.health < 0) continue - if(istype(C, /mob/living/carbon/) && src.atkcarbon) - if(C:mind) - if(C:mind:special_role == "H.I.V.E") - continue - src.attack = 1 - if(istype(C, /mob/living/silicon/) && src.atksilicon) - if(C:mind) - if(C:mind:special_role == "H.I.V.E") - continue - src.attack = 1 - if(src.attack) - T = C - break - - if(!src.attack) - for(var/obj/effect/critter/C in view(src.seekrange,src)) - if(istype(C, /obj/effect/critter) && !src.atkcritter) continue - if(C.health <= 0) continue - if(istype(C, /obj/effect/critter) && src.atkcritter) - if((istype(C, /obj/effect/critter/hivebot) && !src.atksame) || (C == src)) continue - T = C - break - - for(var/obj/mecha/M in view(src.seekrange,src)) - if(istype(M, /obj/mecha) && !src.atkmech) continue - if(M.health <= 0) continue - if(istype(M, /obj/mecha) && src.atkmech) src.attack = 1 - if(src.attack) - T = M - break - - if(src.attack) - src.target = T - src.oldtarget_name = T:name - if(src.ranged) - OpenFire(T) - return - src.task = "chasing" - return - - - OpenFire(var/thing) - src.target = thing - src.oldtarget_name = thing:name - for(var/mob/O in viewers(src, null)) - O.show_message("\red [src] spits a glob at [src.target]!", 1) - - var/tturf = get_turf(target) - if(rapid) - spawn(1) - Shoot(tturf, src.loc, src) - spawn(4) - Shoot(tturf, src.loc, src) - spawn(6) - Shoot(tturf, src.loc, src) - else - Shoot(tturf, src.loc, src) - - src.attack = 0 - sleep(12) - seek_target() - src.task = "thinking" - return - - - Shoot(var/target, var/start, var/user, var/bullet = 0) - if(target == start) - return - - var/obj/item/projectile/slimeglob/A = new /obj/item/projectile/slimeglob(user:loc) - playsound(user, 'sound/weapons/bite.ogg', 100, 1) - - if(!A) return - - if (!istype(target, /turf)) - del(A) - return - A.current = target - A.yo = target:y - start:y - A.xo = target:x - start:x - spawn( 0 ) - A.process() - return -*/ - -obj/effect/critter/fleshmonster/fleshslime - name = "Flesh Slime" - icon = 'code/WorkInProgress/Susan/biocraps.dmi' - icon_state = "livingflesh" - desc = "A creature that appears to be made out of living tissue strewn together haphazardly. Some kind of liquid bubbles from its maw." - //ranged = 1 \ No newline at end of file diff --git a/code/WorkInProgress/Tastyfish/Eliza.dm b/code/WorkInProgress/Tastyfish/Eliza.dm deleted file mode 100644 index 6fc0e2e356..0000000000 --- a/code/WorkInProgress/Tastyfish/Eliza.dm +++ /dev/null @@ -1,152 +0,0 @@ -// Contains: -// /datum/text_parser/parser/eliza -// /datum/text_parser/keyword - -/datum/text_parser/parser/eliza - //var/datum/text_parser/reply/replies[] // R(X) 36 - var/prev_reply = "" // previous reply - var/username = "" - var/callsign = "" - var/yesno_state = "" - var/yesno_param = "" - -/datum/text_parser/parser/eliza/new_session() - ..() - for(var/datum/text_parser/keyword/key in keywords) - key.eliza = src - - prev_reply = "" - username = "" - yesno_state = "" - yesno_param = "" - print("Hi! I'm [callsign], how are you doing? You can talk to me by beginning your statements with \"[callsign],\"") - -/datum/text_parser/parser/eliza/process_line() - ..() - // pad so we can detect initial and final words correctly - input_line = " " + src.input_line + " " - // remove apostrophes - for(var/i = -1, i != 0, i = findtext(input_line, "'")) - if(i == -1) - continue - input_line = copytext(input_line, 1, i) + copytext(input_line, i + 1, 0) - - // did user insult us? (i don't really want cursing in the source code, - // so keep it the simple original check from the 70's code :p) - if(findtext(input_line, "shut")) - // sssh - return - - if(input_line == prev_reply) - print("Please don't repeat yourself!") - - // find a keyword - var/keyphrase = "" - var/datum/text_parser/keyword/keyword // the actual keyword - var/keypos = 0 // pos of keyword so we can grab extra text after it - - for(var/i = 1, i <= keywords.len, i++) - keyword = keywords[i] - for(var/j = 1, j <= keyword.phrases.len, j++) - keypos = findtext(input_line, " " + keyword.phrases[j]) - if(keypos != 0) - // found it! - keyphrase = keyword.phrases[j] - break - if(keyphrase != "") - break - - //world << "keyphrase: " + keyphrase + " " + num2text(keypos) - - var/conjugated = "" - // was it not recognized? then make it nokeyfound - if(keyphrase == "") - keyword = keywords[keywords.len] // nokeyfound - else - // otherwise, business as usual - - // let's conjugate this mess - conjugated = copytext(input_line, 1 + keypos + lentext(keyphrase)) - - // go ahead and strip punctuation - if(lentext(conjugated) > 0 && copytext(conjugated, lentext(conjugated)) == " ") - conjugated = copytext(conjugated, 1, lentext(conjugated)) - if(lentext(conjugated) > 0) - var/final_punc = copytext(conjugated, lentext(conjugated)) - if(final_punc == "." || final_punc == "?" || final_punc == "!") - conjugated = copytext(conjugated, 1, lentext(conjugated)) - - conjugated += " " - - if(keyword.conjugate) - // now run through conjugation pairs - for(var/i = 1, i <= lentext(conjugated), i++) - for(var/x = 1, x <= conjugs.len, x += 2) - var/cx = conjugs[x] - var/cxa = conjugs[x + 1] - if(i + lentext(cx) <= lentext(conjugated) + 1 && cmptext(cx, copytext(conjugated, i, i + lentext(cx)))) - // world << cx - - conjugated = copytext(conjugated, 1, i) + cxa + copytext(conjugated, i + lentext(cx)) - i = i + lentext(cx) - // don't count right padding - if(copytext(cx, lentext(cx)) == " ") - i-- - break - else if(i + lentext(cxa) <= lentext(conjugated) + 1 && cmptext(cxa, copytext(conjugated, i, i + lentext(cxa)))) - // world << cxa - - conjugated = copytext(conjugated, 1, i) + cx + copytext(conjugated, i + lentext(cxa)) - i = i + lentext(cxa) - // don't count right padding - if(copytext(cxa, lentext(cxa)) == " ") - i-- - break - - conjugated = copytext(conjugated, 1, lentext(conjugated)) - - //world << "Conj: " + conjugated - - // now actually get a reply - var/reply = keyword.process(conjugated) - print(reply) - - prev_reply = reply - -/datum/text_parser/keyword - var/list/phrases = new() - var/list/replies = new() - var/datum/text_parser/parser/eliza/eliza - var/conjugate = 1 - - New(p, r) - phrases = p - replies = r - - proc/process(object) - eliza.yesno_state = "" - eliza.yesno_param = "" - var/reply = pick(replies) - if(copytext(reply, lentext(reply)) == "*") - // add object of statement (hopefully not actually mess :p) - if(object == "") - object = pick(generic_objects) - // possibly add name or just ? - if(eliza.username != "" && rand(3) == 0) - object += ", " + eliza.username - return copytext(reply, 1, lentext(reply)) + object + "?" - else - // get punct - var/final_punc = "" - if(lentext(reply) > 0) - final_punc = copytext(reply, lentext(reply)) - if(final_punc == "." || final_punc == "?" || final_punc == "!") - reply = copytext(reply, 1, lentext(reply)) - else - final_punc = "" - - // possibly add name or just ?/./! - if(eliza.username != "" && rand(2) == 0) - reply += ", " + eliza.username - - return reply + final_punc diff --git a/code/WorkInProgress/Tastyfish/Eliza_Data.dm b/code/WorkInProgress/Tastyfish/Eliza_Data.dm deleted file mode 100644 index 1535e99292..0000000000 --- a/code/WorkInProgress/Tastyfish/Eliza_Data.dm +++ /dev/null @@ -1,435 +0,0 @@ -// Contains: -// Implementation-specific data for /datum/text_parser/parser/eliza - -/datum/text_parser/keyword - // if we have a * reply, but no object from the user - var/list/generic_objects = list( - " what", " something", "...") - - var/list/object_leaders = list( - " is ", "'s ") - -/datum/text_parser/parser/eliza - - // conjugation data - var/list/conjugs = list( - " are ", " am ", " were ", " was ", " you ", " me ", " you ", " i " , " your ", " my ", - " ive ", " youve ", " Im ", " youre ") - - // keywords / replies - var/list/keywords = list( - new/datum/text_parser/keyword/tell( // NT-like - list("tell"), - list( - "Told *")), - new/datum/text_parser/keyword( - list("can you"), - list( - "Dont you believe that I can*", - "Perhaps you would like to be able to*", - "You want me to be able to*")), - new/datum/text_parser/keyword( - list("can i"), - list( - "Perhaps you don't want to*", - "Do you want to be able to*")), - new/datum/text_parser/keyword( - list("you are", "youre"), - list( - "What makes you think I am*", - "Does it please you to believe that I am*", - "Perhaps you would like to be*", - "Do you sometimes wish you were*")), - new/datum/text_parser/keyword( - list("i dont"), - list( - "Don't you really*", - "Why don't you*", - "Do you wish to be able to*", - "Does that trouble you?")), - new/datum/text_parser/keyword( - list("i feel"), - list( - "Tell me more about such feelings.", - "Do you often feel*", - "Do you enjoy feeling*")), - new/datum/text_parser/keyword( - list("why dont you"), - list( - "Do you really believe I don't*", - "Perhaps in good time I will*", - "Do you want me to*")), - new/datum/text_parser/keyword( - list("why cant i"), - list( - "Do you think you should be able to*", - "Why can't you*")), - new/datum/text_parser/keyword( - list("are you"), - list( - "Why are you interested in whether or not I am*", - "Would you prefer if I were not*", - "Perhaps in your fantasies I am*")), - new/datum/text_parser/keyword( - list("i cant"), - list( - "How do you know I can't*", - "Have you tried?", - "Perhaps you can now*")), - new/datum/text_parser/keyword/setparam/username( - list("my name", "im called", "am called", "call me"), - list( - "Your name is *", - "You call yourself *", - "You're called *")), - new/datum/text_parser/keyword/setparam/callsign( - list("your name", "call yourself"), - list( - "My name is *", - "I call myself *", - "I'm called *")), - new/datum/text_parser/keyword( - list("i am", "im"), - list( - "Did you come to me because you are*", - "How long have you been*", - "Do you believe it is normal to be*", - "Do you enjoy being*")), - new/datum/text_parser/keyword( - list("thanks", "thank you"), - list( - "You're welcome.", - "No problem.", - "Thank you!")), - new/datum/text_parser/keyword( - list("you"), - list( - "We were discussing you - not me.", - "Oh, I*", - "You're not really talking about me, are you?")), - new/datum/text_parser/keyword( - list("i want","i like"), - list( - "What would it mean if you got*", - "Why do you want*", - "Suppose you got*", - "What if you never got*", - "I sometimes also want*")), - new/datum/text_parser/keyword( - list("what", "how", "who", "where", "when", "why"), - list( - "Why do you ask?", - "Does that question interest you?", - "What answer would please you the most?", - "What do you think?", - "Are such questions on your mind often?", - "What is it you really want to know?", - "Have you asked anyone else?", - "Have you asked such questions before?", - "What else comes to mind when you ask that?")), - new/datum/text_parser/keyword/paramlist/pick( // NT-like - list("pick","choose"), - list( - "I choose... *", - "I prefer *", - "My favorite is *")), - new/datum/text_parser/keyword( - list("name"), - list( - "Names don't interest me.", - "I don't care about names. Go on.")), - new/datum/text_parser/keyword( - list("cause"), - list( - "Is that a real reason?", - "Don't any other reasons come to mind?", - "Does that reason explain anything else?", - "What other reason might there be?")), - new/datum/text_parser/keyword( - list("sorry"), - list( - "Please don't apologize.", - "Apologies are not necessary.", - "What feelings do you get when you apologize?", - "Don't be so defensive!")), - new/datum/text_parser/keyword( - list("dream"), - list( - "What does that dream suggest to you?", - "Do you dream often?", - "What persons are in your dreams?", - "Are you disturbed by your dreams?")), - new/datum/text_parser/keyword( - list("hello", "hi", "yo", "hiya"), - list( - "How do you do... Please state your name and problem.")), - new/datum/text_parser/keyword( - list("go away", "bye"), - list( - "Good bye. I hope to have another session with you soon.")), - new/datum/text_parser/keyword( - list("maybe", "sometimes", "probably", "mostly", "most of the time"), - list( - "You don't seem quite certain.", - "Why the uncertain tone?", - "Can't you be more positive?", - "You aren't sure?", - "Don't you know?")), - new/datum/text_parser/keyword/no( - list("no", "nope", "nah"), - list( - "Are you saying that just to be negative?", - "You are being a bit negative.", - "Why not?", - "Are you sure?", - "Why no?")), - new/datum/text_parser/keyword( - list("your"), - list( - "Why are you concerned about my*", - "What about your own*")), - new/datum/text_parser/keyword( - list("always"), - list( - "Can you think of a specific example?", - "When?", - "What are you thinking of?", - "Really, always?")), - new/datum/text_parser/keyword( - list("think"), - list( - "Do you really think so?", - "But you're not sure you*", - "Do you doubt you*")), - new/datum/text_parser/keyword( - list("alike"), - list( - "In what way?", - "What resemblence do you see?", - "What does the similarity suggest to you?", - "What other connections do you see?", - "Count there really be some connection?", - "How?", - "You seem quite positive.")), - new/datum/text_parser/keyword/yes( - list("yes", "yep", "yeah", "indeed"), - list( - "Are you sure?", - "I see.", - "I understand.")), - new/datum/text_parser/keyword( - list("friend"), - list( - "Why do you bring up the topic of friends?", - "Why do your friends worry you?", - "Do your friends pick on you?", - "Are you sure you have any friends?", - "Do you impose on your friends?", - "Perhaps your love for friends worries you?")), - new/datum/text_parser/keyword( - list("computer", "bot", "ai"), - list( - "Do computers worry you?", - "Are you talking about me in particular?", - "Are you frightened by machines?", - "Why do your mention computers?", - "What do you think computers have to do with your problem?", - "Don't you think computers can help people?", - "What is it about machines that worries you?")), - new/datum/text_parser/keyword( - list("murder", "death", "kill", "dead", "destroy", "traitor", "synd"), - list( - "Well, that's rather morbid.", - "Do you think that caused a trauma with you?", - "Have you ever previously spoken to anybody about this?")), - new/datum/text_parser/keyword( - list("bomb", "explosive", "toxin", "phoron"), - list( - "Do you worry about bombs often?", - "Do you work in science?", - "Do you find it odd to worry about bombs on a science research vessel?")), - new/datum/text_parser/keyword( - list("work", "job", "head", "staff", "transen"), - list( - "Do you like working here?", - "What are your feelings on working here?")), - new/datum/text_parser/keyword( - list("nokeyfound"), - list( - "Say, do you have any psychological problems?", - "What does that suggest to you?", - "I see.", - "I'm not sure I understand you fully.", - "Come elucidate on your thoughts.", - "Can you elaborate on that?", - "That is quite interesting."))) - -/datum/text_parser/keyword/setparam - proc/param(object) - - // drop leading parts - for(var/leader in object_leaders) - var/i = findtext(object, leader) - if(i) - object = copytext(object, i + lentext(leader)) - break - - // trim spaces - object = trim(object) - - // trim punctuation - if(lentext(object) > 0) - var/final_punc = copytext(object, lentext(object)) - if(final_punc == "." || final_punc == "?" || final_punc == "!") - object = copytext(object, 1, lentext(object)) - - return object - -/datum/text_parser/keyword/paramlist - proc/param(object) - // drop leading parts - for(var/leader in object_leaders) - var/i = findtext(object, leader) - if(i) - object = copytext(object, i + lentext(leader)) - break - - // trim spaces - object = trim(object) - - // trim punctuation - if(lentext(object) > 0) - var/final_punc = copytext(object, lentext(object)) - if(final_punc == "." || final_punc == "?" || final_punc == "!") - object = copytext(object, 1, lentext(object)) - - return dd_text2list(object, ",") - -/datum/text_parser/keyword/setparam/username - process(object) - object = param(object) - - // handle name - if(eliza.username == "") - // new name - var/t = ..(object) - eliza.yesno_state = "username" - eliza.yesno_param = object - return t - else if(cmptext(eliza.username, object)) - // but wait! - return "You already told me your name was [eliza.username]." - else - eliza.yesno_state = "username" - eliza.yesno_param = object - return "But you previously told me your name was [eliza.username]. Are you sure you want to be called [object]?" - -/datum/text_parser/keyword/setparam/callsign - process(object) - object = param(object) - - // handle name - if(eliza.callsign == "") - // new name - var/t = ..(object) - eliza.yesno_state = "callsign" - eliza.yesno_param = object - return t - else if(cmptext(eliza.callsign, object)) - // but wait! - return "You already told me that I should answer to [eliza.callsign]." - else - eliza.yesno_state = "callsign" - eliza.yesno_param = object - return "But you previously told me my name was [eliza.callsign]. Are you sure you want me to be called [object]?" - -/datum/text_parser/keyword/paramlist/pick - process(object) - var/choice = pick(param(object)) - return ..(choice) - -/datum/text_parser/keyword/tell - conjugate = 0 - - process(object) - // get name & message - var/i = findtext(object, ",") - var/sl = 1 - if(!i || lentext(object) < i + sl) - return "Tell who that you what?" - - var/name = trim(copytext(object, 1, i)) - object = trim(copytext(object, i + sl)) - if(!lentext(name) || !lentext(object)) - return "Tell who that you what?" - - // find PDA - var/obj/item/device/pda/pda - for (var/obj/item/device/pda/P in world) - if (!P.owner) - continue - else if (P.toff) - continue - - if(!cmptext(name, P.owner)) - continue - - pda = P - - if(!pda || pda.toff) - return "I couldn't find [name]'s PDA." - - // send message - if(!istype(eliza.speaker.loc.loc, /obj/item/device/pda))//Looking if we are in a PDA - pda.tnote += "← From [eliza.callsign]:
[object]
" - - if(prob(15) && eliza.speaker) //Give the AI a chance of intercepting the message - var/who = eliza.speaker - if(prob(50)) - who = "[eliza.speaker:master] via [eliza.speaker]" - for(var/mob/living/silicon/ai/ai in world) - ai.show_message("Intercepted message from [who]: [object]") - - if (!pda.silent) - playsound(pda.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, pda.loc)) - O.show_message(text("\icon[pda] *[pda.ttone]*")) - - pda.overlays = null - pda.overlays += image('icons/obj/pda.dmi', "pda-r") - else - var/list/href_list = list() - href_list["src"] = "\ref[eliza.speaker.loc.loc]" - href_list["choice"] = "Message" - href_list["target"] = "\ref[pda]" - href_list["pAI_mess"] = "\"[object]\" \[Via pAI Unit\]" - var/obj/item/device/pda/pda_im_in = eliza.speaker.loc.loc - pda_im_in.Topic("src=\ref[eliza.speaker.loc.loc];choice=Message;target=\ref[pda];pAI_mess=\"[object] \[Via pAI Unit\]",href_list) - return "Told [name], [object]." - -/datum/text_parser/keyword/yes - process(object) - var/reply - switch(eliza.yesno_state) - if("username") - eliza.username = eliza.yesno_param - reply = pick( - "[eliza.username] - that's a nice name.", - "Hello, [eliza.username]!", - "You sound nice.") - if("callsign") - eliza.callsign = eliza.yesno_param - eliza.set_name(eliza.callsign) - reply = pick( - "Oh, alright...", - "[eliza.callsign]... I like that.", - "OK!") - else - return ..(object) - eliza.yesno_state = "" - eliza.yesno_param = "" - return reply - -/datum/text_parser/keyword/no - process(object) - return ..(object) diff --git a/code/WorkInProgress/Tastyfish/Parser.dm b/code/WorkInProgress/Tastyfish/Parser.dm deleted file mode 100644 index 0db2a261ca..0000000000 --- a/code/WorkInProgress/Tastyfish/Parser.dm +++ /dev/null @@ -1,18 +0,0 @@ -// Contains: -// /datum/text_parser/parser - -/datum/text_parser/parser - var/input_line = "" - var/mob/speaker - -/datum/text_parser/parser/proc/print(line) - speaker.say(line) - -/datum/text_parser/parser/proc/set_name(name) - speaker.name = name - speaker.real_name = name - -/datum/text_parser/parser/proc/new_session() - input_line = "" - -/datum/text_parser/parser/proc/process_line() diff --git a/code/WorkInProgress/Tastyfish/livestock.dm b/code/WorkInProgress/Tastyfish/livestock.dm deleted file mode 100644 index 0befcb4c61..0000000000 --- a/code/WorkInProgress/Tastyfish/livestock.dm +++ /dev/null @@ -1,190 +0,0 @@ -// Base Class -/mob/living/simple_animal/livestock - desc = "Tasty!" - icon = 'icons/mob/livestock.dmi' - emote_see = list("shakes its head", "kicks the ground") - speak_chance = 1 - turns_per_move = 15 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - var/max_nutrition = 100 // different animals get hungry faster, basically number of 5-second steps from full to starving (60 == 5 minutes) - var/nutrition_step // cycle step in nutrition system - var/obj/movement_target // eating-ing target - - New() - if(!nutrition) - nutrition = max_nutrition * 0.33 // at 1/3 nutrition - - reagents = new() - reagents.my_atom = src - - Life() - ..() - - if(stat != DEAD) - meat_amount = round(nutrition / 50) - - nutrition_step-- - if(nutrition_step <= 0) - // handle animal digesting - if(nutrition > 0) - nutrition-- - else - health-- - nutrition_step = 50 // only tick this every 5 seconds - - // handle animal eating (borrowed from Ian code) - - // not hungry if full - if(nutrition >= max_nutrition) - return - - if((movement_target) && !(isturf(movement_target.loc))) - movement_target = null - a_intent = "help" - turns_per_move = initial(turns_per_move) - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) - movement_target = null - a_intent = "help" - turns_per_move = initial(turns_per_move) - for(var/obj/item/weapon/reagent_containers/food/snacks/S in oview(src,3)) - if(isturf(S.loc) || ishuman(S.loc)) - movement_target = S - break - if(movement_target) - stop_automated_movement = 1 - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - - if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds - if (movement_target.loc.x < src.x) - set_dir(WEST) - else if (movement_target.loc.x > src.x) - set_dir(EAST) - else if (movement_target.loc.y < src.y) - set_dir(SOUTH) - else if (movement_target.loc.y > src.y) - set_dir(NORTH) - else - set_dir(SOUTH) - - if(isturf(movement_target.loc)) - movement_target.attack_animal(src) - if(istype(movement_target, /obj/item/weapon/reagent_containers/food/snacks)) - var/obj/item/I = movement_target - I.attack(src, src, "mouth") // eat it, if it's food - - if(a_intent == "hurt") // to make raging critter harm, then disarm, then stop - a_intent = "disarm" - else if(a_intent == "disarm") - a_intent = "help" - movement_target = null - turns_per_move = initial(turns_per_move) - else if(ishuman(movement_target.loc)) - if(prob(20)) - emote("stares at the [movement_target] that [movement_target.loc] has with a longing expression.") - - proc/rage_at(mob/living/M) - movement_target = M // pretty simple - turns_per_move = 1 - emote("becomes enraged") - a_intent = "hurt" - - attackby(var/obj/item/O as obj, var/mob/user as mob) - if(nutrition < max_nutrition && istype(O,/obj/item/weapon/reagent_containers/food/snacks)) - O.attack_animal(src) - else - ..(O, user) - -// Cow -/mob/living/simple_animal/livestock/cow - name = "\improper Cow" - icon_state = "cow" - icon_living = "cow" - icon_dead = "cow_d" - meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/cow - meat_amount = 10 - max_nutrition = 1000 - speak = list("Moo.","Moooo!","Snort.") - speak_emote = list("moos") - emote_hear = list("moos", "snorts") - - attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/weapon/reagent_containers/glass)) - var/datum/reagents/R = O:reagents - - R.add_reagent("milk", 50) - nutrition -= 50 - usr << "\blue You milk the cow." - else if(O.force > 0 && O.w_class >= 2) - rage_at(user) - else - ..(O, user) - - attack_hand(var/mob/user as mob) - ..() - if(user.a_intent == "hurt") - rage_at(user) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/cow - name = "Beef" - desc = "It's what's for dinner!" - -// Chicken -/mob/living/simple_animal/livestock/chicken - name = "\improper Chicken" - icon_state = "chick" - icon_living = "chick" - icon_dead = "chick_d" - meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/chicken - meat_amount = 3 - max_nutrition = 200 - speak = list("Bock bock!","Cl-cluck.","Click.") - speak_emote = list("bocks","clucks") - emote_hear = list("bocks", "clucks", "squawks") - -/mob/living/simple_animal/livestock/chicken/Life() - ..() - - // go right before cycle elapses, and if animal isn't starving - if(stat != DEAD && nutrition_step == 1 && nutrition > max_nutrition / 2) - // lay an egg with probability of 5% in 5 second time period - if(prob(33)) - new/obj/item/weapon/reagent_containers/food/snacks/egg(src.loc) // lay an egg - nutrition -= 25 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/chicken - name = "Chicken" - desc = "Tasty!" - -/obj/structure/closet/critter - desc = "\improper Critter crate." - name = "Critter Crate" - icon = 'icons/obj/storage.dmi' - icon_state = "critter" - density = 1 - icon_opened = "critteropen" - icon_closed = "critter" - -/datum/supply_packs/chicken - name = "\improper Chicken crate" - contains = list("/mob/living/simple_animal/livestock/chicken", - "/obj/item/weapon/reagent_containers/food/snacks/grown/corn") - cost = 10 - containertype = "/obj/structure/closet/critter" - containername = "Chicken crate" - //group = "Hydroponics" - -/datum/supply_packs/cow - name = "\improper Cow crate" - contains = list("/mob/living/simple_animal/livestock/cow", - "/obj/item/weapon/reagent_containers/food/snacks/grown/corn") - cost = 50 - containertype = "/obj/structure/closet/critter" - containername = "Cow crate" - //group = "Hydroponics" diff --git a/code/WorkInProgress/Tastyfish/paiLiza.dm b/code/WorkInProgress/Tastyfish/paiLiza.dm deleted file mode 100644 index 7cd9a03446..0000000000 --- a/code/WorkInProgress/Tastyfish/paiLiza.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/paiCandidate/chatbot - name = "NT Standard Chatbot" - description = "NT Standard Issue pAI Unit 13A" - role = "Advisor" - comments = "This is an actual AI." - ready = 1 - -/mob/living/silicon/pai/chatbot - var/datum/text_parser/parser/eliza/P = new() - - proc/init() - P.speaker = src - P.callsign = input("What do you want to call me?", "Chatbot Name", "NT") as text - P.set_name(P.callsign) - P.new_session() - - proc/hear_talk(mob/M, text) - if(stat) - return - - var/prefix = P.callsign + "," - - if(lentext(text) <= lentext(prefix)) - return - var/i = lentext(prefix) + 1 - if(cmptext(copytext(text, 1, i), prefix)) - P.input_line = html_decode(copytext(text, i)) - P.process_line() diff --git a/code/WorkInProgress/Tastyfish/wallmount_frame.dm b/code/WorkInProgress/Tastyfish/wallmount_frame.dm deleted file mode 100644 index 28b6101a75..0000000000 --- a/code/WorkInProgress/Tastyfish/wallmount_frame.dm +++ /dev/null @@ -1,231 +0,0 @@ -// a frame for generic wall-mounted things, such as fire alarm, status display.. -// combination of apc_frame and machine_frame -/obj/machinery/constructable_frame/wallmount_frame - icon = 'icons/obj/stock_parts.dmi' - icon_state = "wm_0" - var/wall_offset = 24 - density = 0 - -/obj/machinery/constructable_frame/wallmount_frame/New() - spawn(1) - if (!istype(loc, /turf/simulated/floor)) - usr << "\red [name] cannot be placed on this spot." - new/obj/item/stack/sheet/metal(get_turf(src), 2) - del(src) - return - - var/turf/obj_ofs = get_step(locate(2,2,1), dir) - pixel_x = (obj_ofs.x - 2) * wall_offset - pixel_y = (obj_ofs.y - 2) * wall_offset - - var/turf/T = get_step(usr, dir) - if(!istype(T, /turf/simulated/wall)) - usr << "\red [name] must be placed on a wall." - new/obj/item/stack/sheet/metal(get_turf(src), 2) - del(src) - return - - set_dir(get_dir(T, loc)) - -/obj/machinery/constructable_frame/wallmount_frame/attackby(obj/item/P as obj, mob/user as mob) - if(P.crit_fail) - user << "\red This part is faulty, you cannot add this to the machine!" - return - switch(state) - if(1) - if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You start to add cables to the frame." - if(do_after(user, 20)) - P:amount -= 5 - if(!P:amount) del(P) - user << "\blue You add cables to the frame." - state = 2 - icon_state = "wm_1" - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "\blue You dismantle the frame" - new /obj/item/stack/sheet/metal(src.loc, 2) - del(src) - if(2) - if(istype(P, /obj/item/weapon/circuitboard)) - var/obj/item/weapon/circuitboard/B = P - if(B.board_type == "wallmount") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You add the circuit board to the frame." - circuit = P - user.drop_item() - P.loc = src - icon_state = "wm_2" - state = 3 - components = list() - req_components = circuit.req_components.Copy() - for(var/A in circuit.req_components) - req_components[A] = circuit.req_components[A] - req_component_names = circuit.req_components.Copy() - for(var/A in req_components) - var/cp = text2path(A) - var/obj/ct = new cp() // have to quickly instantiate it get name - req_component_names[A] = ct.name - if(circuit.frame_desc) - desc = circuit.frame_desc - else - update_desc() - user << desc - else - user << "\red This frame does not accept circuit boards of this type!" - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." - state = 1 - icon_state = "wm_0" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 - - if(3) - if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - state = 2 - circuit.loc = src.loc - circuit = null - if(components.len == 0) - user << "\blue You remove the circuit board." - else - user << "\blue You remove the circuit board and other components." - for(var/obj/item/weapon/W in components) - W.loc = src.loc - desc = initial(desc) - req_components = null - components = null - icon_state = "wm_1" - - if(istype(P, /obj/item/weapon/screwdriver)) - var/component_check = 1 - for(var/R in req_components) - if(req_components[R] > 0) - component_check = 0 - break - if(component_check) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/obj/machinery/new_machine = new src.circuit.build_path(src.loc) - new_machine.set_dir(dir) - if(istype(circuit, /obj/item/weapon/circuitboard/status_display)) - new_machine.pixel_x = pixel_x * 1.33 - new_machine.pixel_y = pixel_y * 1.33 - else - new_machine.pixel_x = pixel_x - new_machine.pixel_y = pixel_y - for(var/obj/O in new_machine.component_parts) - del(O) - new_machine.component_parts = list() - for(var/obj/O in src) - if(circuit.contain_parts) // things like disposal don't want their parts in them - O.loc = new_machine - else - O.loc = null - new_machine.component_parts += O - if(circuit.contain_parts) - circuit.loc = new_machine - else - circuit.loc = null - new_machine.RefreshParts() - del(src) - - if(istype(P, /obj/item/weapon)) - for(var/I in req_components) - if(istype(P, text2path(I)) && (req_components[I] > 0)) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CP = P - if(CP.amount > 1) - var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided - var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src) - CC.amount = camt - CC.update_icon() - CP.use(camt) - components += CC - req_components[I] -= camt - update_desc() - break - user.drop_item() - P.loc = src - components += P - req_components[I]-- - update_desc() - break - user << desc - if(P.loc != src && !istype(P, /obj/item/stack/cable_coil)) - user << "\red You cannot add that component to the machine!" - -/obj/item/weapon/circuitboard/firealarm - name = "Circuit board (Fire Alarm)" - build_path = "/obj/machinery/firealarm" - board_type = "wallmount" - origin_tech = "engineering=2" - frame_desc = "Requires 1 Scanning Module, 1 Capacitor, and 2 pieces of cable." - contain_parts = 0 - req_components = list( - "/obj/item/weapon/stock_parts/scanning_module" = 1, - "/obj/item/weapon/stock_parts/capacitor" = 1, - "/obj/item/stack/cable_coil" = 2) - -/obj/item/weapon/circuitboard/alarm - name = "Circuit board (Atmospheric Alarm)" - build_path = "/obj/machinery/alarm" - board_type = "wallmount" - origin_tech = "engineering=2;programming=2" - frame_desc = "Requires 1 Scanning Module, 1 Console Screen, and 2 pieces of cable." - contain_parts = 0 - req_components = list( - "/obj/item/weapon/stock_parts/scanning_module" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 2) - -/* oh right, not a machine :( -/obj/item/weapon/circuitboard/intercom - name = "Circuit board (Intercom)" - build_path = "/obj/item/device/radio/intercom" - board_type = "wallmount" - origin_tech = "engineering=2" - frame_desc = "Requires 1 Console Screen, and 2 piece of cable." - contain_parts = 0 - req_components = list( - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 2) -*/ - -/* too complex to set up the dept for an RC in a way intuitive for the user -/obj/item/weapon/circuitboard/requests_console - name = "Circuit board (Requests Console)" - build_path = "/obj/machinery/requests_console" - board_type = "wallmount" - origin_tech = "engineering=2;programming=2" - frame_desc = "Requires 1 radio, 1 Console Screen, and 1 piece of cable." - contain_parts = 0 - req_components = list( - "/obj/item/device/radio" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1 - "/obj/item/stack/cable_coil" = 1) -*/ - -/obj/item/weapon/circuitboard/status_display - name = "Circuit board (Status Display)" - build_path = "/obj/machinery/status_display" - board_type = "wallmount" - origin_tech = "engineering=2,programming=2" - frame_desc = "Requires 2 Console Screens, and 1 piece of cable." - contain_parts = 0 - req_components = list( - "/obj/item/weapon/stock_parts/console_screen" = 2, - "/obj/item/stack/cable_coil" = 1) - -/obj/item/weapon/circuitboard/light_switch - name = "Circuit board (Light Switch)" - build_path = "/obj/machinery/light_switch" - board_type = "wallmount" - origin_tech = "engineering=2" - frame_desc = "Requires 2 pieces of cable." - contain_parts = 0 - req_components = list( - "/obj/item/stack/cable_coil" = 2) diff --git a/code/WorkInProgress/animusstation/atm.dm b/code/WorkInProgress/animusstation/atm.dm deleted file mode 100644 index 1031c599f4..0000000000 --- a/code/WorkInProgress/animusstation/atm.dm +++ /dev/null @@ -1,176 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:06 - -/* - -TODO: -give money an actual use (QM stuff, vending machines) -send money to people (might be worth attaching money to custom database thing for this, instead of being in the ID) -log transactions - -*/ - -/obj/machinery/atm - name = "\improper NanoTrasen Automatic Teller Machine" - desc = "For all your monetary needs!" - icon = 'icons/obj/terminals.dmi' - icon_state = "atm" - anchored = 1 - use_power = 1 - idle_power_usage = 10 - var/obj/item/weapon/card/id/card - var/obj/item/weapon/spacecash/cashes = list() - var/inserted = 0 - var/accepted = 0 - var/pincode = 0 - - attackby(var/obj/A, var/mob/user) - if(istype(A,/obj/item/weapon/spacecash)) - cashes += A - user.drop_item() - A.loc = src - inserted += A:worth - return - if(istype(A,/obj/item/weapon/coin)) - if(istype(A,/obj/item/weapon/coin/iron)) - cashes += A - user.drop_item() - A.loc = src - inserted += 1 - return - if(istype(A,/obj/item/weapon/coin/silver)) - cashes += A - user.drop_item() - A.loc = src - inserted += 10 - return - if(istype(A,/obj/item/weapon/coin/gold)) - cashes += A - user.drop_item() - A.loc = src - inserted += 50 - return - if(istype(A,/obj/item/weapon/coin/phoron)) - cashes += A - user.drop_item() - A.loc = src - inserted += 2 - return - if(istype(A,/obj/item/weapon/coin/diamond)) - cashes += A - user.drop_item() - A.loc = src - inserted += 300 - return - user << "You insert your [A.name] in ATM" - ..() - - attack_hand(var/mob/user) - if(istype(user, /mob/living/silicon)) - user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." - return - - if(!(stat && NOPOWER) && ishuman(user)) - var/dat - user.machine = src - if(!accepted) - if(scan(user)) - pincode = input(usr,"Enter a pin-code") as num - if(card.checkaccess(pincode,usr)) - accepted = 1 -// usr << sound('nya.mp3') - else - dat = null - dat += "

NanoTrasen Automatic Teller Machine


" - dat += "For all your monetary needs!

" - dat += "Welcome, [card.registered_name]. You have [card.money] credits deposited.
" - dat += "Current inserted item value: [inserted] credits.

" - dat += "Please, select action
" - dat += "Withdraw Physical Credits
" - dat += "Eject Inserted Items
" - dat += "Convert Inserted Items to Credits
" - dat += "Lock ATM
" - user << browse(dat,"window=atm") - onclose(user,"close") - proc - withdraw(var/mob/user) - if(accepted) - var/amount = input("How much would you like to withdraw?", "Amount", 0) in list(1,10,20,50,100,200,500,1000, 0) - if(amount == 0) - return - if(card.money >= amount) - card.money -= amount - switch(amount) - if(1) - new /obj/item/weapon/spacecash(loc) - if(10) - new /obj/item/weapon/spacecash/c10(loc) - if(20) - new /obj/item/weapon/spacecash/c20(loc) - if(50) - new /obj/item/weapon/spacecash/c50(loc) - if(100) - new /obj/item/weapon/spacecash/c100(loc) - if(200) - new /obj/item/weapon/spacecash/c200(loc) - if(500) - new /obj/item/weapon/spacecash/c500(loc) - if(1000) - new /obj/item/weapon/spacecash/c1000(loc) - else - user << "\red Error: Insufficient funds." - return - - scan(var/mob/user) - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(H.wear_id) - if(istype(H.wear_id, /obj/item/weapon/card/id)) - card = H.wear_id - return 1 - if(istype(H.wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/P = H.wear_id - if(istype(P.id,/obj/item/weapon/card/id)) - card = P.id - return 1 - return 0 - return 0 - - insert() - if(accepted) - card.money += inserted - inserted = 0 - - Topic(href,href_list) - if (usr.machine==src && get_dist(src, usr) <= 1 || istype(usr, /mob/living/silicon/ai)) - if(href_list["eca"]) - if(accepted) - for(var/obj/item/weapon/spacecash/M in cashes) - M.loc = loc - inserted = 0 - if(!cashes) - cashes = null - if(href_list["with"] && card) - withdraw(usr) - if(href_list["ins"] && card) - if(accepted) - card.money += inserted - inserted = 0 - if(cashes) - cashes = null - if(href_list["lock"]) - card = null - accepted = 0 - usr.machine = null - usr << browse(null,"window=atm") - src.updateUsrDialog() - else - usr.machine = null - usr << browse(null,"window=atm") - - -/obj/item/weapon/card/id/proc/checkaccess(p,var/mob/user) - if(p == pin) - user << "\green Access granted" - return 1 - user << "\red Access denied" - return 0 \ No newline at end of file diff --git a/code/WorkInProgress/carn/Explosion2.dm b/code/WorkInProgress/carn/Explosion2.dm deleted file mode 100644 index 06b8569002..0000000000 --- a/code/WorkInProgress/carn/Explosion2.dm +++ /dev/null @@ -1,117 +0,0 @@ -//TODO: Flash range does nothing currently -//NOTE: This has not yet been updated with the lighting deferal stuff. ~Carn -//Needs some work anyway. - -proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1) - spawn(0) - var/start = world.timeofday - epicenter = get_turf(epicenter) - if(!epicenter) return - - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - JMP)") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") - - playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) ) - playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) ) - - tension_master.explosion() - - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 - - if(heavy_impact_range > 1) - var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() - E.set_up(epicenter) - E.start() - - var/x = epicenter.x - var/y = epicenter.y - var/z = epicenter.z - - var/counter = 0 - - if(devastation_range > 0) - counter += explosion_turf(x,y,z,1) - else - devastation_range = 0 - if(heavy_impact_range > 0) - counter += explosion_turf(x,y,z,2) - else - heavy_impact_range = 0 - if(light_impact_range > 0) - counter += explosion_turf(x,y,z,3) - else - return - - //Diamond 'splosions (looks more round than square version) - for(var/i=0, i[copytext("\ref[powernets[i]]",8,12)]" - - -client/verb/powernet_overlays() - for(var/obj/structure/cable/C in cable_list) - C.maptext = "[copytext("\ref[C.powernet]",8,12)]" - for(var/obj/machinery/power/M in machines) - M.maptext = "[copytext("\ref[M.powernet]",8,12)]" -*/ diff --git a/code/WorkInProgress/carn/master_controller_old.dm b/code/WorkInProgress/carn/master_controller_old.dm deleted file mode 100644 index 80a7659035..0000000000 --- a/code/WorkInProgress/carn/master_controller_old.dm +++ /dev/null @@ -1,210 +0,0 @@ -var/global/datum/controller/game_controller/master_controller //Set in world.New() -var/global/datum/failsafe/Failsafe -var/global/controller_iteration = 0 - - -var/global/last_tick_timeofday = world.timeofday -var/global/last_tick_duration = 0 - -datum/controller/game_controller - var/processing = 0 - - var/global/air_master_ready = 0 - var/global/sun_ready = 0 - var/global/mobs_ready = 0 - var/global/diseases_ready = 0 - var/global/machines_ready = 0 - var/global/objects_ready = 0 - var/global/networks_ready = 0 - var/global/powernets_ready = 0 - var/global/ticker_ready = 0 - - //Used for MC 'proc break' debugging - var/global/obj/last_obj_processed - var/global/datum/disease/last_disease_processed - var/global/obj/machinery/last_machine_processed - var/global/mob/last_mob_processed - - - proc/setup() - if(master_controller && (master_controller != src)) - del(src) - return - //There can be only one master. - - if(!air_master) - air_master = new /datum/controller/air_system() - air_master.setup() - - if(!job_master) - job_master = new /datum/controller/occupations() - if(job_master.SetupOccupations()) - world << "\red \b Job setup complete" - job_master.LoadJobs("config/jobs.txt") - - world.tick_lag = config.Ticklag - - createRandomZlevel() - - setup_objects() - - setupgenetics() - - - for(var/i = 0, i < max_secret_rooms, i++) - make_mining_asteroid_secret() - - syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round. - syndicate_code_response = generate_code_phrase() - - emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle() - - if(!ticker) - ticker = new /datum/controller/gameticker() - - setupfactions() - - spawn - ticker.pregame() - - proc/setup_objects() - world << "\red \b Initializing objects" - sleep(-1) - - for(var/obj/object in world) - object.initialize() - - world << "\red \b Initializing pipe networks" - sleep(-1) - - for(var/obj/machinery/atmospherics/machine in world) - machine.build_network() - - world << "\red \b Initializing atmos machinery." - sleep(-1) - for(var/obj/machinery/atmospherics/unary/vent_pump/T in world) - T.broadcast_status() - for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world) - T.broadcast_status() - - world << "\red \b Initializations complete." - - - proc/process() - processing = 1 - spawn(0) - set background = 1 - while(1) - var/currenttime = world.timeofday - var/diff = (currenttime - last_tick_timeofday) / 10 - last_tick_timeofday = currenttime - last_tick_duration = diff - - if(processing) - - controller_iteration++ - - var/start_time = world.timeofday - - air_master_ready = 0 - sun_ready = 0 - mobs_ready = 0 - diseases_ready = 0 - machines_ready = 0 - objects_ready = 0 - networks_ready = 0 - powernets_ready = 0 - ticker_ready = 0 - - spawn(0) - air_master.process() - air_master_ready = 1 - - sleep(1) - - spawn(0) - sun.calc_position() - sun_ready = 1 - - sleep(-1) - - spawn(0) - for(var/mob/M in world) - last_mob_processed = M - M.Life() - mobs_ready = 1 - - sleep(-1) - - spawn(0) - for(var/datum/disease/D in active_diseases) - last_disease_processed = D - D.process() - diseases_ready = 1 - - spawn(0) - for(var/obj/machinery/machine in machines) - if(machine) - last_machine_processed = machine - machine.process() - if(machine && machine.use_power) - machine.auto_use_power() - - machines_ready = 1 - - sleep(1) - - spawn(-1) - for(var/obj/object in processing_objects) - last_obj_processed = object - object.process() - objects_ready = 1 - - sleep(-1) - - spawn(-1) - for(var/datum/pipe_network/network in pipe_networks) - network.process() - networks_ready = 1 - - spawn(-1) - for(var/datum/powernet/P in powernets) - P.reset() - powernets_ready = 1 - - sleep(-1) - - spawn(-1) - ticker.process() - ticker_ready = 1 - - var/IL_check = 0 //Infinite loop check (To report when the master controller breaks.) - while(!air_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready) - IL_check++ - if(IL_check > 600) - var/MC_report = "air_master_ready = [air_master_ready]; sun_ready = [sun_ready]; mobs_ready = [mobs_ready]; diseases_ready = [diseases_ready]; machines_ready = [machines_ready]; objects_ready = [objects_ready]; networks_ready = [networks_ready]; powernets_ready = [powernets_ready]; ticker_ready = [ticker_ready];" - message_admins("PROC BREAKAGE WARNING: The game's master contorller appears to be stuck in one of it's cycles. It has looped through it's delaying loop [IL_check] times.") - message_admins("The master controller reports: [MC_report]") - if(!diseases_ready) - if(last_disease_processed) - message_admins("DISEASE PROCESSING stuck on [last_disease_processed]", 0, 1) - else - message_admins("DISEASE PROCESSING stuck on unknown") - if(!machines_ready) - if(last_machine_processed) - message_admins("MACHINE PROCESSING stuck on [last_machine_processed]", 0, 1) - else - message_admins("MACHINE PROCESSING stuck on unknown") - if(!objects_ready) - if(last_obj_processed) - message_admins("OBJ PROCESSING stuck on [last_obj_processed]", 0, 1) - else - message_admins("OBJ PROCESSING stuck on unknown") - log_admin("PROC BREAKAGE WARNING: infinite_loop_check = [IL_check]; [MC_report];") - message_admins("Master controller breaking out of delaying loop. Restarting the round is advised if problem persists. DO NOT manually restart the master controller.") - break; - sleep(1) - - sleep(world.timeofday+12-start_time) - else - sleep(10) \ No newline at end of file diff --git a/code/WorkInProgress/carn/master_controller_semi-seq.dm b/code/WorkInProgress/carn/master_controller_semi-seq.dm deleted file mode 100644 index 0f9b4f666d..0000000000 --- a/code/WorkInProgress/carn/master_controller_semi-seq.dm +++ /dev/null @@ -1,258 +0,0 @@ -//Nothing spectacular, just a slightly more configurable MC. - -var/global/datum/controller/game_controller/master_controller //Set in world.New() -var/global/datum/failsafe/Failsafe -var/global/controller_iteration = 0 - - -var/global/last_tick_timeofday = world.timeofday -var/global/last_tick_duration = 0 - -var/global/obj/machinery/last_obj_processed //Used for MC 'proc break' debugging -var/global/datum/disease/last_disease_processed //Used for MC 'proc break' debugging -var/global/obj/machinery/last_machine_processed //Used for MC 'proc break' debugging - -datum/controller/game_controller - var/processing = 0 - var/breather_ticks = 1 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every step - var/minimum_ticks = 10 //The minimum length of time between MC ticks - - var/global/air_master_ready = 0 - var/global/tension_master_ready = 0 - var/global/sun_ready = 0 - var/global/mobs_ready = 0 - var/global/diseases_ready = 0 - var/global/machines_ready = 0 - var/global/objects_ready = 0 - var/global/networks_ready = 0 - var/global/powernets_ready = 0 - var/global/ticker_ready = 0 - -datum/controller/game_controller/New() - //There can be only one master_controller. Out with the old and in with the new. - if(master_controller) - if(master_controller != src) - del(master_controller) - master_controller = src - - if(!air_master) - air_master = new /datum/controller/air_system() - air_master.setup() - - if(!job_master) - job_master = new /datum/controller/occupations() - if(job_master.SetupOccupations()) - world << "\red \b Job setup complete" - job_master.LoadJobs("config/jobs.txt") - - if(!tension_master) tension_master = new /datum/tension() - if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() - if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() - if(!ticker) ticker = new /datum/controller/gameticker() - if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle() - if(artifact_spawn) artifact_spawning_turfs = artifact_spawn - -datum/controller/game_controller/proc/setup() - world.tick_lag = config.Ticklag - - createRandomZlevel() - setup_objects() - setupgenetics() - setupfactions() - - for(var/i = 0, i < max_secret_rooms, i++) - make_mining_asteroid_secret() - - spawn(0) - if(ticker) - ticker.pregame() - -datum/controller/game_controller/proc/setup_objects() - world << "\red \b Initializing objects" - sleep(-1) - for(var/obj/object in world) - object.initialize() - - world << "\red \b Initializing pipe networks" - sleep(-1) - for(var/obj/machinery/atmospherics/machine in world) - machine.build_network() - - world << "\red \b Initializing atmos machinery." - sleep(-1) - for(var/obj/machinery/atmospherics/unary/vent_pump/T in world) - T.broadcast_status() - for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world) - T.broadcast_status() - - world << "\red \b Initializations complete." - sleep(-1) - - -datum/controller/game_controller/proc/process() - set background = 1 - processing = 1 - while(1) //far more efficient than recursively calling ourself - if(!Failsafe) new /datum/failsafe() - - var/currenttime = world.timeofday - last_tick_duration = (currenttime - last_tick_timeofday) / 10 - last_tick_timeofday = currenttime - - if(processing) - var/start_time = world.timeofday - controller_iteration++ - - air_master_ready = 0 - tension_master_ready = 0 - sun_ready = 0 - mobs_ready = 0 - diseases_ready = 0 - machines_ready = 0 - objects_ready = 0 - networks_ready = 0 - powernets_ready = 0 - ticker_ready = 0 - - spawn(0) - air_master.process() - air_master_ready = 1 - sleep(breather_ticks) - - spawn(0) - tension_master.process() - tension_master_ready = 1 - sleep(breather_ticks) - - spawn(0) - sun.calc_position() - sun_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/mob/living/M in world) //only living mobs have life processes - M.Life() - mobs_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/datum/disease/D in active_diseases) - last_disease_processed = D - D.process() - diseases_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/obj/machinery/machine in machines) - if(machine) - last_machine_processed = machine - machine.process() - if(machine && machine.use_power) - machine.auto_use_power() - machines_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/obj/object in processing_objects) - last_obj_processed = object - object.process() - objects_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/datum/pipe_network/network in pipe_networks) - network.process() - networks_ready = 1 - sleep(breather_ticks) - - spawn(0) - for(var/datum/powernet/P in powernets) - P.reset() - powernets_ready = 1 - sleep(breather_ticks) - - spawn(0) - ticker.process() - ticker_ready = 1 - - sleep( minimum_ticks - max(world.timeofday-start_time,0) ) //to prevent long delays happening at midnight - - var/IL_check = 0 //Infinite loop check (To report when the master controller breaks.) - while(!air_master_ready || !tension_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready) - IL_check++ - if(IL_check > 200) - var/MC_report = "air_master_ready = [air_master_ready]; tension_master_ready = [tension_master_ready]; sun_ready = [sun_ready]; mobs_ready = [mobs_ready]; diseases_ready = [diseases_ready]; machines_ready = [machines_ready]; objects_ready = [objects_ready]; networks_ready = [networks_ready]; powernets_ready = [powernets_ready]; ticker_ready = [ticker_ready];" - var/MC_admin_report = "PROC BREAKAGE WARNING: The game's master contorller appears to be stuck in one of it's cycles. It has looped through it's delaying loop [IL_check] times.
The master controller reports: [MC_report]

" - if(!diseases_ready) - if(last_disease_processed) - MC_admin_report += "DISEASE PROCESSING stuck on [last_disease_processed]
" - else - MC_admin_report += "DISEASE PROCESSING stuck on unknown
" - if(!machines_ready) - if(last_machine_processed) - MC_admin_report += "MACHINE PROCESSING stuck on [last_machine_processed]
" - else - MC_admin_report += "MACHINE PROCESSING stuck on unknown
" - if(!objects_ready) - if(last_obj_processed) - MC_admin_report += "OBJ PROCESSING stuck on [last_obj_processed]
" - else - MC_admin_report += "OBJ PROCESSING stuck on unknown
" - MC_admin_report += "Master controller breaking out of delaying loop. Restarting the round is advised if problem persists. DO NOT manually restart the master controller.
" - message_admins(MC_admin_report) - log_admin("PROC BREAKAGE WARNING: infinite_loop_check = [IL_check]; [MC_report];") - break - sleep(3) - else - sleep(10) - - - -/datum/failsafe // This thing pretty much just keeps poking the master controller - var/spinning = 1 - var/current_iteration = 0 - var/ticks_per_spin = 200 //poke the MC every 20 seconds - var/defcon = 0 //alert level. For every poke that fails this is raised by 1. When it reaches 5 the MC is replaced with a new one. (effectively killing any master_controller.process() and starting a new one) - -/datum/failsafe/New() - //There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one) - if(Failsafe && (Failsafe != src)) - del(Failsafe) - Failsafe = src - - current_iteration = controller_iteration - spawn(0) - Failsafe.spin() - - -/datum/failsafe/proc/spin() - set background = 1 - while(1) //more efficient than recursivly calling ourself over and over. background = 1 ensures we do not trigger an infinite loop - if(master_controller) - if(spinning && master_controller.processing) //only poke if these overrides aren't in effect - if(current_iteration == controller_iteration) //master_controller hasn't finished processing in the defined interval - switch(defcon) - if(0 to 3) - defcon++ - if(4) - defcon = 5 - for(var/client/C) - if(C.holder) - C << "Warning. The Master Controller has not fired in the last [4*ticks_per_spin] ticks. Automatic restart in [ticks_per_spin] ticks." - if(5) - for(var/client/C) - if(C.holder) - C << "Warning. The Master Controller has still not fired within the last [5*ticks_per_spin] ticks. Killing and restarting..." - spawn(0) - new /datum/controller/game_controller() //replace the old master_controller (hence killing the old one's process) - master_controller.process() //Start it rolling again - defcon = 0 - else - defcon = 0 - current_iteration = controller_iteration - else - defcon = 0 - else - new /datum/controller/game_controller() //replace the missing master_controller! This should never happen. - sleep(ticks_per_spin) - diff --git a/code/WorkInProgress/computer3/computers/aifixer.dm b/code/WorkInProgress/computer3/computers/aifixer.dm deleted file mode 100644 index a52e40a0d5..0000000000 --- a/code/WorkInProgress/computer3/computers/aifixer.dm +++ /dev/null @@ -1,117 +0,0 @@ -/obj/machinery/computer3/aifixer - default_prog = /datum/file/program/aifixer - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/ai_holder) - icon_state = "frame-rnd" - - -/datum/file/program/aifixer - name = "AI system integrity restorer" - desc = "Repairs and revives artificial intelligence cores." - image = 'icons/ntos/airestore.png' - active_state = "ai-fixer-empty" - req_access = list(access_captain, access_robotics, access_heads) - - update_icon() - if(!computer || !computer.cradle) - overlay.icon_state = "ai-fixer-404" - return // what - - if(!computer.cradle.occupant) - overlay.icon_state = "ai-fixer-empty" - else - if (computer.cradle.occupant.health >= 0 && computer.cradle.occupant.stat != 2) - overlay.icon_state = "ai-fixer-full" - else - overlay.icon_state = "ai-fixer-404" - computer.update_icon() - - interact() - if(!interactable()) - return - - if(!computer.cradle) - computer.Crash(MISSING_PERIPHERAL) - return - - popup.set_content(aifixer_menu()) - popup.open() - return - - proc/aifixer_menu() - var/dat = "" - if (computer.cradle.occupant) - var/laws - dat += "

Stored AI: [computer.cradle.occupant.name]

" - dat += "System integrity: [(computer.cradle.occupant.health+100)/2]%
" - - if (computer.cradle.occupant.laws.zeroth) - laws += "0: [computer.cradle.occupant.laws.zeroth]
" - - var/number = 1 - for (var/index = 1, index <= computer.cradle.occupant.laws.inherent.len, index++) - var/law = computer.cradle.occupant.laws.inherent[index] - if (length(law) > 0) - laws += "[number]: [law]
" - number++ - - for (var/index = 1, index <= computer.cradle.occupant.laws.supplied.len, index++) - var/law = computer.cradle.occupant.laws.supplied[index] - if (length(law) > 0) - laws += "[number]: [law]
" - number++ - - dat += "Laws:
[laws]
" - - if (computer.cradle.occupant.stat == 2) - dat += "AI non-functional" - else - dat += "AI functional" - if (!computer.cradle.busy) - dat += "

[topic_link(src,"fix","Begin Reconstruction")]" - else - dat += "

Reconstruction in process, please wait.
" - dat += "
[topic_link(src,"close","Close")]" - return dat - - Topic(var/href, var/list/href_list) - if(!interactable() || !computer.cradle || ..(href,href_list)) - return - - if ("fix" in href_list) - var/mob/living/silicon/ai/occupant = computer.cradle.occupant - if(!occupant) return - - computer.cradle.busy = 1 - computer.overlays += image('icons/obj/computer.dmi', "ai-fixer-on") - - var/i = 0 - while (occupant.health < 100) - if(!computer || (computer.stat&~MAINT)) // takes some time, keep checking - break - - occupant.adjustOxyLoss(-1) - occupant.adjustFireLoss(-1) - occupant.adjustToxLoss(-1) - occupant.adjustBruteLoss(-1) - occupant.updatehealth() - if (occupant.health >= 0 && computer.cradle.occupant.stat == 2) - occupant.stat = 0 - occupant.lying = 0 - dead_mob_list -= occupant - living_mob_list += occupant - update_icon() - - i++ - if(i == 5) - computer.use_power(50) // repairing an AI is nontrivial. laptop battery may not be enough. - computer.power_change() // if the power runs out, set stat - i = 0 - - computer.updateUsrDialog() - - sleep(10) - computer.cradle.busy = 0 - computer.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on") - - computer.updateUsrDialog() - return diff --git a/code/WorkInProgress/computer3/computers/cloning.dm b/code/WorkInProgress/computer3/computers/cloning.dm deleted file mode 100644 index 49ed2a04b8..0000000000 --- a/code/WorkInProgress/computer3/computers/cloning.dm +++ /dev/null @@ -1,363 +0,0 @@ -/obj/machinery/computer3/cloning - default_prog = /datum/file/program/cloning - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/storage/removable,/obj/item/part/computer/networking/prox) - -/datum/file/program/cloning - name = "cloning console" - desc = "Connects to cloning machinery through the local network." - active_state = "dna_old" - - req_access = list(access_heads) //Only used for record deletion right now. - - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. - - var/temp = "Inactive" - var/scantemp_ckey - var/scantemp = "Ready to Scan" - var/menu = 1 //Which menu screen to display - var/list/records = list() - var/datum/data/record/active_record = null - var/loading = 0 // Nice loading text - var/has_disk = 0 - - proc/updatemodules() - if(!computer.net) return - - if(scanner && pod1) - if(!computer.net.verify_machine(scanner)) - scanner = null - if(!computer.net.verify_machine(pod1)) - pod1 = null - - if(!scanner || !pod1) - var/list/nearby = computer.net.get_machines() - scanner = locate(/obj/machinery/dna_scannernew) in nearby - pod1 = locate(/obj/machinery/clonepod) in nearby - - if (pod1) - pod1.connected = src // Some variable the pod needs - - proc/ScanningMenu() - if (isnull(scanner)) - return "ERROR: No Scanner detected!
" - - var/dat = "

Scanner Functions

" - dat += "
" - - if (!scanner.occupant) - dat += "Scanner Unoccupied" - else if(loading) - dat += "[scanner.occupant] => Scanning..." - else - if (scanner.occupant.ckey != scantemp_ckey) - scantemp = "Ready to Scan" - scantemp_ckey = scanner.occupant.ckey - dat += "[scanner.occupant] => [scantemp]" - - dat += "
" - - if (scanner.occupant) - dat += topic_link(src,"scan","Start Scan") + "
" - if(scanner.locked) - dat += topic_link(src,"lock","Unlock Scanner") - else - dat += topic_link(src,"lock","Lock Scanner") - else - dat += fake_link("Start Scan") - - // Footer - dat += "

Database Functions

" - if (records.len > 0) - dat += topic_link(src,"menu=2","View Records ([records.len])") + "
" - else - dat += fake_link("View Records (0)") - - if (has_disk) - dat += topic_link(src,"eject_disk","Eject Disk") + "
" - return dat - - proc/RecordsList() - var/dat = "

Current records

" - dat += topic_link(src,"menu=1","<< Back") + "

" - for(var/datum/data/record/R in records) - dat += "

[R.fields["name"]]

Scan ID [R.fields["id"]] " + topic_link(src,"view_rec=\ref[R]","View Record") - return dat - - proc/ShowRecord() - var/dat = "

Selected Record

" - dat += topic_link(src,"menu=2","<< Back") + "

" - - if (!active_record) - dat += "Record not found." - else - dat += "

[active_record.fields["name"]]

" - dat += "Scan ID [active_record.fields["id"]] [topic_link(src,"clone","Clone")]
" - - var/obj/item/weapon/implant/health/H = locate(active_record.fields["imp"]) - - if ((H) && (istype(H))) - dat += "Health Implant Data:
[H.sensehealth()]

" - else - dat += "Unable to locate Health Implant.

" - - dat += "Unique Identifier:
[active_record.fields["UI"]]
" - dat += "Structural Enzymes:
[active_record.fields["SE"]]
" - - if (has_disk) - dat += "
" - dat += "

Inserted Disk

" - dat += "Contents: " - if (computer.floppy.inserted.files.len == 0) - dat += "Empty" - else - for(var/datum/file/data/genome/G in computer.floppy.inserted.files) - dat += topic_link(src,"loadfile=\ref[G]","[G.name]") + "
" - - dat += "

Save to Disk:
" - dat += topic_link(src,"save_disk=ue","Unique Identifier + Unique Enzymes") + "
" - dat += topic_link(src,"save_disk=ui","Unique Identifier") + "
" - dat += topic_link(src,"save_disk=se","Structural Enzymes") + "
" - dat += "
" - - dat += "[topic_link(src,"del_rec","Delete Record")]" - return dat - proc/ConfirmDelete() - var/dat = "[temp]
" - dat += "

Confirm Record Deletion

" - - dat += "[topic_link(src,"del_rec","Scan card to confirm")]
" - dat += "[topic_link(src,"menu=3","Cancel")]" - return dat - - interact() - if(!interactable()) - return - - updatemodules() - - var/dat = "" - dat += topic_link(src,"refresh","Refresh") - dat += "

Cloning Pod Status

" - dat += "
[temp] 
" - - has_disk = (computer.floppy && computer.floppy.inserted) - if(!active_record && menu > 2) - menu = 2 - - switch(menu) - if(1) - dat += ScanningMenu() - - if(2) - dat += RecordsList() - - if(3) - dat += ShowRecord() - - if(4) - dat = ConfirmDelete() // not (+=), this is how it used to be, just putting it in a function - - if(!popup) - popup = new(usr, "\ref[computer]", "Cloning System Control") - popup.set_title_image(usr.browse_rsc_icon(overlay.icon, overlay.icon_state)) - - popup.set_content(dat) - popup.open() - return - - Topic(var/href, var/list/href_list) - if(loading || !interactable()) - return - - if (href_list["menu"]) - menu = text2num(href_list["menu"]) - else if (("scan" in href_list) && !isnull(scanner)) - scantemp = "" - - loading = 1 - computer.updateUsrDialog() - - spawn(20) - scan_mob(scanner.occupant) - - loading = 0 - computer.updateUsrDialog() - - - //No locking an open scanner. - else if (("lock" in href_list) && !isnull(scanner)) - if ((!scanner.locked) && (scanner.occupant)) - scanner.locked = 1 - else - scanner.locked = 0 - - else if ("view_rec" in href_list) - active_record = locate(href_list["view_rec"]) - if(istype(active_record,/datum/data/record)) - if ( !active_record.fields["ckey"] || active_record.fields["ckey"] == "" ) - del(active_record) - temp = "Record Corrupt" - else - menu = 3 - else - active_record = null - temp = "Record missing." - - else if ("del_rec" in href_list) - if ((!active_record) || (menu < 3)) - return - if (menu == 3) //If we are viewing a record, confirm deletion - temp = "Delete record?" - menu = 4 - - else if (menu == 4) - var/obj/item/weapon/card/id/C = usr.get_active_hand() - if (istype(C)||istype(C, /obj/item/device/pda)) - if(check_access(C)) - temp = "[active_record.fields["name"]] => Record deleted." - records.Remove(active_record) - del(active_record) - menu = 2 - else - temp = "Access Denied." - - else if ("eject_disk" in href_list) - if(computer.floppy) - computer.floppy.eject_disk() - - else if("loadfile" in href_list) - - var/datum/file/data/genome/G = locate(href_list["loadfile"]) in computer.floppy.files - if(!istype(G)) - temp = "Load error." - computer.updateUsrDialog() - return - switch(G.type) - if(/datum/file/data/genome/UI) - active_record.fields["UI"] = G.content - if(/datum/file/data/genome/UE) - active_record.fields["name"] = G.real_name - if(/datum/file/data/genome/SE) - active_record.fields["SE"] = G.content - if(/datum/file/data/genome/cloning) - active_record = G:record - else if("savefile" in href_list) - if (!active_record || !computer || !computer.floppy) - temp = "Save error." - computer.updateUsrDialog() - return - var/rval = 0 - switch(href_list["save_disk"]) - if("ui") - var/datum/file/data/genome/UI/ui = new - ui.content = active_record.fields["UI"] - ui.real_name = active_record.fields["name"] - rval = computer.floppy.addfile(ui) - if("ue") - var/datum/file/data/genome/UI/UE/ui = new - ui.content = active_record.fields["UI"] - ui.real_name = active_record.fields["name"] - rval = computer.floppy.addfile(ui) - if("se") - var/datum/file/data/genome/SE/se = new - se.content = active_record.fields["SE"] - se.real_name = active_record.fields["name"] - rval = computer.floppy.addfile(se) - if("clone") - var/datum/file/data/genome/cloning/c = new - c.record = active_record - c.real_name = active_record.fields["name"] - rval = computer.floppy.addfile(c) - if(!rval) - temp = "Disk write error." - - else if ("refresh" in href_list) - computer.updateUsrDialog() - - else if ("clone" in href_list) - //Look for that player! They better be dead! - if(active_record) - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!pod1) - temp = "No Clonepod detected." - else if(pod1.occupant) - temp = "Clonepod is currently occupied." - else if(pod1.mess) - temp = "Clonepod malfunction." - else if(!config.revival_cloning) - temp = "Unable to initiate cloning cycle." - else if(pod1.growclone(active_record.fields["ckey"], active_record.fields["name"], active_record.fields["UI"], active_record.fields["SE"], active_record.fields["mind"], active_record.fields["mrace"])) - temp = "[active_record.fields["name"]] => Cloning cycle in progress..." - records.Remove(active_record) - del(active_record) - menu = 1 - else - temp = "[active_record.fields["name"]] => Initialisation failure." - - else - temp = "Data corruption." - - computer.add_fingerprint(usr) - computer.updateUsrDialog() - return - - proc/scan_mob(mob/living/carbon/human/subject as mob) - if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) - scantemp = "Unable to locate valid genetic data." - return - if (!getbrain(subject)) - scantemp = "No signs of intelligence detected." - return - if (subject.suiciding == 1) - scantemp = "Subject's brain is not responding to scanning stimuli." - return - if ((!subject.ckey) || (!subject.client)) - scantemp = "Mental interface failure." - return - if (NOCLONE in subject.mutations) - scantemp = "Mental interface failure." - return - if (!isnull(find_record(subject.ckey))) - scantemp = "Subject already in database." - return - - subject.dna.check_integrity() - - var/datum/data/record/R = new /datum/data/record( ) - if(subject.dna) - R.fields["mrace"] = subject.dna.mutantrace - R.fields["UI"] = subject.dna.uni_identity - R.fields["SE"] = subject.dna.struc_enzymes - else - R.fields["mrace"] = null - R.fields["UI"] = null - R.fields["SE"] = null - R.fields["ckey"] = subject.ckey - R.fields["name"] = subject.real_name - R.fields["id"] = copytext(md5(subject.real_name), 2, 6) - - - - //Add an implant if needed - var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) - if (isnull(imp)) - imp = new /obj/item/weapon/implant/health(subject) - imp.implanted = subject - R.fields["imp"] = "\ref[imp]" - //Update it if needed - else - R.fields["imp"] = "\ref[imp]" - - if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. - R.fields["mind"] = "\ref[subject.mind]" - - records += R - scantemp = "Subject successfully scanned." - -//Find a specific record by key. - proc/find_record(var/find_key) - for(var/datum/data/record/R in records) - if (R.fields["ckey"] == find_key) - return R - return null diff --git a/code/WorkInProgress/computer3/computers/message.dm b/code/WorkInProgress/computer3/computers/message.dm deleted file mode 100644 index 3bbb580f5e..0000000000 --- a/code/WorkInProgress/computer3/computers/message.dm +++ /dev/null @@ -1,450 +0,0 @@ -/obj/machinery/computer3/message_monitor - default_prog = /datum/file/program/message_mon - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/prox) - - -//BROKEN AS HELL, DON'T USE UNTIL FIXED - -/datum/file/program/message_mon - name = "Message Monitor Console" - desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages." - active_state = "comm_logs" - var/hack_icon = "comm_logsc" - var/normal_icon = "comm_logs" - - //Server linked to. - var/obj/machinery/message_server/linkedServer = null - //Sparks effect - For emag - //var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread - - //Messages - Saves me time if I want to change something. - var/noserver = "ALERT: No server detected." - var/incorrectkey = "ALERT: Incorrect decryption key!" - var/defaultmsg = "Welcome. Please select an option." - var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" - - //Computer properties - var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message - var/hacking = 0 // Is it being hacked into by the AI/Cyborg - var/emag = 0 // When it is emagged. - var/message = "System bootup complete. Please select an option." // The message that shows on the main menu. - var/auth = 0 // Are they authenticated? - var/optioncount = 7 - - // Custom Message Properties - var/customsender = "System Administrator" - var/obj/item/device/pda/customrecepient = null - var/customjob = "Admin" - var/custommessage = "This is a test, please ignore." - - - procinitialize() - if(!linkedServer) - if(message_servers && message_servers.len > 0) - linkedServer = message_servers[1] - return - - - update_icon() - if(emag || hacking) - overlay.icon_state = hack_icon - else - overlay.icon_state = normal_icon - computer.update_icon() - - interact() - if(!interactable()) - return - //If the computer is being hacked or is emagged, display the reboot message. - if(hacking || emag) - message = rebootmsg - var/dat = "Message Monitor Console" - dat += "

Message Monitor Console


" - dat += "

" - - if(auth) - dat += "

\[Authenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" - else - dat += "

\[Unauthenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" - - if(hacking || emag) - screen = 2 - else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) message = noserver - screen = 0 - - switch(screen) - //Main menu - if(0) - // = TAB - var/i = 0 - dat += "
[++i]. Link To A Server
" - if(auth) - if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - dat += "
ERROR: Server not found!
" - else - dat += "
[++i]. View Message Logs
" - dat += "
[++i]. View Request Console Logs
" - dat += "
[++i]. Clear Message Logs
" - dat += "
[++i]. Clear Request Console Logs
" - dat += "
[++i]. Set Custom Key
" - dat += "
[++i]. Send Admin Message
" - else - for(var/n = ++i; n <= optioncount; n++) - dat += "
[n]. ---------------
" - if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) - //Malf/Traitor AIs can bruteforce into the system to gain the Key. - dat += "
*&@#. Bruteforce Key
" - else - dat += "
" - - //Bottom message - if(!auth) - dat += "

Please authenticate with the server in order to show additional options." - else - dat += "

Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties." - - //Message Logs - if(1) - var/index = 0 - //var/recipient = "Unspecified" //name of the person - //var/sender = "Unspecified" //name of the sender - //var/message = "Blank" //transferred message - dat += "
Back - Refresh

" - dat += "" - for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs) - index++ - if(index > 3000) - break - // Del - Sender - Recepient - Message - // X - Al Green - Your Mom - WHAT UP!? - dat += "" - dat += "
XSenderRecipientMessage
X
[pda.sender][pda.recipient][pda.message]
" - //Hacking screen. - if(2) - if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) - dat += "Brute-forcing for server key.
It will take 20 seconds for every character that the password has." - dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time." - else - //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever. - dat += {"01000010011100100111010101110100011001010010110
- 10110011001101111011100100110001101101001011011100110011
- 10010000001100110011011110111001000100000011100110110010
- 10111001001110110011001010111001000100000011010110110010
- 10111100100101110001000000100100101110100001000000111011
- 10110100101101100011011000010000001110100011000010110101
- 10110010100100000001100100011000000100000011100110110010
- 10110001101101111011011100110010001110011001000000110011
- 00110111101110010001000000110010101110110011001010111001
- 00111100100100000011000110110100001100001011100100110000
- 10110001101110100011001010111001000100000011101000110100
- 00110000101110100001000000111010001101000011001010010000
- 00111000001100001011100110111001101110111011011110111001
- 00110010000100000011010000110000101110011001011100010000
- 00100100101101110001000000111010001101000011001010010000
- 00110110101100101011000010110111001110100011010010110110
- 10110010100101100001000000111010001101000011010010111001
- 10010000001100011011011110110111001110011011011110110110
- 00110010100100000011000110110000101101110001000000111001
- 00110010101110110011001010110000101101100001000000111100
- 10110111101110101011100100010000001110100011100100111010
- 10110010100100000011010010110111001110100011001010110111
- 00111010001101001011011110110111001110011001000000110100
- 10110011000100000011110010110111101110101001000000110110
- 00110010101110100001000000111001101101111011011010110010
- 10110111101101110011001010010000001100001011000110110001
- 10110010101110011011100110010000001101001011101000010111
- 00010000001001101011000010110101101100101001000000111001
- 10111010101110010011001010010000001101110011011110010000
- 00110100001110101011011010110000101101110011100110010000
- 00110010101101110011101000110010101110010001000000111010
- 00110100001100101001000000111001001101111011011110110110
- 10010000001100100011101010111001001101001011011100110011
- 10010000001110100011010000110000101110100001000000111010
- 001101001011011010110010100101110"} - - //Fake messages - if(3) - dat += "
Back - Reset

" - - dat += {" - - - - "} - //Sender - Sender's Job - Recepient - Message - //Al Green- Your Dad - Your Mom - WHAT UP!? - - dat += {" - - - "} - dat += "
SenderSender's JobRecipientMessage
[customsender][customjob][customrecepient ? customrecepient.owner : "NONE"][custommessage]

Send" - - //Request Console Logs - if(4) - - var/index = 0 - /* data_rc_msg - X - 5% - var/rec_dpt = "Unspecified" //name of the person - 15% - var/send_dpt = "Unspecified" //name of the sender- 15% - var/message = "Blank" //transferred message - 300px - var/stamp = "Unstamped" - 15% - var/id_auth = "Unauthenticated" - 15% - var/priority = "Normal" - 10% - */ - dat += "
Back - Refresh

" - dat += {" - "} - for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs) - index++ - if(index > 3000) - break - // Del - Sender - Recepient - Message - // X - Al Green - Your Mom - WHAT UP!? - dat += {" - "} - dat += "
XSending Dep.Receiving Dep.MessageStampID Auth.Priority.
X
[rc.send_dpt][rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" - - - popup.width = 700 - popup.height = 700 - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - - - proc/BruteForce(mob/usr as mob) - if(isnull(linkedServer)) - usr << "Could not complete brute-force: Linked Server Disconnected!" - else - var/currentKey = src.linkedServer.decryptkey - usr << "Brute-force completed! The key is '[currentKey]'." - src.hacking = 0 - src.active_state = normal_icon - src.screen = 0 // Return the screen back to normal - - proc/UnmagConsole() - src.active_state = normal_icon - src.emag = 0 - - proc/ResetMessage() - customsender = "System Administrator" - customrecepient = null - custommessage = "This is a test, please ignore." - customjob = "Admin" - - Topic(var/href, var/list/href_list) - if(!interactable() || ..(href,href_list)) - return - - if ("auth" in href_list) - if(auth) - auth = 0 - screen = 0 - else - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) - if(dkey && dkey != "") - if(src.linkedServer.decryptkey == dkey) - auth = 1 - else - message = incorrectkey - - //Turn the server on/off. - if ("active" in href_list) - if(auth) linkedServer.active = !linkedServer.active - //Find a server - if ("find" in href_list) - if(message_servers && message_servers.len > 1) - src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers - message = "NOTICE: Server selected." - else if(message_servers && message_servers.len > 0) - linkedServer = message_servers[1] - message = "NOTICE: Only Single Server Detected - Server selected." - else - message = noserver - - //View the logs - KEY REQUIRED - if ("view" in href_list) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 1 - - //Clears the logs - KEY REQUIRED - if ("clear" in href_list) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.linkedServer.pda_msgs = list() - message = "NOTICE: Logs cleared." - //Clears the request console logs - KEY REQUIRED - if ("clearr" in href_list) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.linkedServer.rc_msgs = list() - message = "NOTICE: Logs cleared." - //Change the password - KEY REQUIRED - if ("pass" in href_list) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) - if(dkey && dkey != "") - if(src.linkedServer.decryptkey == dkey) - var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) - if(length(newkey) <= 3) - message = "NOTICE: Decryption key too short!" - else if(length(newkey) > 16) - message = "NOTICE: Decryption key too long!" - else if(newkey && newkey != "") - src.linkedServer.decryptkey = newkey - message = "NOTICE: Decryption key set." - else - message = incorrectkey - - //Hack the Console to get the password - if ("hack" in href_list) - if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) - src.hacking = 1 - src.screen = 2 - src.active_state = hack_icon - //Time it takes to bruteforce is dependant on the password length. - spawn(100*length(src.linkedServer.decryptkey)) - if(src && src.linkedServer && usr) - BruteForce(usr) - //Delete the log. - if ("delete" in href_list) - //Are they on the view logs screen? - if(screen == 1) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else //if(istype(href_list["delete"], /datum/data_pda_msg)) - src.linkedServer.pda_msgs -= locate(href_list["delete"]) - message = "NOTICE: Log Deleted!" - //Delete the request console log. - if ("deleter" in href_list) - //Are they on the view logs screen? - if(screen == 4) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else //if(istype(href_list["delete"], /datum/data_pda_msg)) - src.linkedServer.rc_msgs -= locate(href_list["deleter"]) - message = "NOTICE: Log Deleted!" - //Create a custom message - if ("msg" in href_list) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 3 - //Fake messaging selection - KEY REQUIRED - if ("select" in href_list) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - screen = 0 - else - switch(href_list["select"]) - - //Reset - if("Reset") - ResetMessage() - - //Select Your Name - if("Sender") - customsender = input(usr, "Please enter the sender's name.") as text|null - - //Select Receiver - if("Recepient") - //Get out list of viable PDAs - var/list/obj/item/device/pda/sendPDAs = list() - for(var/obj/item/device/pda/P in PDAs) - if(!P.owner || P.toff || P.hidden) continue - sendPDAs += P - if(PDAs && PDAs.len > 0) - customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs) - else - customrecepient = null - - - //Enter custom job - if("RecJob") - customjob = input(usr, "Please enter the sender's job.") as text|null - - //Enter message - if("Message") - custommessage = input(usr, "Please enter your message.") as text|null - custommessage = copytext(sanitize(custommessage), 1, MAX_MESSAGE_LEN) - - //Send message - if("Send") - - if(isnull(customsender) || customsender == "") - customsender = "UNKNOWN" - - if(isnull(customrecepient)) - message = "NOTICE: No recepient selected!" - return src.attack_hand(usr) - - if(isnull(custommessage) || custommessage == "") - message = "NOTICE: No message entered!" - return src.attack_hand(usr) - - var/obj/item/device/pda/PDARec = null - for (var/obj/item/device/pda/P in PDAs) - if (!P.owner || P.toff || P.hidden) continue - if(P.owner == customsender) - PDARec = P - //Sender isn't faking as someone who exists - if(isnull(PDARec)) - src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]") - customrecepient.tnote += "← From
[customsender] ([customjob]):
[custommessage]
" - if (!customrecepient.silent) - playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, customrecepient.loc)) - O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) - if( customrecepient.loc && ishuman(customrecepient.loc) ) - var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") - customrecepient.overlays.Cut() - customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") - //Sender is faking as someone who exists - else - src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") - customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" - if (!customrecepient.silent) - playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, customrecepient.loc)) - O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) - if( customrecepient.loc && ishuman(customrecepient.loc) ) - var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") - customrecepient.overlays.Cut() - customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") - //Finally.. - ResetMessage() - - //Request Console Logs - KEY REQUIRED - if("viewr" in href_list) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 4 - - //usr << href_list["select"] - - if ("back" in href_list) - src.screen = 0 - interact() \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/prisonshuttle.dm b/code/WorkInProgress/computer3/computers/prisonshuttle.dm deleted file mode 100644 index f6f246e578..0000000000 --- a/code/WorkInProgress/computer3/computers/prisonshuttle.dm +++ /dev/null @@ -1,242 +0,0 @@ -//Config stuff -#define PRISON_MOVETIME 150 //Time to station is milliseconds. -#define PRISON_STATION_AREATYPE "/area/shuttle/prison/station" //Type of the prison shuttle area for station -#define PRISON_DOCK_AREATYPE "/area/shuttle/prison/prison" //Type of the prison shuttle area for dock - -var/prison_shuttle_moving_to_station = 0 -var/prison_shuttle_moving_to_prison = 0 -var/prison_shuttle_at_station = 0 -var/prison_shuttle_can_send = 1 -var/prison_shuttle_time = 0 -var/prison_shuttle_timeleft = 0 - -/obj/machinery/computer3/prison_shuttle - name = "Prison Shuttle Console" - icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" - req_access = list(access_security) - circuit = "/obj/item/part/board/circuit/prison_shuttle" - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - var/prison_break = 0 - - - attackby(I as obj, user as mob) - return src.attack_hand(user) - - - attack_ai(var/mob/user as mob) - return src.attack_hand(user) - - - attack_paw(var/mob/user as mob) - return src.attack_hand(user) - - - attackby(I as obj, user as mob) - if(istype(I, /obj/item/tool/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/part/board/circuit/prison_shuttle/M = new /obj/item/part/board/circuit/prison_shuttle( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.anchored = 1 - - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - new /obj/item/trash/shard( src.loc ) - A.state = 3 - A.icon_state = "3" - else - user << "\blue You disconnect the monitor." - A.state = 4 - A.icon_state = "4" - - del(src) - else if(istype(I,/obj/item/card/emag) && (!hacked)) - hacked = 1 - user << "\blue You disable the lock." - else - return src.attack_hand(user) - - - attack_hand(var/mob/user as mob) - if(!src.allowed(user) && (!hacked)) - user << "\red Access Denied." - return - if(prison_break) - user << "\red Unable to locate shuttle." - return - if(..()) - return - user.set_machine(src) - post_signal("prison") - var/dat - if (src.temp) - dat = src.temp - else - dat += {"Location: [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "Moving to station ([prison_shuttle_timeleft] Secs.)":prison_shuttle_at_station ? "Station":"Dock"]
- [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "\n*Shuttle already called*
\n
":prison_shuttle_at_station ? "\nSend to Dock
\n
":"\nSend to Station
\n
"] - \nClose"} - - //user << browse(dat, "window=computer;size=575x450") - //onclose(user, "computer") - var/datum/browser/popup = new(user, "computer", name, 575, 450) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - - - Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if (href_list["sendtodock"]) - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." - src.temp += "Shuttle sent.

OK" - src.updateUsrDialog() - prison_shuttle_moving_to_prison = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["sendtostation"]) - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." - src.temp += "Shuttle sent.

OK" - src.updateUsrDialog() - prison_shuttle_moving_to_station = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["mainmenu"]) - src.temp = null - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - - proc/prison_can_move() - if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return 0 - else return 1 - -/* - proc/prison_break() - switch(prison_break) - if (0) - if(!prison_shuttle_at_station || prison_shuttle_moving_to_prison) return - - prison_shuttle_moving_to_prison = 1 - prison_shuttle_at_station = prison_shuttle_at_station - - if (!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station) - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - prison_break = 1 - if(1) - prison_break = 0 -*/ - - proc/post_signal(var/command) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1311) - if(!frequency) return - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = command - frequency.post_signal(src, status_signal) - return - - - proc/prison_process() - while(prison_shuttle_time - world.timeofday > 0) - var/ticksleft = prison_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - prison_shuttle_time = world.timeofday + 10 // midnight rollover - - prison_shuttle_timeleft = (ticksleft / 10) - sleep(5) - prison_shuttle_moving_to_station = 0 - prison_shuttle_moving_to_prison = 0 - - switch(prison_shuttle_at_station) - - if(0) - prison_shuttle_at_station = 1 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - - var/area/start_location = locate(/area/shuttle/prison/prison) - var/area/end_location = locate(/area/shuttle/prison/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - del(T) - start_location.move_contents_to(end_location) - - if(1) - prison_shuttle_at_station = 0 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - - var/area/start_location = locate(/area/shuttle/prison/station) - var/area/end_location = locate(/area/shuttle/prison/prison) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - del(T) - start_location.move_contents_to(end_location) - return \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/scanconsole.dm b/code/WorkInProgress/computer3/computers/scanconsole.dm deleted file mode 100644 index 446fb5c8ff..0000000000 --- a/code/WorkInProgress/computer3/computers/scanconsole.dm +++ /dev/null @@ -1,1267 +0,0 @@ -/obj/machinery/computer3/scan_consolenew - default_prog = /datum/file/program/dnascanner - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/storage/removable,/obj/item/part/computer/networking/prox) - - -#define MAX_UIBLOCK 13 -#define MAX_SEBLOCK 14 - -/datum/file/program/dnascanner - name = "DNA Scanner and Manipulator" - desc = "The DNA ScaM is sure to change your life forever." - active_state = "dna" - var/obj/machinery/dna_scannernew/scanner = null - - var/ui_block = 1 - var/se_block = 1 - var/subblock = 1 - - var/uitarget = 1 - var/uitargethex = "1" - - var/radduration = 2 - var/radstrength = 1 - - var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete - - var/mode = 0 - // These keep track of the patient status - var/present = 0 - var/viable = 0 - - var/bufferlabel = "" - var/datum/dna/buffer = null - var/obj/item/part/computer/target_drive = null - - Reset() - ..() - mode = 0 - scanner = null - ui_block = 1 - se_block = 1 - subblock = 1 - buffer = null - bufferlabel = "" - - - Topic(var/href, var/list/href_list) - if(!interactable() || !computer.net || ..(href,href_list)) - return - - scanner = computer.net.connect_to(/obj/machinery/dna_scannernew, scanner) // if exists, will be verified - if(!scanner) - computer.Crash(NETWORK_FAILURE) - return - - // todo check everything goddamnit - present = scanner.occupant && scanner.occupant.dna - viable = present && !(NOCLONE in scanner.occupant.mutations) - - // current screen/function - if("mode" in href_list) - mode = text2num(href_list["mode"]) - // locks scanner door - if("lock" in href_list) - scanner.locked = !scanner.locked - - // inject good-juice - if("rejuv" in href_list) - rejuv() - - // expose to radiation, controlled otherwise - if("pulse" in href_list) - pulse(href_list["pulse"]) // ui, se, or nothing/null - - if("duration" in href_list) - var/modifier = text2num(href_list["duration"]) - radduration += modifier - if("strength" in href_list) - var/modifier = text2num(href_list["strength"]) - radstrength += modifier - - if("uiblock" in href_list) - ui_block = text2num(href_list["uiblock"]) - if("seblock" in href_list) - se_block = text2num(href_list["seblock"]) - if("subblock" in href_list) - subblock = text2num(href_list["subblock"]) - if("uitarget" in href_list) - uitarget = text2num(href_list["uitarget"]) - uitargethex = num2hex(uitarget) - - // save dna to buffer - buffer=se,ui,ue,all,clear - if("buffer" in href_list) - if(!viable) - return - var/which = href_list["buffer"] - if(!which || which == "clear") - buffer = null - else - if(!buffer) - buffer = new - if( which == "all" ) - buffer.unique_enzymes = scanner.occupant.dna.unique_enzymes - buffer.struc_enzymes = scanner.occupant.dna.struc_enzymes - buffer.uni_identity = scanner.occupant.dna.uni_identity - buffer.real_name = scanner.occupant.dna.real_name - buffer.mutantrace = scanner.occupant.dna.mutantrace - if( which == "se" ) - buffer.struc_enzymes = scanner.occupant.dna.struc_enzymes - buffer.mutantrace = scanner.occupant.dna.mutantrace - if( which == "ui" ) - buffer.uni_identity = scanner.occupant.dna.uni_identity - if( which == "ue" ) - buffer.uni_identity = scanner.occupant.dna.uni_identity - buffer.unique_enzymes = scanner.occupant.dna.unique_enzymes - buffer.real_name = scanner.occupant.dna.real_name - - // save buffer to file - - if("save" in href_list) - if(!viable || !buffer) - return - var/datum/file/data/genome/G = null - var/obj/item/part/computer/dest = device - if(target_drive) - dest = target_drive - - switch(href_list["save"]) - if("se") - if(buffer.struc_enzymes) - G = new /datum/file/data/genome/SE() - G.content = buffer.struc_enzymes - G:mutantrace = buffer.mutantrace // : not . due to inheritance - G.real_name = buffer.real_name - if("ui") - if(buffer.uni_identity) - G = new /datum/file/data/genome/UI() - G.content = buffer.uni_identity - G.real_name = buffer.real_name - if("ue") - if(buffer.uni_identity) - G = new /datum/file/data/genome/UI/UE() - G.content = buffer.uni_identity - G.real_name = buffer.real_name - if(G && dest) - var/label = input(usr, "Enter a filename:", "Save file", buffer.real_name) as text - G.name = G.name + "([label])" - dest:addfile(G) - - // load buffer from file - if("load" in href_list) - var/datum/file/data/genome/G = locate(href_list["load"]) - if(G) - if(!buffer) - buffer = new - switch(G.type) - if(/datum/file/data/genome/SE) - buffer.struc_enzymes = G.content - buffer.mutantrace = G:mutantrace - if(/datum/file/data/genome/UI/UE) - buffer.uni_identity = G.content - buffer.real_name = G.real_name - buffer.unique_enzymes = md5(buffer.real_name) - if(/datum/file/data/genome/UI) - buffer.uni_identity = G.content - if(/datum/file/data/genome/cloning) - var/datum/dna/record = G:record - buffer.unique_enzymes = record.unique_enzymes - buffer.struc_enzymes = record.struc_enzymes - buffer.uni_identity = record.uni_identity - buffer.real_name = record.real_name - buffer.mutantrace = record.mutantrace - - - // inject genetics into occupant - if("inject" in href_list) - if(!buffer || !viable) - return - - var/which = href_list["inject"] - var/datum/dna/target = scanner.occupant.dna - switch(which) - if("all",null) - if(buffer.struc_enzymes) - target.struc_enzymes = buffer.struc_enzymes - if(buffer.uni_identity) - target.uni_identity = buffer.uni_identity - if(buffer.real_name) - target.real_name = buffer.real_name - target.unique_enzymes = md5(target.real_name) - updateappearance(scanner.occupant,target.uni_identity) - domutcheck(scanner.occupant, scanner, 1) - if("se") - if(buffer.struc_enzymes) - target.struc_enzymes = buffer.struc_enzymes - domutcheck(scanner.occupant, scanner, 1) - if("ui") - if(buffer.uni_identity) - target.uni_identity = buffer.uni_identity - updateappearance(scanner.occupant,target.uni_identity) - if("ue") - if(buffer.uni_identity) - target.uni_identity = buffer.uni_identity - if(buffer.real_name) - target.real_name = buffer.real_name - target.unique_enzymes = md5(target.real_name) - updateappearance(scanner.occupant,target.uni_identity) - - // generate dna injector - if("generate" in href_list) - if(!buffer || !injectorready) - return - buffer.check_integrity() - var/which = href_list["generate"] - var/obj/item/weapon/dnainjector/inj - switch(which) - if("se") - inj = new(computer.loc) - inj.dnatype = "se" - inj.dna = buffer.struc_enzymes - inj.mutantrace = buffer.mutantrace - inj.name = "Structural Enzymes" - if("ui") - inj = new(computer.loc) - inj.dnatype = "ui" - inj.dna = buffer.uni_identity - inj.ue = null - inj.name = "Unique Identifiers" - if("ue") - inj = new(computer.loc) - inj.dnatype = "ui" - inj.dna = buffer.uni_identity - inj.ue = buffer.real_name - inj.name = "Unique Enzymes + Unique Identifiers" - if(inj) - injectorready = 0 - spawn(300) - injectorready = 1 - var/label = input(usr, "Enter a label", "Label [inj.name] Injector", buffer.real_name) as null|text - if(label && inj) // it's possible it was deleted before we get here, input suspends execution - inj.name += " ([label])" - - interact() - return // putting this in there to visually mark the end of topic() while I do other things - - proc/menu() - if(!present && (mode==1 || mode==2)) // require viable occupant - mode = 0 - switch(mode) - if(0) // MAIN MENU - return main_menu() - - if(1) - return ui_menu() - if(2) - return se_menu() - - if(3) - return emitter_menu() - - if(4) - return buffer_menu() - - // unified header with health data - // option to show UI,UE,SE as plaintext - proc/status_display(var/dna_summary = 0) - var/mob/living/occupant = scanner.occupant - var/status_html - if(viable) - status_html = "
Health:
[occupant.health]%
" - status_html += "
Radiation Level:
[occupant.radiation]%
" - if(ishuman(occupant)) - var/rejuvenators = round(occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100) - status_html += "
Rejuvenators:
[occupant.reagents.get_reagent_amount("inaprovaline")] units
" - - if (dna_summary) - status_html += "
Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
" - status_html += "
Unique Identifier:
[occupant.dna.uni_identity]
" - status_html += "
Structural Enzymes:
[occupant.dna.struc_enzymes]
" - - var/occupant_status = "Scanner Unoccupied" - if(present) - if(!viable) - occupant_status = "Invalid DNA structure" - else - switch(occupant.stat) // obvious, see what their status is - if(0) - occupant_status = "Conscious" - if(1) - occupant_status = "Unconscious" - else - occupant_status = "DEAD" - - occupant_status = "[occupant.name] => [occupant_status]
" - var/dat = "

Scanner Status

[topic_link(src,"","Scan")]
[occupant_status][status_html]
" - if(present) - dat += topic_link(src,"lock",scanner.locked?"Unlock Scanner":"Lock Scanner") + " " + topic_link(src,"rejuv","Inject Rejuvenators") - else - dat += "[scanner.locked?"Unlock Scanner":"Lock Scanner"] Inject Rejuvenators" - return dat - - proc/main_menu() - var/dat = status_display(dna_summary = 1) - dat += "

Main Menu

" - if(present) - dat += topic_link(src,"mode=1","Modify Unique Identifier") + "
" + topic_link(src,"mode=2","Modify Structural Enzymes") + "

" - else - dat += "Modify Unique Identifier
Modify Structural Enzymes

" - dat += topic_link(src,"mode=3","Radiation Emitter Settings") + "

" + topic_link(src,"mode=4","Transfer Buffer") - return dat - - - proc/block_plus_minus(var/topicstr, var/blockval,var/min,var/max) - var/left = blockval - 1 - var/right = blockval + 1 - if(left < min) - left = max - if(right > max) - right = min - return topic_link(src,"[topicstr]=[left]","<-") + " [blockval] " + topic_link(src,"[topicstr]=[right]","->") - - - proc/getblockstring(var/ui = 0) - var/mainblock = "seblock" - var/block = se_block - var/input = scanner.occupant.dna.struc_enzymes - if(ui) - mainblock = "uiblock" - block = ui_block - input = scanner.occupant.dna.uni_identity - - var/string = "
" - var/subpos = 1 // keeps track of the current sub block - var/blockpos = 1 - - for(var/i = 1, i <= length(input), i++) // loop through each letter - - if(blockpos == block && subpos == subblock) // if the current block/subblock is selected, mark it - string += fake_link(copytext(input,i,i+1)) - else - string += topic_link(src,"[mainblock]=[blockpos];subblock=[subpos]",copytext(input,i,i+1)) - - subpos++ - if(subpos > 3) // add a line break for every block - string += "
" - subpos = 1 - blockpos++ - - string += "
" - return string - - proc/ui_menu() - if(!viable) - return "No viable occupant detected." - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
" - dat += "

Modify Unique Identifier

" - dat += "
Unique Identifier:
[getblockstring(ui=1)]

" - - dat += "Selected Block: " + block_plus_minus("uiblock",ui_block,1,MAX_UIBLOCK) + "

" - dat += "Selected Sub-Block: " + block_plus_minus("subblock",subblock,1,3) + "

" - dat += "Selected Target: " + block_plus_minus("uitarget",uitarget,0,15) + "

" - dat += "Modify Block
" - dat += topic_link(src,"pulse=ui","Irradiate") + "
" - return dat - - proc/se_menu() - if(!viable) - return "No viable occupant detected." - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
" - dat += "

Modify Structural Enzymes

" - dat += "
Structural Enzymes: [getblockstring(ui=0)]

" - dat += "Selected Block: " + block_plus_minus("seblock",se_block,1,MAX_SEBLOCK) + "

" - dat += "Selected Sub-Block: " + block_plus_minus("subblock",subblock,1,3) + "

" - dat += "Modify Block
" - dat += topic_link(src,"pulse=se","Irradiate") + "
" - return dat - - proc/emitter_menu() - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
" - dat += "

Radiation Emitter Settings

" - if (viable) - dat += topic_link(src,"pulse","Pulse Radiation") - else - dat += fake_link("Pulse Radiation") - dat += "

" - dat += "Radiation Duration: " + block_plus_minus("duration",radduration,1,20) + "
" - dat += "Radiation Intensity: " + block_plus_minus("strength",radstrength,1,10) + "

" - return dat - - proc/buffer_menu() - - interact() - if(!interactable()) - return - popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') - - if(!computer.net) - computer.Crash(MISSING_PERIPHERAL) - return - - scanner = computer.net.connect_to(/obj/machinery/dna_scannernew, scanner) // if exists, will be verified - if(!scanner) - computer.Crash(NETWORK_FAILURE) - return - - // todo check everything goddamnit - - present = scanner.occupant && scanner.occupant.dna - viable = present && !(NOCLONE in scanner.occupant.mutations) - - popup.set_content(menu()) - popup.open() - - proc/pulse(var/target as null|anything in list("ui","se")) - - //Makes sure someone is in there (And valid) before trying anything - //More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason - - if(target != "ui" && target != "se") - target = null - - // transforms into the fail condition instead of having it in yet another nested if block - else if( prob(20 - (radduration / 2))) - target += "-f" - - if(!viable) - popup.set_content("No viable occupant detected.") - popup.open() - else - popup.set_content("Working ... Please wait ([radduration]) Seconds)") - popup.open() - - var/lock_state = scanner.locked - scanner.locked = 1//lock it - sleep(10*radduration) - - switch(target) - if("ui") - var/ui = scanner.occupant.dna.uni_identity - var/block = getblock(ui,ui_block,3) - var/result = "" - for(var/sb = 1; sb <=3; sb++) - var/temp = copytext(block,sb,sb+1) - if(sb == subblock) - temp = miniscramble("[uitargethex]",radstrength,radduration) - result += temp - scanner.occupant.dna.uni_identity = setblock(ui, ui_block, result,3) - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += (radstrength+radduration) - if("ui-f") - if (prob(20+radstrength)) - randmutb(scanner.occupant) - domutcheck(scanner.occupant,scanner) - else - randmuti(scanner.occupant) - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += ((radstrength*2)+radduration) - - if("se") - var/se = scanner.occupant.dna.struc_enzymes - var/targetblock = se_block - - if (!(se_block in list(2,8,10,12)) && prob (20)) // shifts the target slightly - if (se_block <= 5) - targetblock++ - else - targetblock-- - var/block = getblock(scanner.occupant.dna.struc_enzymes,targetblock,3) - - var/result = "" - for(var/sb = 1; sb <=3; sb++) - var/temp = copytext(block,sb,sb+1) - if(sb == subblock) - temp = miniscramble(temp,radstrength,radduration) - result += temp - - scanner.occupant.dna.struc_enzymes = setblock(se, se_block, result,3) - domutcheck(scanner.occupant,scanner) - scanner.occupant.radiation += (radstrength+radduration) - if("se-f") - if (prob(80-radduration)) - randmutb(scanner.occupant) - domutcheck(scanner.occupant,scanner) - else - randmuti(scanner.occupant) - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += ((radstrength*2)+radduration) - - if(null) - if (prob(95)) - if(prob(75)) - randmutb(scanner.occupant) - else - randmuti(scanner.occupant) - else - if(prob(95)) - randmutg(scanner.occupant) - else - randmuti(scanner.occupant) - scanner.occupant.radiation += ((radstrength*3)+radduration*3) - - - scanner.locked = lock_state - interact() - - proc/rejuv() - if(!viable) - popup.set_content("No viable occupant detected.") - popup.open() - var/mob/living/carbon/human/H = scanner.occupant - if(istype(H)) - var/inap = H.reagents.get_reagent_amount("inaprovaline") // oh my *god* this section was ugly before I shortened it - - if (inap < (REJUVENATORS_MAX - REJUVENATORS_INJECT)) - H.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT) - else - H.reagents.add_reagent("inaprovaline", max(REJUVENATORS_MAX - inap,0)) - -/* -/obj/machinery/computer/scan_consolenew/Topic(href, href_list) - - temp_html = null - var/temp_header_html = null - var/temp_footer_html = null - - scanner_status_html = null // Scanner status is reset each update - var/mob/living/occupant = scanner.occupant - var/viable_occupant = (occupant && occupant.dna && !(NOCLONE in occupant.mutations)) - var/mob/living/carbon/human/human_occupant = scanner.occupant - - if (href_list["screen"]) // Passing a screen is only a request, we set current_screen here but it can be overridden below if necessary - current_screen = href_list["screen"] - - if (!viable_occupant) // If there is no viable occupant only allow certain screens - var/allowed_no_occupant_screens = list("mainmenu", "radsetmenu", "buffermenu") //These are the screens which will be allowed if there's no occupant - if (!(current_screen in allowed_no_occupant_screens)) - href_list = new /list(0) // clear list of options - current_screen = "mainmenu" - - - if (!current_screen) // If no screen is set default to mainmenu - current_screen = "mainmenu" - - - if (!scanner) //Is the scanner not connected? - scanner_status_html = "ERROR: No DNA Scanner connected." - current_screen = null // blank does not exist in the switch below, so no screen will be outputted - updateUsrDialog() - return - - usr.set_machine(src) - if (href_list["locked"]) - if (scanner.occupant) - scanner.locked = !( scanner.locked ) - //////////////////////////////////////////////////////// - if (href_list["genpulse"]) - if(!viable_occupant)//Makes sure someone is in there (And valid) before trying anything - temp_html = text("No viable occupant detected.")//More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason - //usr << browse(temp_html, "window=scannernew;size=550x650") - //onclose(usr, "scannernew") - popup.set_content(temp_html) - popup.open() - else - - temp_html = text("Working ... Please wait ([] Seconds)", radduration) - popup.set_content(temp_html) - popup.open() - var/lock_state = scanner.locked - scanner.locked = 1//lock it - sleep(10*radduration) - if (!scanner.occupant) - temp_html = null - return null - if (prob(95)) - if(prob(75)) - randmutb(scanner.occupant) - else - randmuti(scanner.occupant) - else - if(prob(95)) - randmutg(scanner.occupant) - else - randmuti(scanner.occupant) - scanner.occupant.radiation += ((radstrength*3)+radduration*3) - scanner.locked = lock_state - temp_html = null - dopage(src,"screen=radsetmenu") - if (href_list["radleplus"]) - if(!viable_occupant) - temp_html = text("No viable occupant detected.") - popup.set_content(temp_html) - popup.open() - if (radduration < 20) - radduration++ - radduration++ - dopage(src,"screen=radsetmenu") - if (href_list["radleminus"]) - if(!viable_occupant) - temp_html = text("No viable occupant detected.") - popup.set_content(temp_html) - popup.open() - if (radduration > 2) - radduration-- - radduration-- - dopage(src,"screen=radsetmenu") - if (href_list["radinplus"]) - if (radstrength < 10) - radstrength++ - dopage(src,"screen=radsetmenu") - if (href_list["radinminus"]) - if (radstrength > 1) - radstrength-- - dopage(src,"screen=radsetmenu") - //////////////////////////////////////////////////////// - if (href_list["unimenuplus"]) - if (ui_block < 13) - ui_block++ - else - ui_block = 1 - dopage(src,"screen=unimenu") - if (href_list["unimenuminus"]) - if (ui_block > 1) - ui_block-- - else - ui_block = 13 - dopage(src,"screen=unimenu") - if (href_list["unimenusubplus"]) - if (subblock < 3) - subblock++ - else - subblock = 1 - dopage(src,"screen=unimenu") - if (href_list["unimenusubminus"]) - if (subblock > 1) - subblock-- - else - subblock = 3 - dopage(src,"screen=unimenu") - if (href_list["unimenutargetplus"]) - if (unitarget < 15) - unitarget++ - unitargethex = unitarget - switch(unitarget) - if(10) - unitargethex = "A" - if(11) - unitargethex = "B" - if(12) - unitargethex = "C" - if(13) - unitargethex = "D" - if(14) - unitargethex = "E" - if(15) - unitargethex = "F" - else - unitarget = 0 - unitargethex = 0 - dopage(src,"screen=unimenu") - if (href_list["unimenutargetminus"]) - if (unitarget > 0) - unitarget-- - unitargethex = unitarget - switch(unitarget) - if(10) - unitargethex = "A" - if(11) - unitargethex = "B" - if(12) - unitargethex = "C" - if(13) - unitargethex = "D" - if(14) - unitargethex = "E" - else - unitarget = 15 - unitargethex = "F" - dopage(src,"screen=unimenu") - if (href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click - var/menuset = text2num(href_list["uimenuset"]) - var/menusubset = text2num(href_list["uimenusubset"]) - if ((menuset <= 13) && (menuset >= 1)) - ui_block = menuset - if ((menusubset <= 3) && (menusubset >= 1)) - subblock = menusubset - dopage(src, "unimenu") - if (href_list["unipulse"]) - if(scanner.occupant) - var/block - var/newblock - var/tstructure2 - block = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),subblock,1) - - temp_html = text("Working ... Please wait ([] Seconds)", radduration) - popup.set_content(temp_html) - popup.open() - var/lock_state = scanner.locked - scanner.locked = 1//lock it - sleep(10*radduration) - if (!scanner.occupant) - temp_html = null - return null - /// - if (prob((80 + (radduration / 2)))) - block = miniscrambletarget(num2text(unitarget), radstrength, radduration) - newblock = null - if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1) - if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1) - if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + block - tstructure2 = setblock(scanner.occupant.dna.uni_identity, ui_block, newblock,3) - scanner.occupant.dna.uni_identity = tstructure2 - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += (radstrength+radduration) - else - if (prob(20+radstrength)) - randmutb(scanner.occupant) - domutcheck(scanner.occupant,scanner) - else - randmuti(scanner.occupant) - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += ((radstrength*2)+radduration) - scanner.locked = lock_state - dopage(src,"screen=unimenu") - - //////////////////////////////////////////////////////// - if (href_list["rejuv"]) - if(!viable_occupant) - temp_html = text("No viable occupant detected.") - popup.set_content(temp_html) - popup.open() - else - if(human_occupant) - if (human_occupant.reagents.get_reagent_amount("inaprovaline") < REJUVENATORS_MAX) - if (human_occupant.reagents.get_reagent_amount("inaprovaline") < (REJUVENATORS_MAX - REJUVENATORS_INJECT)) - human_occupant.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT) - else - human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline"))) - //usr << text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline")) - - //////////////////////////////////////////////////////// - if (href_list["strucmenuplus"]) - if (se_block < 14) - se_block++ - else - se_block = 1 - dopage(src,"screen=strucmenu") - if (href_list["strucmenuminus"]) - if (se_block > 1) - se_block-- - else - se_block = 14 - dopage(src,"screen=strucmenu") - if (href_list["strucmenusubplus"]) - if (subblock < 3) - subblock++ - else - subblock = 1 - dopage(src,"screen=strucmenu") - if (href_list["strucmenusubminus"]) - if (subblock > 1) - subblock-- - else - subblock = 3 - dopage(src,"screen=strucmenu") - if (href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes) - var/menuset = text2num(href_list["semenuset"]) - var/menusubset = text2num(href_list["semenusubset"]) - if ((menuset <= 14) && (menuset >= 1)) - se_block = menuset - if ((menusubset <= 3) && (menusubset >= 1)) - subblock = menusubset - dopage(src, "strucmenu") - if (href_list["strucpulse"]) - var/block - var/newblock - var/tstructure2 - var/oldblock - var/lock_state = scanner.locked - scanner.locked = 1//lock it - if (viable_occupant) - block = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),subblock,1) - - temp_html = text("Working ... Please wait ([] Seconds)", radduration) - popup.set_content(temp_html) - popup.open() - sleep(10*radduration) - else - temp_html = null - return null - /// - if(viable_occupant) - if (prob((80 + (radduration / 2)))) - if ((se_block != 2 || se_block != 12 || se_block != 8 || se_block || 10) && prob (20)) - oldblock = se_block - block = miniscramble(block, radstrength, radduration) - newblock = null - if (se_block > 1 && se_block < 5) - se_block++ - else if (se_block > 5 && se_block < 14) - se_block-- - if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1) - if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1) - if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block - tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3) - scanner.occupant.dna.struc_enzymes = tstructure2 - domutcheck(scanner.occupant,scanner) - scanner.occupant.radiation += (radstrength+radduration) - se_block = oldblock - else - // - block = miniscramble(block, radstrength, radduration) - newblock = null - if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1) - if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1) - if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block - tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3) - scanner.occupant.dna.struc_enzymes = tstructure2 - domutcheck(scanner.occupant,scanner) - scanner.occupant.radiation += (radstrength+radduration) - else - if (prob(80-radduration)) - randmutb(scanner.occupant) - domutcheck(scanner.occupant,scanner) - else - randmuti(scanner.occupant) - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - scanner.occupant.radiation += ((radstrength*2)+radduration) - scanner.locked = lock_state - /// - dopage(src,"screen=strucmenu") - - //////////////////////////////////////////////////////// - if (href_list["b1addui"]) - if(scanner.occupant && scanner.occupant.dna) - buffer1iue = 0 - buffer1 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer1owner = scanner.occupant.name - else - buffer1owner = scanner.occupant.real_name - buffer1label = "Unique Identifier" - buffer1type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b1adduiue"]) - if(scanner.occupant && scanner.occupant.dna) - buffer1 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer1owner = scanner.occupant.name - else - buffer1owner = scanner.occupant.real_name - buffer1label = "Unique Identifier & Unique Enzymes" - buffer1type = "ui" - buffer1iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b2adduiue"]) - if(scanner.occupant && scanner.occupant.dna) - buffer2 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer2owner = scanner.occupant.name - else - buffer2owner = scanner.occupant.real_name - buffer2label = "Unique Identifier & Unique Enzymes" - buffer2type = "ui" - buffer2iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b3adduiue"]) - if(scanner.occupant && scanner.occupant.dna) - buffer3 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer3owner = scanner.occupant.name - else - buffer3owner = scanner.occupant.real_name - buffer3label = "Unique Identifier & Unique Enzymes" - buffer3type = "ui" - buffer3iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b2addui"]) - if(scanner.occupant && scanner.occupant.dna) - buffer2iue = 0 - buffer2 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer2owner = scanner.occupant.name - else - buffer2owner = scanner.occupant.real_name - buffer2label = "Unique Identifier" - buffer2type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b3addui"]) - if(scanner.occupant && scanner.occupant.dna) - buffer3iue = 0 - buffer3 = scanner.occupant.dna.uni_identity - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer3owner = scanner.occupant.name - else - buffer3owner = scanner.occupant.real_name - buffer3label = "Unique Identifier" - buffer3type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b1addse"]) - if(scanner.occupant && scanner.occupant.dna) - buffer1iue = 0 - buffer1 = scanner.occupant.dna.struc_enzymes - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer1owner = scanner.occupant.name - else - buffer1owner = scanner.occupant.real_name - buffer1label = "Structural Enzymes" - buffer1type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b2addse"]) - if(scanner.occupant && scanner.occupant.dna) - buffer2iue = 0 - buffer2 = scanner.occupant.dna.struc_enzymes - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer2owner = scanner.occupant.name - else - buffer2owner = scanner.occupant.real_name - buffer2label = "Structural Enzymes" - buffer2type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b3addse"]) - if(scanner.occupant && scanner.occupant.dna) - buffer3iue = 0 - buffer3 = scanner.occupant.dna.struc_enzymes - if (!istype(scanner.occupant,/mob/living/carbon/human)) - buffer3owner = scanner.occupant.name - else - buffer3owner = scanner.occupant.real_name - buffer3label = "Structural Enzymes" - buffer3type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b1clear"]) - buffer1 = null - buffer1owner = null - buffer1label = null - buffer1iue = null - dopage(src,"screen=buffermenu") - if (href_list["b2clear"]) - buffer2 = null - buffer2owner = null - buffer2label = null - buffer2iue = null - dopage(src,"screen=buffermenu") - if (href_list["b3clear"]) - buffer3 = null - buffer3owner = null - buffer3label = null - buffer3iue = null - dopage(src,"screen=buffermenu") - if (href_list["b1label"]) - buffer1label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b2label"]) - buffer2label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b3label"]) - buffer3label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b1transfer"]) - if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna) - return - if (buffer1type == "ui") - if (buffer1iue) - scanner.occupant.real_name = buffer1owner - scanner.occupant.name = buffer1owner - scanner.occupant.dna.uni_identity = buffer1 - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - else if (buffer1type == "se") - scanner.occupant.dna.struc_enzymes = buffer1 - domutcheck(scanner.occupant,scanner) - temp_html = "Transfered." - scanner.occupant.radiation += rand(20,50) - - if (href_list["b2transfer"]) - if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna) - return - if (buffer2type == "ui") - if (buffer2iue) - scanner.occupant.real_name = buffer2owner - scanner.occupant.name = buffer2owner - scanner.occupant.dna.uni_identity = buffer2 - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - else if (buffer2type == "se") - scanner.occupant.dna.struc_enzymes = buffer2 - domutcheck(scanner.occupant,scanner) - temp_html = "Transfered." - scanner.occupant.radiation += rand(20,50) - - if (href_list["b3transfer"]) - if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna) - return - if (buffer3type == "ui") - if (buffer3iue) - scanner.occupant.real_name = buffer3owner - scanner.occupant.name = buffer3owner - scanner.occupant.dna.uni_identity = buffer3 - updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity) - else if (buffer3type == "se") - scanner.occupant.dna.struc_enzymes = buffer3 - domutcheck(scanner.occupant,scanner) - temp_html = "Transfered." - scanner.occupant.radiation += rand(20,50) - - if (href_list["b1injector"]) - if (injectorready) - var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector - I.dna = buffer1 - I.dnatype = buffer1type - I.loc = loc - I.name += " ([buffer1label])" - if (buffer1iue) I.ue = buffer1owner //lazy haw haw - temp_html = "Injector created." - - injectorready = 0 - spawn(300) - injectorready = 1 - else - temp_html = "Replicator not ready yet." - - if (href_list["b2injector"]) - if (injectorready) - var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector - I.dna = buffer2 - I.dnatype = buffer2type - I.loc = loc - I.name += " ([buffer2label])" - if (buffer2iue) I.ue = buffer2owner //lazy haw haw - temp_html = "Injector created." - - injectorready = 0 - spawn(300) - injectorready = 1 - else - temp_html = "Replicator not ready yet." - - if (href_list["b3injector"]) - if (injectorready) - var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector - I.dna = buffer3 - I.dnatype = buffer3type - I.loc = loc - I.name += " ([buffer3label])" - if (buffer3iue) I.ue = buffer3owner //lazy haw haw - temp_html = "Injector created." - - injectorready = 0 - spawn(300) - injectorready = 1 - else - temp_html = "Replicator not ready yet." - - //////////////////////////////////////////////////////// - if (href_list["load_disk"]) - var/buffernum = text2num(href_list["load_disk"]) - if ((buffernum > 3) || (buffernum < 1)) - return - if ((isnull(diskette)) || (!diskette.data) || (diskette.data == "")) - return - switch(buffernum) - if(1) - buffer1 = diskette.data - buffer1type = diskette.data_type - buffer1iue = diskette.ue - buffer1owner = diskette.owner - if(2) - buffer2 = diskette.data - buffer2type = diskette.data_type - buffer2iue = diskette.ue - buffer2owner = diskette.owner - if(3) - buffer3 = diskette.data - buffer3type = diskette.data_type - buffer3iue = diskette.ue - buffer3owner = diskette.owner - temp_html = "Data loaded." - - if (href_list["save_disk"]) - var/buffernum = text2num(href_list["save_disk"]) - if ((buffernum > 3) || (buffernum < 1)) - return - if ((isnull(diskette)) || (diskette.read_only)) - return - switch(buffernum) - if(1) - diskette.data = buffer1 - diskette.data_type = buffer1type - diskette.ue = buffer1iue - diskette.owner = buffer1owner - diskette.name = "data disk - '[buffer1owner]'" - if(2) - diskette.data = buffer2 - diskette.data_type = buffer2type - diskette.ue = buffer2iue - diskette.owner = buffer2owner - diskette.name = "data disk - '[buffer2owner]'" - if(3) - diskette.data = buffer3 - diskette.data_type = buffer3type - diskette.ue = buffer3iue - diskette.owner = buffer3owner - diskette.name = "data disk - '[buffer3owner]'" - temp_html = "Data saved." - if (href_list["eject_disk"]) - if (!diskette) - return - diskette.loc = get_turf(src) - diskette = null - //////////////////////////////////////////////////////// - - temp_html = temp_header_html - switch(current_screen) - if ("mainmenu") - temp_html += "

Main Menu

" - if (viable_occupant) //is there REALLY someone in there who can be modified? - temp_html += text("Modify Unique Identifier
", src) - temp_html += text("Modify Structural Enzymes

", src) - else - temp_html += "Modify Unique Identifier
" - temp_html += "Modify Structural Enzymes

" - temp_html += text("Radiation Emitter Settings

", src) - temp_html += text("Transfer Buffer

", src) - - if ("unimenu") - if(!viable_occupant) - temp_html = text("No viable occupant detected.") - popup.set_content(temp_html) - popup.open() - else - temp_html = "<< Main Menu
" - temp_html += "

Modify Unique Identifier

" - temp_html += "
Unique Identifier:
[getblockstring(scanner.occupant.dna.uni_identity,ui_block,subblock,3, src,1)]

" - temp_html += "Selected Block: <- [ui_block] ->

" - temp_html += "Selected Sub-Block: <- [subblock] ->

" - temp_html += "Selected Target: <- [unitargethex] ->

" - temp_html += "Modify Block
" - temp_html += "Irradiate
" - - if ("strucmenu") - if(!viable_occupant) - temp_html = text("No viable occupant detected.") - popup.set_content(temp_html) - popup.open() - else - temp_html = "<< Main Menu
" - temp_html += "

Modify Structural Enzymes

" - temp_html += "
Structural Enzymes: [getblockstring(scanner.occupant.dna.struc_enzymes,se_block,subblock,3,src,0)]

" - temp_html += "Selected Block: <- [se_block] ->

" - temp_html += "Selected Sub-Block: <- [subblock] ->

" - temp_html += "Modify Block
" - temp_html += "Irradiate
" - - if ("radsetmenu") - temp_html = "<< Main Menu
" - temp_html += "

Radiation Emitter Settings

" - if (viable_occupant) - temp_html += text("Pulse Radiation", src) - else - temp_html += "Pulse Radiation" - temp_html += "

Radiation Duration: - [radduration] +
" - temp_html += "Radiation Intensity: - [radstrength] +

" - - if ("buffermenu") - temp_html = "<< Main Menu
" - temp_html += "

Transfer Buffer

" - temp_html += "

Buffer 1:

" - if (!(buffer1)) - temp_html += "Buffer Empty
" - else - temp_html += text("Data: []
", buffer1) - temp_html += text("By: []
", buffer1owner) - temp_html += text("Label: []
", buffer1label) - if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (buffer1) temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (buffer1) temp_html += text("Isolate Block
", src) - if (buffer1) temp_html += "Disk: Save To | Load From
" - if (buffer1) temp_html += text("Edit Label
", src) - if (buffer1) temp_html += text("Clear Buffer

", src) - if (!buffer1) temp_html += "
" - temp_html += "

Buffer 2:

" - if (!(buffer2)) - temp_html += "Buffer Empty
" - else - temp_html += text("Data: []
", buffer2) - temp_html += text("By: []
", buffer2owner) - temp_html += text("Label: []
", buffer2label) - if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (buffer2) temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (buffer2) temp_html += text("Isolate Block
", src) - if (buffer2) temp_html += "Disk: Save To | Load From
" - if (buffer2) temp_html += text("Edit Label
", src) - if (buffer2) temp_html += text("Clear Buffer

", src) - if (!buffer2) temp_html += "
" - temp_html += "

Buffer 3:

" - if (!(buffer3)) - temp_html += "Buffer Empty
" - else - temp_html += text("Data: []
", buffer3) - temp_html += text("By: []
", buffer3owner) - temp_html += text("Label: []
", buffer3label) - if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (buffer3) temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (buffer3) temp_html += text("Isolate Block
", src) - if (buffer3) temp_html += "Disk: Save To | Load From
" - if (buffer3) temp_html += text("Edit Label
", src) - if (buffer3) temp_html += text("Clear Buffer

", src) - if (!buffer3) temp_html += "
" - temp_html += temp_footer_html - - if(viable_occupant && !scanner_status_html && occupant) //is there REALLY someone in there? - scanner_status_html = "
Health:
[occupant.health]%
" - scanner_status_html += "
Radiation Level:
[occupant.radiation]%
" - if(human_occupant) - var/rejuvenators = round(human_occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100) - scanner_status_html += "
Rejuvenators:
[human_occupant.reagents.get_reagent_amount("inaprovaline")] units
" - - if (current_screen == "mainmenu") - scanner_status_html += "
Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
" - scanner_status_html += "
Unique Identifier:
[occupant.dna.uni_identity]
" - scanner_status_html += "
Structural Enzymes:
[occupant.dna.struc_enzymes]
" - - var/dat = "

Scanner Status

" - - var/occupant_status = "Scanner Unoccupied" - if(occupant && occupant.dna) //is there REALLY someone in there? - if (!istype(occupant,/mob/living/carbon/human)) - sleep(1) - if(NOCLONE in occupant.mutations) - occupant_status = "Invalid DNA structure" - else - switch(occupant.stat) // obvious, see what their status is - if(0) - occupant_status = "Conscious" - if(1) - occupant_status = "Unconscious" - else - occupant_status = "DEAD" - - occupant_status = "[occupant.name] => [occupant_status]
" - - dat += "
[occupant_status][scanner_status_html]
" - - var/scanner_access_text = "Lock Scanner" - if (scanner.locked) - scanner_access_text = "Unlock Scanner" - - dat += "Scan " - - if (occupant && occupant.dna) - dat += "[scanner_access_text] " - if (human_occupant) - dat += "Inject Rejuvenators
" - else - dat += "Inject Rejuvenators
" - else - dat += "[scanner_access_text] " - dat += "Inject Rejuvenators
" - - if (!isnull(diskette)) - dat += text("Eject Disk
", src) - - dat += "
" - - if (temp_html) - dat += temp_html - - popup.set_content(dat) - popup.open() -*/ \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/shuttle.dm b/code/WorkInProgress/computer3/computers/shuttle.dm deleted file mode 100644 index 5d5fab6528..0000000000 --- a/code/WorkInProgress/computer3/computers/shuttle.dm +++ /dev/null @@ -1,75 +0,0 @@ -/* - This may not migrate to C3. It's basically a machine in the guise of a computer; - there is nothing interactive about it. -*/ - -/obj/machinery/computer3/shuttle - name = "Shuttle" - desc = "For shuttle control." - icon_state = "shuttle" - var/auth_need = 3.0 - var/list/authorized = list( ) - - - attackby(var/obj/item/card/W as obj, var/mob/user as mob) - if(stat & (BROKEN|NOPOWER)) return - if ((!( istype(W, /obj/item/card) ) || !( ticker ) || emergency_shuttle.location != 1 || !( user ))) return - if (istype(W, /obj/item/card/id)||istype(W, /obj/item/device/pda)) - if (istype(W, /obj/item/device/pda)) - var/obj/item/device/pda/pda = W - W = pda.id - if (!W:access) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " - return - - var/list/cardaccess = W:access - if(!istype(cardaccess, /list) || !cardaccess.len) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " - return - - if(!(access_heads in W:access)) //doesn't have this access - user << "The access level of [W:registered_name]\'s card is not high enough. " - return 0 - - var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(emergency_shuttle.location != 1 && user.get_active_hand() != W) - return 0 - switch(choice) - if("Authorize") - src.authorized -= W:registered_name - src.authorized += W:registered_name - if (src.auth_need - src.authorized.len > 0) - message_admins("[key_name_admin(user)] has authorized early shuttle launch") - log_game("[user.ckey] has authorized early shuttle launch") - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) - else - message_admins("[key_name_admin(user)] has launched the shuttle") - log_game("[user.ckey] has launched the shuttle early") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" - emergency_shuttle.online = 1 - emergency_shuttle.settimeleft(10) - //src.authorized = null - del(src.authorized) - src.authorized = list( ) - - if("Repeal") - src.authorized -= W:registered_name - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) - - if("Abort") - world << "\blue All authorizations to shorting time for shuttle launch have been revoked!" - src.authorized.len = 0 - src.authorized = list( ) - - else if (istype(W, /obj/item/card/emag) && !emagged) - var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") - - if(!emagged && emergency_shuttle.location == 1 && user.get_active_hand() == W) - switch(choice) - if("Launch") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" - emergency_shuttle.settimeleft( 10 ) - emagged = 1 - if("Cancel") - return - return diff --git a/code/WorkInProgress/computer3/computers/specops_shuttle.dm b/code/WorkInProgress/computer3/computers/specops_shuttle.dm deleted file mode 100644 index 81c94614cf..0000000000 --- a/code/WorkInProgress/computer3/computers/specops_shuttle.dm +++ /dev/null @@ -1,246 +0,0 @@ -//Config stuff -#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves. -#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station -#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock - -var/specops_shuttle_moving_to_station = 0 -var/specops_shuttle_moving_to_centcom = 0 -var/specops_shuttle_at_station = 0 -var/specops_shuttle_can_send = 1 -var/specops_shuttle_time = 0 -var/specops_shuttle_timeleft = 0 - -/obj/machinery/computer3/specops_shuttle - name = "Spec. Ops. Shuttle Console" - icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" - req_access = list(access_cent_specops) - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - -/proc/specops_process() - var/area/centcom/control/cent_com = locate()//To find announcer. This area should exist for this proc to work. - var/area/centcom/specops/special_ops = locate()//Where is the specops area located? - var/mob/living/silicon/decoy/announcer = locate() in cent_com//We need a fake AI to announce some stuff below. Otherwise it will be wonky. - - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. - var/message = "THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH"//Initial message shown. - if(announcer) - announcer.say(message) - message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD" - announcer.say(message) - - while(specops_shuttle_time - world.timeofday > 0) - var/ticksleft = specops_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - specops_shuttle_time = world.timeofday + 10 // midnight rollover - specops_shuttle_timeleft = (ticksleft / 10) - - //All this does is announce the time before launch. - if(announcer) - var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions. - if(rounded_time_left in message_tracker)//If that time is in the list for message announce. - message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN" - if(rounded_time_left==0) - message = "ALERT: TAKEOFF" - announcer.say(message) - message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle. - //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. - - sleep(5) - - specops_shuttle_moving_to_station = 0 - specops_shuttle_moving_to_centcom = 0 - - specops_shuttle_at_station = 1 - if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return - - if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." - return - - //Begin Marauder launchpad. - spawn(0)//So it parallel processes it. - for(var/obj/machinery/door/poddoor/M in special_ops) - switch(M.id) - if("ASSAULT0") - spawn(10)//1 second delay between each. - M.open() - if("ASSAULT1") - spawn(20) - M.open() - if("ASSAULT2") - spawn(30) - M.open() - if("ASSAULT3") - spawn(40) - M.open() - - sleep(10) - - var/spawn_marauder[] = new() - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Marauder Entry") - spawn_marauder.Add(L) - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Marauder Exit") - var/obj/effect/portal/P = new(L.loc) - P.invisibility = 101//So it is not seen by anyone. - P.failchance = 0//So it has no fail chance when teleporting. - P.target = pick(spawn_marauder)//Where the marauder will arrive. - spawn_marauder.Remove(P.target) - - sleep(10) - - for(var/obj/machinery/mass_driver/M in special_ops) - switch(M.id) - if("ASSAULT0") - spawn(10) - M.drive() - if("ASSAULT1") - spawn(20) - M.drive() - if("ASSAULT2") - spawn(30) - M.drive() - if("ASSAULT3") - spawn(40) - M.drive() - - sleep(50)//Doors remain open for 5 seconds. - - for(var/obj/machinery/door/poddoor/M in special_ops) - switch(M.id)//Doors close at the same time. - if("ASSAULT0") - spawn(0) - M.close() - if("ASSAULT1") - spawn(0) - M.close() - if("ASSAULT2") - spawn(0) - M.close() - if("ASSAULT3") - spawn(0) - M.close() - special_ops.readyreset()//Reset firealarm after the team launched. - //End Marauder launchpad. - - var/area/start_location = locate(/area/shuttle/specops/centcom) - var/area/end_location = locate(/area/shuttle/specops/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - del(T) - - start_location.move_contents_to(end_location) - - for(var/turf/T in get_area_turfs(end_location) ) - var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" - -/proc/specops_can_move() - if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return 0 - else return 1 - -/obj/machinery/computer3/specops_shuttle/attackby(I as obj, user as mob) - return attack_hand(user) - -/obj/machinery/computer3/specops_shuttle/attack_ai(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/specops_shuttle/attack_paw(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/specops_shuttle/attackby(I as obj, user as mob) - if(istype(I,/obj/item/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." - else - return attack_hand(user) - -/obj/machinery/computer3/specops_shuttle/attack_hand(var/mob/user as mob) - if(!allowed(user)) - user << "\red Access Denied." - return - - if (sent_strike_team == 0) - usr << "\red The strike team has not yet deployed." - return - - if(..()) - return - - user.set_machine(src) - var/dat - if (temp) - dat = temp - else - dat += {" - Location: [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "Departing for [station_name] in ([specops_shuttle_timeleft] seconds.)":specops_shuttle_at_station ? "Station":"Dock"]
- [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*
\n
":specops_shuttle_at_station ? "\nShuttle Offline
\n
":"\nDepart to [station_name]
\n
"] - \nClose"} - - //user << browse(dat, "window=computer;size=575x450") - //onclose(user, "computer") - var/datum/browser/popup = new(user, "computer", "Special Operations Shuttle", 575, 450) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer3/specops_shuttle/Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if (href_list["sendtodock"]) - if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return - - usr << "\blue Central Command will not allow the Special Operations shuttle to return." - return - - else if (href_list["sendtostation"]) - if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return - - if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." - return - - usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds." - - temp += "Shuttle departing.

OK" - updateUsrDialog() - - var/area/centcom/specops/special_ops = locate() - if(special_ops) - special_ops.readyalert()//Trigger alarm for the spec ops area. - specops_shuttle_moving_to_station = 1 - - specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME - spawn(0) - specops_process() - - else if (href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/station_alert.dm b/code/WorkInProgress/computer3/computers/station_alert.dm deleted file mode 100644 index 850bfc83c5..0000000000 --- a/code/WorkInProgress/computer3/computers/station_alert.dm +++ /dev/null @@ -1,97 +0,0 @@ -/obj/machinery/computer3/station_alert - default_prog = /datum/file/program/station_alert - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio) - icon_state = "frame-eng" - - -/datum/file/program/station_alert - name = "Station Alert Console" - desc = "Used to access the station's automated alert system." - active_state = "alert:0" - var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list()) - - interact(mob/user) - usr.set_machine(src) - if(!interactable()) - return - var/dat = "Current Station Alerts\n" - dat += "Close

" - for (var/cat in src.alarms) - dat += text("[]
\n", cat) - var/list/L = src.alarms[cat] - if (L.len) - for (var/alarm in L) - var/list/alm = L[alarm] - var/area/A = alm[1] - var/list/sources = alm[3] - dat += "" - dat += "• " - dat += "[A.name]" - if (sources.len > 1) - dat += text(" - [] sources", sources.len) - dat += "
\n" - else - dat += "-- All Systems Nominal
\n" - dat += "
\n" - //user << browse(dat, "window=alerts") - //onclose(user, "alerts") - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - - - Topic(href, href_list) - if(..()) - return - return - - - proc/triggerAlarm(var/class, area/A, var/O, var/alarmsource) - var/list/L = src.alarms[class] - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/sources = alarm[3] - if (!(alarmsource in sources)) - sources += alarmsource - return 1 - var/obj/machinery/camera/C = null - var/list/CL = null - if (O && istype(O, /list)) - CL = O - if (CL.len == 1) - C = CL[1] - else if (O && istype(O, /obj/machinery/camera)) - C = O - L[A.name] = list(A, (C) ? C : O, list(alarmsource)) - return 1 - - - proc/cancelAlarm(var/class, area/A as area, obj/origin) - var/list/L = src.alarms[class] - var/cleared = 0 - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - return !cleared - - - - process() - var/active_alarms = 0 - for (var/cat in src.alarms) - var/list/L = src.alarms[cat] - if(L.len) active_alarms = 1 - if(active_alarms) - active_state = "alert:2" - else - active_state = "alert:0" - ..() - return diff --git a/code/WorkInProgress/computer3/computers/syndicate_shuttle.dm b/code/WorkInProgress/computer3/computers/syndicate_shuttle.dm deleted file mode 100644 index ccd711788b..0000000000 --- a/code/WorkInProgress/computer3/computers/syndicate_shuttle.dm +++ /dev/null @@ -1,103 +0,0 @@ -#define SYNDICATE_SHUTTLE_MOVE_TIME 240 -#define SYNDICATE_SHUTTLE_COOLDOWN 200 - -/obj/machinery/computer3/syndicate_station - name = "syndicate shuttle terminal" - icon = 'icons/obj/computer.dmi' - icon_state = "syndishuttle" - req_access = list(access_syndicate) - var/area/curr_location - var/moving = 0 - var/lastMove = 0 - - -/obj/machinery/computer3/syndicate_station/New() - curr_location= locate(/area/syndicate_station/start) - - -/obj/machinery/computer3/syndicate_station/proc/syndicate_move_to(area/destination as area) - if(moving) return - if(lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return - var/area/dest_location = locate(destination) - if(curr_location == dest_location) return - - moving = 1 - lastMove = world.time - - if(curr_location.z != dest_location.z) - var/area/transit_location = locate(/area/syndicate_station/transit) - curr_location.move_contents_to(transit_location) - curr_location = transit_location - sleep(SYNDICATE_SHUTTLE_MOVE_TIME) - - curr_location.move_contents_to(dest_location) - curr_location = dest_location - moving = 0 - return 1 - - -/obj/machinery/computer3/syndicate_station/attackby(obj/item/I as obj, mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_station/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_station/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_station/attack_hand(mob/user as mob) - if(!allowed(user)) - user << "\red Access Denied" - return - - user.set_machine(src) - - var/dat = {"Location: [curr_location]
- Ready to move[max(lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
- Syndicate Space
- North West of SS13 | - North of SS13 | - North East of SS13
- South West of SS13 | - South of SS13 | - South East of SS13
- North East of the Mining Asteroid
- Close"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - - -/obj/machinery/computer3/syndicate_station/Topic(href, href_list) - if(!isliving(usr)) return - var/mob/living/user = usr - - if(in_range(src, user) || istype(user, /mob/living/silicon)) - user.set_machine(src) - - if(href_list["syndicate"]) - syndicate_move_to(/area/syndicate_station/start) - else if(href_list["station_nw"]) - syndicate_move_to(/area/syndicate_station/northwest) - else if(href_list["station_n"]) - syndicate_move_to(/area/syndicate_station/north) - else if(href_list["station_ne"]) - syndicate_move_to(/area/syndicate_station/northeast) - else if(href_list["station_sw"]) - syndicate_move_to(/area/syndicate_station/southwest) - else if(href_list["station_s"]) - syndicate_move_to(/area/syndicate_station/south) - else if(href_list["station_se"]) - syndicate_move_to(/area/syndicate_station/southeast) -// else if(href_list["commssat"]) -// syndicate_move_to(/area/syndicate_station/commssat) - else if(href_list["mining"]) - syndicate_move_to(/area/syndicate_station/mining) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer3/syndicate_station/bullet_act(var/obj/item/projectile/Proj) - visible_message("[Proj] ricochets off [src]!") //let's not let them fuck themselves in the rear \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/syndicate_specops_shuttle.dm b/code/WorkInProgress/computer3/computers/syndicate_specops_shuttle.dm deleted file mode 100644 index 61dc0ba975..0000000000 --- a/code/WorkInProgress/computer3/computers/syndicate_specops_shuttle.dm +++ /dev/null @@ -1,259 +0,0 @@ -//Config stuff -#define SYNDICATE_ELITE_MOVETIME 600 //Time to station is deciseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves. -#define SYNDICATE_ELITE_STATION_AREATYPE "/area/shuttle/syndicate_elite/station" //Type of the spec ops shuttle area for station -#define SYNDICATE_ELITE_DOCK_AREATYPE "/area/shuttle/syndicate_elite/mothership" //Type of the spec ops shuttle area for dock - -var/syndicate_elite_shuttle_moving_to_station = 0 -var/syndicate_elite_shuttle_moving_to_mothership = 0 -var/syndicate_elite_shuttle_at_station = 0 -var/syndicate_elite_shuttle_can_send = 1 -var/syndicate_elite_shuttle_time = 0 -var/syndicate_elite_shuttle_timeleft = 0 - -/obj/machinery/computer3/syndicate_elite_shuttle - name = "Elite Syndicate Squad Shuttle Console" - icon = 'icons/obj/computer.dmi' - icon_state = "syndishuttle" - req_access = list(access_cent_specops) - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - -/proc/syndicate_elite_process() - var/area/syndicate_mothership/control/syndicate_ship = locate()//To find announcer. This area should exist for this proc to work. - var/area/syndicate_mothership/elite_squad/elite_squad = locate()//Where is the specops area located? - var/mob/living/silicon/decoy/announcer = locate() in syndicate_ship//We need a fake AI to announce some stuff below. Otherwise it will be wonky. - - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. - var/message = "THE SYNDICATE ELITE SHUTTLE IS PREPARING FOR LAUNCH"//Initial message shown. - if(announcer) - announcer.say(message) - // message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD" - // announcer.say(message) - - while(syndicate_elite_shuttle_time - world.timeofday > 0) - var/ticksleft = syndicate_elite_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - syndicate_elite_shuttle_time = world.timeofday // midnight rollover - syndicate_elite_shuttle_timeleft = (ticksleft / 10) - - //All this does is announce the time before launch. - if(announcer) - var/rounded_time_left = round(syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions. - if(rounded_time_left in message_tracker)//If that time is in the list for message announce. - message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN" - if(rounded_time_left==0) - message = "ALERT: TAKEOFF" - announcer.say(message) - message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle. - //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. - - sleep(5) - - syndicate_elite_shuttle_moving_to_station = 0 - syndicate_elite_shuttle_moving_to_mothership = 0 - - syndicate_elite_shuttle_at_station = 1 - if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - - if (!syndicate_elite_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." - return - - sleep(600) -/* - //Begin Marauder launchpad. - spawn(0)//So it parallel processes it. - for(var/obj/machinery/door/poddoor/M in elite_squad) - switch(M.id) - if("ASSAULT0") - spawn(10)//1 second delay between each. - M.open() - if("ASSAULT1") - spawn(20) - M.open() - if("ASSAULT2") - spawn(30) - M.open() - if("ASSAULT3") - spawn(40) - M.open() - - sleep(10) - - var/spawn_marauder[] = new() - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Marauder Entry") - spawn_marauder.Add(L) - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Marauder Exit") - var/obj/effect/portal/P = new(L.loc) - P.invisibility = 101//So it is not seen by anyone. - P.failchance = 0//So it has no fail chance when teleporting. - P.target = pick(spawn_marauder)//Where the marauder will arrive. - spawn_marauder.Remove(P.target) - - sleep(10) - - for(var/obj/machinery/mass_driver/M in elite_squad) - switch(M.id) - if("ASSAULT0") - spawn(10) - M.drive() - if("ASSAULT1") - spawn(20) - M.drive() - if("ASSAULT2") - spawn(30) - M.drive() - if("ASSAULT3") - spawn(40) - M.drive() - - sleep(50)//Doors remain open for 5 seconds. - - for(var/obj/machinery/door/poddoor/M in elite_squad) - switch(M.id)//Doors close at the same time. - if("ASSAULT0") - spawn(0) - M.close() - if("ASSAULT1") - spawn(0) - M.close() - if("ASSAULT2") - spawn(0) - M.close() - if("ASSAULT3") - spawn(0) - M.close() - */ - elite_squad.readyreset()//Reset firealarm after the team launched. - //End Marauder launchpad. -/* - var/obj/explosionmarker = locate("Syndicate Breach Area") - if(explosionmarker) - var/turf/simulated/T = explosionmarker.loc - if(T) - explosion(T,4,6,8,10,0) - - sleep(40) -// proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1) - -*/ - var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership) - var/area/end_location = locate(/area/shuttle/syndicate_elite/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs = T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - del(T) - - start_location.move_contents_to(end_location) - - for(var/turf/T in get_area_turfs(end_location) ) - var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" - -/proc/syndicate_elite_can_move() - if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 - else return 1 - -/obj/machinery/computer3/syndicate_elite_shuttle/attackby(I as obj, user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_elite_shuttle/attack_ai(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_elite_shuttle/attack_paw(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer3/syndicate_elite_shuttle/attackby(I as obj, user as mob) - if(istype(I,/obj/item/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." - else - return attack_hand(user) - -/obj/machinery/computer3/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) - if(!allowed(user)) - user << "\red Access Denied." - return - -// if (sent_syndicate_strike_team == 0) -// usr << "\red The strike team has not yet deployed." -// return - - if(..()) - return - - user.set_machine(src) - var/dat - if (temp) - dat = temp - else - dat = {"Location: [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership ? "Departing for [station_name] in ([syndicate_elite_shuttle_timeleft] seconds.)":syndicate_elite_shuttle_at_station ? "Station":"Dock"]
- [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership ? "\n*The Syndicate Elite shuttle is already leaving.*
\n
":syndicate_elite_shuttle_at_station ? "\nShuttle Offline
\n
":"\nDepart to [station_name]
\n
"] - \nClose"} - - //user << browse(dat, "window=computer;size=575x450") - //onclose(user, "computer") - var/datum/browser/popup = new(user, "computer", "Special Operations Shuttle", 575, 450) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer3/syndicate_elite_shuttle/Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if (href_list["sendtodock"]) - if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - - usr << "\blue The Syndicate will not allow the Elite Squad shuttle to return." - return - - else if (href_list["sendtostation"]) - if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - - if (!specops_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." - return - - usr << "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds." - - temp = "Shuttle departing.

OK" - updateUsrDialog() - - var/area/syndicate_mothership/elite_squad/elite_squad = locate() - if(elite_squad) - elite_squad.readyalert()//Trigger alarm for the spec ops area. - syndicate_elite_shuttle_moving_to_station = 1 - - syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME - spawn(0) - syndicate_elite_process() - - - else if (href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return \ No newline at end of file diff --git a/code/WorkInProgress/computer3/test_machines.dm b/code/WorkInProgress/computer3/test_machines.dm deleted file mode 100644 index 998937e634..0000000000 --- a/code/WorkInProgress/computer3/test_machines.dm +++ /dev/null @@ -1,86 +0,0 @@ - -/obj/machinery/computer3/testing - spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert, - /datum/file/program/security,/datum/file/program/card_comp, - /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications, - /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon, - - /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research, - /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison) - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder, - /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras, - /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area) - New(var/L,var/built=0) - if(!built && !battery) - battery = new /obj/item/weapon/cell(src) - ..(L,built) - -/obj/machinery/computer3/laptop/testing - spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert, - /datum/file/program/security,/datum/file/program/card_comp, - /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications, - /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon, - - /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research, - /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison) - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder, - /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras, - /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area) - New(var/L,var/built=0) - if(!built && !battery) - battery = new /obj/item/weapon/cell/super(src) - ..(L,built) - -/obj/machinery/computer3/wall_comp/testing - spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert, - /datum/file/program/security,/datum/file/program/card_comp, - /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications, - /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon, - - /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research, - /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison) - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder, - /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras, - /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area) - New(var/L,var/built=0) - if(!built && !battery) - battery = new /obj/item/weapon/cell(src) - ..(L,built) - -/obj/machinery/computer3/server/testing - spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert, - /datum/file/program/security,/datum/file/program/card_comp, - /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications, - /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon, - - /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research, - /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison) - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder, - /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras, - /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area) - New(var/L,var/built=0) - if(!built && !battery) - battery = new /obj/item/weapon/cell(src) - ..(L,built) - -/obj/machinery/computer3/server/rack/testing - spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert, - /datum/file/program/security,/datum/file/program/card_comp, - /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications, - /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon, - - /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research, - /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison) - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder, - /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras, - /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area) - New(var/L,var/built=0) - if(!built && !battery) - battery = new /obj/item/weapon/cell(src) - ..(L,built) - -/obj/item/weapon/storage/box/testing_disks - New() - ..() - for(var/typekey in typesof(/obj/item/weapon/disk/file) - /obj/item/weapon/disk/file) - new typekey(src) \ No newline at end of file diff --git a/code/WorkInProgress/computer3/upload/lawfile.dm b/code/WorkInProgress/computer3/upload/lawfile.dm deleted file mode 100644 index 7fcbac0066..0000000000 --- a/code/WorkInProgress/computer3/upload/lawfile.dm +++ /dev/null @@ -1,29 +0,0 @@ -/* - Computer3 law changes: - - * Laws are a file type - * Connecting to the AI requires a network connection - * Connecting to a borg requires a radio or network. - -*/ - -/datum/file/ai_law - var/list/hacklaws = null - var/zerolaw = null - var/list/corelaws = null - var/list/auxlaws = null - - var/configurable = 0 - - // override this when you need to be able to alter the parameters of the lawset - proc/configure() - return - - execute(var/datum/file/program/source) - if(istype(usr,/mob/living/silicon)) - return - if(istype(source,/datum/file/program/ntos)) - if(configurable) - configure() - return - if(istype(source,/datum/file/program/upload/ai)) \ No newline at end of file diff --git a/code/WorkInProgress/computer3/upload/programs.dm b/code/WorkInProgress/computer3/upload/programs.dm deleted file mode 100644 index bcf45159b6..0000000000 --- a/code/WorkInProgress/computer3/upload/programs.dm +++ /dev/null @@ -1,13 +0,0 @@ -/* - Note that as with existing ai upload, this is not an interactive program. - That means that the work is done in execute() rather than interact() -*/ - -/datum/file/program/upload/ai - execute(var/datum/file/program/source) - if(!interactable() || istype(usr,/mob/living/silicon)) - return 0 - if(!computer.net) - usr << "An indecipherable set of code flicks across the screen. Nothing else happens." - return - var/list/results = computer.net.get_machines \ No newline at end of file diff --git a/code/WorkInProgress/kilakk/responseteam.dm b/code/WorkInProgress/kilakk/responseteam.dm deleted file mode 100644 index 8e0cdbc638..0000000000 --- a/code/WorkInProgress/kilakk/responseteam.dm +++ /dev/null @@ -1,254 +0,0 @@ -// emergency response teams -// work in progress - -var/const/members_possible = 5 -var/const/members_required = 1 // We need at least *one* person ;_; -var/global/admin_emergency_team = 0 // Used for admin-spawned response teams -// 'sent_response_team' for automagic response teams - -/client/proc/response_team() - set name = "Dispatch Emergency Response Team" - set category = "Special Verbs" - set desc = "Send an emergency response team to the station" - - if(!holder) - usr << "\red Only administrators may use this command." - return - if(!ticker) - usr << "\red The game hasn't started yet!" - return - if(ticker.current_state == GAME_STATE_PREGAME) - usr << "\red The round hasn't started yet!" - return - if(admin_emergency_team || send_emergency_team) - usr << "\red Central Command has already dispatched an emergency response team!" - return - if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") - return - if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red - switch(alert("The station has not entered code red recently. Do you still want to dispatch a response team?",,"Yes","No")) - if("No") - return - - var/situation = null - while(!situation) - situation = copytext(sanitize(input(src, "Please specify the mission the emergency response team will undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN) - if(!situation) - if(alert("You haven't specified a mission. Exit the setup process?",,"No","Yes")=="Yes") - return - - if(admin_emergency_team || send_emergency_team) - usr << "\red Looks like somebody beat you to it!" - return - - admin_emergency_team = 1 - message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1) - log_admin("[key_name(usr)] used Dispatch Response Team.") - - var/member_number = members_possible - var/leader_selected = 0 - - // Shamelessly stolen nuke code - var/nuke_code - var/temp_code - for(var/obj/machinery/nuclearbomb/N in machines) - temp_code = text2num(N.r_code) - if(temp_code) - nuke_code = N.r_code - break - -/* var/list/candidates = list() // ghosts who can be picked - var/list/members = list() // ghosts who have been picked - for(var/mob/dead/observer/G in player_list) - if(!G.client.holder && !G.client.is_afk()) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - for(var/i=members_possible,(i>0&&candidates.len), i--) - var/candidate = input("Choose characters to spawn as response team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Active Players") as null|anything in candidates */ - - // I tried doing this differently. Ghosts get a pop-up box similar to pAIs and one-click-antag - // Biggest diff here is in how the candidates list is updated - alert(usr, "Active ghosts will be given a chance to choose whether or not they want to be considered for the emergency reponse team. This will take about 30 seconds.") // There's probably a better way to do this, with a fancy count-down timer or something - - var/list/candidates = list() - var/list/members = list() - var/time_passed = world.time - - for(var/mob/dead/observer/G in player_list) - if(!jobban_isbanned(G, "Syndicate") && !jobban_isbanned(G, "Emergency Response Team") && !jobban_isbanned(G, "Security Officer")) - spawn(0) - switch(alert(G, "Do you want to be considered for the Emergency Response Team? Please answer in 30 seconds!",,"Yes","No")) - if("Yes") - if((world.time-time_passed)>300) - return - candidates += G.key - if("No") - return - else - return - - sleep(300) - - if(candidates.len < members_required) - message_admins("Not enough people signed up for [key_name_admin(usr)]'s response team! Aborting.") - log_admin("Response Team aborted: Not Enough Signups.") - admin_emergency_team = 0 - return - - for(var/i=members_possible,(i>0&&candidates.len), i--) // The rest of the choosing process is just an input with a list of candidates on it - var/chosen = input("Time's up! Choose characters to spawn as reponse team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Considered Players") as null|anything in candidates - candidates -= chosen - members += chosen - - command_alert("Sensors indicate that [station_name()] has entered Code Red and is in need of assistance. We will prepare and dispatch an emergency response team to deal with the situation.", "NMV Icarus Command") - - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Response Team") - leader_selected = member_number == 1?1:0 // The last person selected will be the leader - - var/mob/living/carbon/human/new_member = spawn_response_team(L, leader_selected) - - new_member.age = !leader_selected ? rand(23,35) : rand(35,45) - - if(members.len) - new_member.key = pick(members) - members -= new_member.key - - if(!new_member.key) // It works ok? sort of - del(new_member) - break - - spawn(0) - - switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female")) - if("Male") - new_member.gender = MALE - if("Female") - new_member.gender = FEMALE - - var/new_name = input(new_member, "...Erm, what was your name again?", "Choose your name") as text - - if(!new_name) - new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name - new_member.name = usr.real_name - new_member.mind.name = usr.real_name - - else - new_member.real_name = new_name - new_member.name = new_name - new_member.mind.name = new_name - - // -- CHANGE APPEARANCE -- - var/new_tone = input(new_member, "Please select your new skin tone: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as num - - if(new_tone) - new_member.s_tone = max(min(round(text2num(new_tone)), 220), 1) - new_member.s_tone = -new_member.s_tone + 35 - - var/new_hair = input(new_member, "Please select your new hair color.","Character Generation") as color - - if(new_hair) - new_member.r_hair = hex2num(copytext(new_hair, 2, 4)) - new_member.g_hair = hex2num(copytext(new_hair, 4, 6)) - new_member.b_hair = hex2num(copytext(new_hair, 6, 8)) - - var/new_facial = input(new_member, "Please select your new facial hair color.","Character Generation") as color - - if(new_facial) - new_member.r_facial = hex2num(copytext(new_facial, 2, 4)) - new_member.g_facial = hex2num(copytext(new_facial, 4, 6)) - new_member.b_facial = hex2num(copytext(new_facial, 6, 8)) - - var/new_eyes = input(new_member, "Please select eye color.", "Character Generation") as color - - if(new_eyes) - new_member.r_eyes = hex2num(copytext(new_eyes, 2, 4)) - new_member.g_eyes = hex2num(copytext(new_eyes, 4, 6)) - new_member.b_eyes = hex2num(copytext(new_eyes, 6, 8)) - - var/new_hstyle = input(new_member, "Please select your new hair style!", "Grooming") as null|anything in hair_styles_list - - if(new_hstyle) - new_member.h_style = new_hstyle - - var/new_fstyle = input(new_member, "Please select your new facial hair style!", "Grooming") as null|anything in facial_hair_styles_list - - if(new_fstyle) - new_member.f_style = new_fstyle - - // -- END -- - - new_member.dna.ready_dna(new_member) - new_member.update_body(1) - new_member.update_hair(1) - - new_member.mind_initialize() - - new_member.mind.assigned_role = "Emergency Response Team" - new_member.mind.special_role = "Emergency Response Team" - ticker.mode.traitors |= new_member.mind // ERTs will show up at the end of the round on the "traitor" list - - // Join message - new_member << "\blue You are the Emergency Response Team[!leader_selected?"!":" Leader!
"] \nAs a response team [!leader_selected?"member":"leader"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]" - new_member.mind.store_memory("Mission Parameters: \red [situation].") - - // Leader join message - if(leader_selected) - new_member << "\red The Nuclear Authentication Code is: [nuke_code]. You are instructed not to detonate the nuclear device aboard [station_name()] unless absolutely necessary." - new_member.mind.store_memory("Nuclear Authentication Code: \red [nuke_code]") - - new_member.equip_response_team(leader_selected) // Start equipping them - - member_number-- - return 1 - -// Mob creation -/client/proc/spawn_response_team(obj/spawn_location, leader_selected = 0) - var/mob/living/carbon/human/new_member = new(spawn_location.loc) - - return new_member - -// Equip mob -/mob/living/carbon/human/proc/equip_response_team(leader_selected = 0) - - // Headset - equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_ears) - - // Uniform - equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform) - equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes) - equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves) - equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(src), slot_belt) - - // Glasses - equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(src), slot_glasses) - - // Backpack - equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back) - - // Put stuff into their backpacks - equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack) - // equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack) // Regular medkit - - // Loyalty implants - implant_loyalty(src) - - // ID cards - var/obj/item/weapon/card/id/E = new(src) - E.name = "[real_name]'s ID Card (Emergency Response Team)" - E.icon_state = "centcom" - E.access = get_all_accesses() // ERTs can go everywhere on the station - if(leader_selected) - E.name = "[real_name]'s ID Card (Emergency Response Team Leader)" - E.access += get_all_centcom_access() - E.assignment = "Emergency Response Team Leader" - else - E.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) - E.assignment = "Emergency Response Team" - E.registered_name = real_name - equip_to_slot_or_del(E, slot_wear_id) - - update_icons() - - return 1 - diff --git a/code/WorkInProgress/meteors.dm b/code/WorkInProgress/meteors.dm deleted file mode 100644 index ce1bafdb44..0000000000 --- a/code/WorkInProgress/meteors.dm +++ /dev/null @@ -1,153 +0,0 @@ -#define METEOR_TEMPERATURE - -/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 = 20 -/var/const/meteors_in_small_wave = 10 - -/proc/meteor_wave(var/number = meteors_in_wave) - if(!ticker || wavesecret) - return - - var/startx - var/starty - var/endx - var/endy - var/turf/pickedstart - var/turf/pickedgoal - switch(pick(1,2,3,4)) - if(1) //NORTH - starty = world.maxy-3 - startx = rand(1, world.maxx-1) - endy = 1 - endx = rand(1, world.maxx-1) - if(2) //EAST - starty = rand(1,world.maxy-1) - startx = world.maxx-3 - endy = rand(1, world.maxy-1) - endx = 1 - if(3) //SOUTH - starty = 3 - startx = rand(1, world.maxx-1) - endy = world.maxy-1 - endx = rand(1, world.maxx-1) - if(4) //WEST - starty = rand(1, world.maxy-1) - startx = 3 - endy = rand(1,world.maxy-1) - endx = world.maxx-1 - pickedstart = locate(startx, starty, 1) - pickedgoal = locate(endx, endy, 1) - wavesecret = 1 - for(var/i = 0 to number) - spawn(rand(10,100)) - spawn_meteor(pickedstart, pickedgoal) - spawn(meteor_wave_delay) - wavesecret = 0 - -/proc/spawn_meteors(var/turf/pickedstart, var/turf/pickedgoal, var/number = meteors_in_small_wave) - for(var/i = 0; i < number; i++) - spawn(0) - spawn_meteor(pickedstart, pickedgoal) - -/proc/spawn_meteor(var/turf/pickedstart, var/turf/pickedgoal) - - var/route = rand(1,5) - var/turf/tempgoal = pickedgoal - for(var/i, i < route, i++) - tempgoal = get_step(tempgoal,rand(1,8)) - - var/obj/effect/meteor/M - switch(rand(1, 100)) - if(1 to 15) - M = new /obj/effect/meteor/big(pickedstart) - if(16 to 75) - M = new /obj/effect/meteor( pickedstart ) - if(76 to 100) - M = new /obj/effect/meteor/small( pickedstart ) - - M.dest = tempgoal - - do - sleep(1) - walk_towards(M, M.dest, 1) - while (!istype(M.loc, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen. - - return - -/obj/effect/meteor - name = "meteor" - icon = 'icons/obj/meteor.dmi' - icon_state = "flaming" - density = 1 - anchored = 1.0 - var/hits = 1 - var/dest - pass_flags = PASSTABLE - -/obj/effect/meteor/small - name = "small meteor" - icon_state = "smallf" - pass_flags = PASSTABLE | PASSGRILLE - -/obj/effect/meteor/Move() - var/turf/T = src.loc - if (istype(T, /turf)) - T.hotspot_expose(METEOR_TEMPERATURE, 1000) - ..() - return - -/obj/effect/meteor/Bump(atom/A) - spawn(0) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view - shake_camera(M, 3, 1) - if (A) - A.meteorhit(src) - playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 40, 1) - if (--src.hits <= 0) - if(prob(15))// && !istype(A, /obj/structure/grille)) - explosion(get_turf(src), 4, 5, 6, 7, 0) - playsound(get_turf(src), "explosion", 50, 1) - del(src) - return - - -/obj/effect/meteor/ex_act(severity) - spawn(0) - del(src) - return - -/obj/effect/meteor/big - name = "big meteor" - hits = 5 - - ex_act(severity) - return - - Bump(atom/A) - spawn(0) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view - shake_camera(M, 3, 1) - if (A) - if(isobj(A)) - del(A) - else - A.meteorhit(src) - src.hits-- - return - playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 40, 1) - if (--src.hits <= 0) - if(prob(15) && !istype(A, /obj/structure/grille)) - explosion(get_turf(src), 1, 2, 3, 4, 0) - playsound(get_turf(src), "explosion", 50, 1) - del(src) - return - -/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/pickaxe)) - del(src) - return - ..() \ No newline at end of file diff --git a/code/WorkInProgress/organs/implants.dm b/code/WorkInProgress/organs/implants.dm deleted file mode 100644 index c8f83bc6a3..0000000000 --- a/code/WorkInProgress/organs/implants.dm +++ /dev/null @@ -1,13 +0,0 @@ -/*------ -SPELL IMPLANTS - + Most diverse effects - - Limited charges, failure rate - -CYBERNETIC IMPLANTS - + Easiest to make - - Require power - -GRAFTS (includes basic human bodyparts) - + Permanent effects - - Horrible side effects -*/ \ No newline at end of file diff --git a/code/WorkInProgress/organs/organs.dm b/code/WorkInProgress/organs/organs.dm deleted file mode 100644 index 22f51bffc6..0000000000 --- a/code/WorkInProgress/organs/organs.dm +++ /dev/null @@ -1,700 +0,0 @@ -<<<<<<< HEAD -/obj/effect/organstructure //used obj for the "contents" var - name = "organs" - - var/species = "mob" //for speaking in unknown languages purposes - - var/obj/effect/organ/limb/arms/arms = null - var/obj/effect/organ/limb/legs/legs = null - var/obj/effect/organ/torso/torso = null - var/obj/effect/organ/head/head = null - - - proc/GetSpeciesName() - var/list/speciesPresent = list() - - for(var/obj/effect/organ/organ in src) //only external organs count, since it's judging by the appearance - if(speciesPresent[organ.species]) - speciesPresent[organ.species]++ - else - speciesPresent[organ.species] = 1 //not sure, but I think it's not initialised before that, so can't ++ - - var/list/dominantSpecies = list() - - for(var/speciesName in speciesPresent) - if(!dominantSpecies.len) - dominantSpecies += speciesName - else - if(speciesPresent[dominantSpecies[1]] == speciesPresent[speciesName]) - dominantSpecies += speciesName - else if(speciesPresent[dominantSpecies[1]] < speciesPresent[speciesName]) - dominantSpecies = list(speciesName) - - if(!dominantSpecies.len) - species = "mob" - else - species = pick(dominantSpecies) - - return species - - proc/RecalculateStructure() - var/list/organs = GetAllContents() - - arms = locate(/obj/effect/organ/limb/arms) in organs - legs = locate(/obj/effect/organ/limb/legs) in organs - torso = locate(/obj/effect/organ/torso) in organs - head = locate(/obj/effect/organ/head) in organs - - GetSpeciesName() - - return - - proc/ProcessOrgans() - set background = 1 - - var/list/organs = GetAllContents() - for(var/obj/effect/organ/organ in organs) - organ.ProcessOrgan() - - return - - New() - ..() - RecalculateStructure() - -/obj/effect/organstructure/human - name = "human organs" - - New() - new /obj/effect/organ/torso/human(src) - ..() - -/obj/effect/organstructure/alien - name = "alien organs" - - New() - new /obj/effect/organ/torso/alien(src) - ..() - -/obj/effect/organ - name = "organ" - - //All types - var/organType = 0 //CYBER and SPELL go here - var/species = "mob" - var/obj/effect/organstructure/rootOrganStructure = null - - New(location) - ..() - - rootOrganStructure = FindRootStructure() - - proc/FindRootStructure() - if(istype(loc,/obj/effect/organ)) - var/obj/effect/organ/parent = loc - return parent.FindRootStructure() - else if(istype(loc,/obj/effect/organstructure)) - return loc - return null - - proc/ProcessOrgan() - return - -/obj/effect/organ/torso - name = "torso" - var/maxHealth = 50 //right now, the mob's (only humans for now) health depends only on it. Will be fixed later - -/obj/effect/organ/torso/human - name = "human torso" - species = "human" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/human(src) - new /obj/effect/organ/limb/legs/human(src) - new /obj/effect/organ/head/human(src) -/obj/effect/organ/torso/alien - name = "alien torso" - species = "alien" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/alien(src) - new /obj/effect/organ/limb/legs/alien(src) - new /obj/effect/organ/head/alien(src) - - -/obj/effect/organ/limb - name = "limb" - -/obj/effect/organ/limb/arms - name = "arms" - - var/minDamage = 5 //punching damage - var/maxDamage = 5 - -/obj/effect/organ/limb/arms/alien - name = "alien arms" - species = "alien" - minDamage = 5 - maxDamage = 15 - - -/obj/effect/organ/limb/arms/human - name = "human arms" - species = "human" - minDamage = 1 - maxDamage = 9 - -/obj/effect/organ/limb/legs - name = "legs" - -/obj/effect/organ/limb/legs/human - name = "human legs" - species = "human" - -/obj/effect/organ/limb/legs/alien - name = "alien legs" - species = "alien" - - -/obj/effect/organ/head - name = "head" - -/obj/effect/organ/head/human - name = "human head" - species = "human" - -/obj/effect/organ/head/alien - name = "alien head" - species = "alien" - -/obj/effect/organ/limb/arms/alien - name = "alien arms" - species = "alien" - minDamage = 5 - maxDamage = 15 - -/obj/effect/organ/limb/legs/alien - name = "alien legs" - species = "alien" - -/obj/effect/organ/head/alien - name = "alien head" - species = "alien" - -// ++++STUB ORGAN STRUCTURE. THIS IS THE DEFAULT STRUCTURE. USED TO PREVENT EXCEPTIONS++++ -/obj/effect/organstructure/stub - name = "stub organs" - - New() - new /obj/effect/organ/torso/stub(src) - ..() - -/obj/effect/organ/torso/stub - name = "stub torso" - species = "stub" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/stub(src) - new /obj/effect/organ/limb/legs/stub(src) - new /obj/effect/organ/head/stub(src) - -/obj/effect/organ/limb/arms/stub - name = "stub arms" - species = "stub" - -/obj/effect/organ/limb/legs/stub - name = "stub legs" - species = "stub" - -/obj/effect/organ/head/stub - name = "stub head" - species = "stub" - -// ++++STUB ORGAN STRUCTURE. END++++ - - -// ++++MONKEY++++ - -/obj/effect/organstructure/monkey - name = "monkey organs" - - New() - new /obj/effect/organ/torso/monkey(src) - ..() - -/obj/effect/organ/torso/monkey - name = "monkey torso" - species = "monkey" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/monkey(src) - new /obj/effect/organ/limb/legs/monkey(src) - new /obj/effect/organ/head/monkey(src) - -/obj/effect/organ/limb/arms/monkey - name = "monkey arms" - species = "monkey" - -/obj/effect/organ/limb/legs/monkey - name = "monkey legs" - species = "monkey" - -/obj/effect/organ/head/monkey - name = "monkey head" - species = "monkey" - - -// +++++CYBORG+++++ -/obj/effect/organstructure/cyborg - name = "cyborg organs" - - New() - new /obj/effect/organ/torso/cyborg(src) - ..() - -/obj/effect/organ/torso/cyborg - name = "cyborg torso" - species = "cyborg" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/cyborg(src) - new /obj/effect/organ/limb/legs/cyborg(src) - new /obj/effect/organ/head/cyborg(src) - -/obj/effect/organ/limb/arms/cyborg - name = "cyborg arms" - species = "cyborg" - -/obj/effect/organ/limb/legs/cyborg - name = "cyborg legs" - species = "cyborg" - -/obj/effect/organ/head/cyborg - name = "cyborg head" - species = "cyborg" - -// +++++AI++++++ -/obj/effect/organstructure/AI - name = "AI organs" - - New() - new /obj/effect/organ/torso/AI(src) - ..() - -/obj/effect/organ/torso/AI - name = "AI torso" - species = "AI" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/AI(src) - new /obj/effect/organ/limb/legs/AI(src) - new /obj/effect/organ/head/AI(src) - -/obj/effect/organ/limb/arms/AI - name = "AI arms" - species = "AI" - -/obj/effect/organ/limb/legs/AI - name = "AI legs" - species = "AI" - -/obj/effect/organ/head/AI - name = "AI head" - species = "AI" - -/* New organ structure template - - -/obj/effect/organstructure/template - name = "template organs" - - New() - new /obj/effect/organ/torso/template(src) - ..() - -/obj/effect/organ/torso/template - name = "template torso" - species = "template" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/template(src) - new /obj/effect/organ/limb/legs/template(src) - new /obj/effect/organ/head/template(src) - -/obj/effect/organ/limb/arms/template - name = "template arms" - species = "template" - -/obj/effect/organ/limb/legs/template - name = "template legs" - species = "template" - -/obj/effect/organ/head/template - name = "template head" - species = "template" - -======= -/obj/effect/organstructure //used obj for the "contents" var - name = "organs" - - var/species = "mob" //for speaking in unknown languages purposes - - var/obj/effect/organ/limb/arms/arms = null - var/obj/effect/organ/limb/legs/legs = null - var/obj/effect/organ/torso/torso = null - var/obj/effect/organ/head/head = null - - - proc/GetSpeciesName() - var/list/speciesPresent = list() - - for(var/obj/effect/organ/organ in src) //only external organs count, since it's judging by the appearance - if(speciesPresent[organ.species]) - speciesPresent[organ.species]++ - else - speciesPresent[organ.species] = 1 //not sure, but I think it's not initialised before that, so can't ++ - - var/list/dominantSpecies = list() - - for(var/speciesName in speciesPresent) - if(!dominantSpecies.len) - dominantSpecies += speciesName - else - if(speciesPresent[dominantSpecies[1]] == speciesPresent[speciesName]) - dominantSpecies += speciesName - else if(speciesPresent[dominantSpecies[1]] < speciesPresent[speciesName]) - dominantSpecies = list(speciesName) - - if(!dominantSpecies.len) - species = "mob" - else - species = pick(dominantSpecies) - - return species - - proc/RecalculateStructure() - var/list/organs = GetAllContents() - - arms = locate(/obj/effect/organ/limb/arms) in organs - legs = locate(/obj/effect/organ/limb/legs) in organs - torso = locate(/obj/effect/organ/torso) in organs - head = locate(/obj/effect/organ/head) in organs - - GetSpeciesName() - - return - - proc/ProcessOrgans() - set background = 1 - - var/list/organs = GetAllContents() - for(var/obj/effect/organ/organ in organs) - organ.ProcessOrgan() - - return - - New() - ..() - RecalculateStructure() - -/obj/effect/organstructure/human - name = "human organs" - - New() - new /obj/effect/organ/torso/human(src) - ..() - -/obj/effect/organstructure/alien - name = "alien organs" - - New() - new /obj/effect/organ/torso/alien(src) - ..() - -/obj/effect/organ - name = "organ" - - //All types - var/organType = 0 //CYBER and SPELL go here - var/species = "mob" - var/obj/effect/organstructure/rootOrganStructure = null - - New(location) - ..() - - rootOrganStructure = FindRootStructure() - - proc/FindRootStructure() - if(istype(loc,/obj/effect/organ)) - var/obj/effect/organ/parent = loc - return parent.FindRootStructure() - else if(istype(loc,/obj/effect/organstructure)) - return loc - return null - - proc/ProcessOrgan() - return - -/obj/effect/organ/torso - name = "torso" - var/maxHealth = 50 //right now, the mob's (only humans for now) health depends only on it. Will be fixed later - -/obj/effect/organ/torso/human - name = "human torso" - species = "human" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/human(src) - new /obj/effect/organ/limb/legs/human(src) - new /obj/effect/organ/head/human(src) -/obj/effect/organ/torso/alien - name = "alien torso" - species = "alien" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/alien(src) - new /obj/effect/organ/limb/legs/alien(src) - new /obj/effect/organ/head/alien(src) - - -/obj/effect/organ/limb - name = "limb" - -/obj/effect/organ/limb/arms - name = "arms" - - var/minDamage = 5 //punching damage - var/maxDamage = 5 - -/obj/effect/organ/limb/arms/alien - name = "alien arms" - species = "alien" - minDamage = 5 - maxDamage = 15 - - -/obj/effect/organ/limb/arms/human - name = "human arms" - species = "human" - minDamage = 1 - maxDamage = 9 - -/obj/effect/organ/limb/legs - name = "legs" - -/obj/effect/organ/limb/legs/human - name = "human legs" - species = "human" - -/obj/effect/organ/limb/legs/alien - name = "alien legs" - species = "alien" - - -/obj/effect/organ/head - name = "head" - -/obj/effect/organ/head/human - name = "human head" - species = "human" - -/obj/effect/organ/head/alien - name = "alien head" - species = "alien" - -/obj/effect/organ/limb/arms/alien - name = "alien arms" - species = "alien" - minDamage = 5 - maxDamage = 15 - -/obj/effect/organ/limb/legs/alien - name = "alien legs" - species = "alien" - -/obj/effect/organ/head/alien - name = "alien head" - species = "alien" - -// ++++STUB ORGAN STRUCTURE. THIS IS THE DEFAULT STRUCTURE. USED TO PREVENT EXCEPTIONS++++ -/obj/effect/organstructure/stub - name = "stub organs" - - New() - new /obj/effect/organ/torso/stub(src) - ..() - -/obj/effect/organ/torso/stub - name = "stub torso" - species = "stub" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/stub(src) - new /obj/effect/organ/limb/legs/stub(src) - new /obj/effect/organ/head/stub(src) - -/obj/effect/organ/limb/arms/stub - name = "stub arms" - species = "stub" - -/obj/effect/organ/limb/legs/stub - name = "stub legs" - species = "stub" - -/obj/effect/organ/head/stub - name = "stub head" - species = "stub" - -// ++++STUB ORGAN STRUCTURE. END++++ - - -// ++++MONKEY++++ - -/obj/effect/organstructure/monkey - name = "monkey organs" - - New() - new /obj/effect/organ/torso/monkey(src) - ..() - -/obj/effect/organ/torso/monkey - name = "monkey torso" - species = "monkey" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/monkey(src) - new /obj/effect/organ/limb/legs/monkey(src) - new /obj/effect/organ/head/monkey(src) - -/obj/effect/organ/limb/arms/monkey - name = "monkey arms" - species = "monkey" - -/obj/effect/organ/limb/legs/monkey - name = "monkey legs" - species = "monkey" - -/obj/effect/organ/head/monkey - name = "monkey head" - species = "monkey" - - -// +++++CYBORG+++++ -/obj/effect/organstructure/cyborg - name = "cyborg organs" - - New() - new /obj/effect/organ/torso/cyborg(src) - ..() - -/obj/effect/organ/torso/cyborg - name = "cyborg torso" - species = "cyborg" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/cyborg(src) - new /obj/effect/organ/limb/legs/cyborg(src) - new /obj/effect/organ/head/cyborg(src) - -/obj/effect/organ/limb/arms/cyborg - name = "cyborg arms" - species = "cyborg" - -/obj/effect/organ/limb/legs/cyborg - name = "cyborg legs" - species = "cyborg" - -/obj/effect/organ/head/cyborg - name = "cyborg head" - species = "cyborg" - -// +++++AI++++++ -/obj/effect/organstructure/AI - name = "AI organs" - - New() - new /obj/effect/organ/torso/AI(src) - ..() - -/obj/effect/organ/torso/AI - name = "AI torso" - species = "AI" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/AI(src) - new /obj/effect/organ/limb/legs/AI(src) - new /obj/effect/organ/head/AI(src) - -/obj/effect/organ/limb/arms/AI - name = "AI arms" - species = "AI" - -/obj/effect/organ/limb/legs/AI - name = "AI legs" - species = "AI" - -/obj/effect/organ/head/AI - name = "AI head" - species = "AI" - -/* New organ structure template - - -/obj/effect/organstructure/template - name = "template organs" - - New() - new /obj/effect/organ/torso/template(src) - ..() - -/obj/effect/organ/torso/template - name = "template torso" - species = "template" - maxHealth = 100 - - New() - ..() - new /obj/effect/organ/limb/arms/template(src) - new /obj/effect/organ/limb/legs/template(src) - new /obj/effect/organ/head/template(src) - -/obj/effect/organ/limb/arms/template - name = "template arms" - species = "template" - -/obj/effect/organ/limb/legs/template - name = "template legs" - species = "template" - -/obj/effect/organ/head/template - name = "template head" - species = "template" - ->>>>>>> remotes/git-svn -*/ \ No newline at end of file diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 5d63512c14..7b0d3afa98 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -89,7 +89,7 @@ obj/item/check_airflow_movable(n) if(src:shoes:magpulse) return src << "\red You are sucked away by airflow!" - var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful. + var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) if(airflow_falloff < 1) airflow_dest = null return @@ -154,7 +154,7 @@ obj/item/check_airflow_movable(n) return src << "\red You are pushed away by airflow!" last_airflow = world.time - var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful. + var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) if(airflow_falloff < 1) airflow_dest = null return diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 9743988875..dcfcb50fcb 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -10,16 +10,10 @@ return null /proc/get_area(O) - var/atom/location = O - var/i - for(i=1, i<=20, i++) - if(isarea(location)) - return location - else if (istype(location)) - location = location.loc - else - return null - return 0 + var/turf/loc = get_turf(O) + if(!loc) + return null + return loc.loc /proc/get_area_name(N) //get area by its name for(var/area/A in world) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 67e7dd2948..db927a1f67 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -87,12 +87,6 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al surgery_steps += S sort_surgeries() - //Medical side effects. List all effects by their names - paths = typesof(/datum/medical_effect)-/datum/medical_effect - for(var/T in paths) - var/datum/medical_effect/M = new T - side_effects[M.name] = T - //List of job. I can't believe this was calculated multiple times per tick! paths = typesof(/datum/job) -list(/datum/job,/datum/job/ai,/datum/job/cyborg) for(var/T in paths) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 282224d567..39c1f23d6b 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -581,3 +581,6 @@ datum/proc/dd_SortValue() /obj/machinery/dd_SortValue() return "[sanitize(name)]" + +/obj/machinery/camera/dd_SortValue() + return "[c_tag]" diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index a0f4f9cb32..7f8958360d 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -1,3 +1,5 @@ +#define RAND_F(L, H) (rand()*(H-L) + L) + // Credits to Nickr5 for the useful procs I've taken from his library resource. var/const/E = 2.71828183 @@ -117,7 +119,3 @@ var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, var/d = max - min var/t = Floor((val - min) / d) return val - (t * d) - -proc/RaiseToPower(num, power) - if(!power) return 1 - return (power-- > 1 ? num * RaiseToPower(num, power) : num) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index c0ef908406..c14976bb78 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -34,11 +34,17 @@ return t //Removes a few problematic characters -/proc/sanitize_simple(var/t,var/list/repl_chars = list("\n"="#","\t"="#","�"="�")) +/proc/sanitize_simple(var/t,var/list/repl_chars = list("\n"="#","\t"="#")) + for(var/char in repl_chars) + replacetext(t, char, repl_chars[char]) + return t + +/proc/readd_quotes(var/t) + var/list/repl_chars = list(""" = "\"") for(var/char in repl_chars) var/index = findtext(t, char) while(index) - t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+1) + t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+5) index = findtext(t, char) return t @@ -74,7 +80,7 @@ /proc/stripped_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN) var/name = input(user, message, title, default) return strip_html_properly(name, max_length) - + // Used to get a trimmed, properly sanitized input, of max_length /proc/trim_strip_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN) return trim(stripped_input(user, message, title, default, max_length)) @@ -317,7 +323,7 @@ proc/TextPreview(var/string,var/len=40) else return string else - return "[copytext(string, 1, 37)]..." + return "[copytext(string, 1, 37)]..." //This proc strips html properly, but it's not lazy like the other procs. //This means that it doesn't just remove < and > and call it a day. @@ -333,7 +339,7 @@ proc/TextPreview(var/string,var/len=40) input = copytext(input, 1, opentag) + copytext(input, (closetag + 1)) if(max_length) input = copytext(input,1,max_length) - return input + return sanitize(input) /proc/trim_strip_html_properly(var/input, var/max_length = MAX_MESSAGE_LEN) return trim(strip_html_properly(input, max_length)) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index cfac858e25..87b63f7120 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -194,7 +194,7 @@ proc/tg_list2text(list/list, glue=",") . += copytext(text, last_found, found) last_found = found + delim_len while(found) - + /proc/text2numlist(text, delimiter="\n") var/list/num_list = list() for(var/x in text2list(text, delimiter)) @@ -339,3 +339,31 @@ proc/tg_list2text(list/list, glue=",") if("Orange") return 'icons/mob/screen1_Orange.dmi' if("Midnight") return 'icons/mob/screen1_Midnight.dmi' else return 'icons/mob/screen1_White.dmi' + +//adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ +/proc/heat2color(temp) + return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) + +/proc/heat2color_r(temp) + temp /= 100 + if(temp <= 66) + . = 255 + else + . = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592)) + +/proc/heat2color_g(temp) + temp /= 100 + if(temp <= 66) + . = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661)) + else + . = max(0, min(255, 288.1221695283 * ((temp - 60) ** -0.0755148492))) + +/proc/heat2color_b(temp) + temp /= 100 + if(temp >= 66) + . = 255 + else + if(temp <= 16) + . = 0 + else + . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307)) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 365865543f..a81c6f30fa 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -46,7 +46,11 @@ playsound(loc, hitsound, 50, 1, -1) return hit else - user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") + if(attack_verb.len) + user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") + else + user.visible_message("[M] has been attacked with [src] by [user]!") + if (hitsound) playsound(loc, hitsound, 50, 1, -1) switch(damtype) diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index a0d9067038..b4b0eb4393 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -307,7 +307,7 @@ var/global/datum/controller/radio/radio_controller //1 = radio transmission //2 = subspace transmission - var/data = list() + var/list/data = list() var/encryption var/frequency = 0 diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e666a03653..49863e8c4b 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -427,7 +427,7 @@ client usr << "This can only be used on instances of type /mob" return - var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN) + var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) if( !new_name || !M ) return message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") @@ -866,6 +866,7 @@ client return var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in typesof(/datum/organ/internal)-/datum/organ/internal + if(!new_organ) return if(!M) usr << "Mob doesn't exist anymore" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index a92712af50..bd401c2417 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -119,7 +119,7 @@ datum/mind "cult", "wizard", "changeling", - "nuclear", + "mercenary", "traitor", // "traitorchan", "monkey", "malfunction", @@ -217,23 +217,23 @@ datum/mind sections["changeling"] = text /** NUCLEAR ***/ - text = "nuclear" - if (ticker.mode.config_tag=="nuclear") + text = "mercenary" + if (ticker.mode.config_tag=="mercenary") text = uppertext(text) text = "[text]: " if (src in ticker.mode.syndicates) - text += "OPERATIVE|nanotrasen" - text += "
To shuttle, undress, dress up." + text += "OPERATIVE|nanotrasen" + text += "
To shuttle, undress, dress up." var/code for (var/obj/machinery/nuclearbomb/bombue in machines) if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") code = bombue.r_code break if (code) - text += " Code is [code]. tell the code." + text += " Code is [code]. tell the code." else - text += "operative|NANOTRASEN" - sections["nuclear"] = text + text += "operative|NANOTRASEN" + sections["mercenary"] = text /** TRAITOR ***/ text = "traitor" @@ -362,7 +362,7 @@ datum/mind assigned_role = new_role else if (href_list["memory_edit"]) - var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) + var/new_memo = sanitize(copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN)) if (isnull(new_memo)) return memory = new_memo @@ -382,7 +382,7 @@ datum/mind if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "prevent", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "prevent", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "mercenary", "capture", "absorb", "custom") if (!new_obj_type) return var/datum/objective/new_objective = null @@ -436,7 +436,7 @@ datum/mind new_objective = new /datum/objective/survive new_objective.owner = src - if ("nuclear") + if ("mercenary") new_objective = new /datum/objective/nuclear new_objective.owner = src @@ -473,7 +473,7 @@ datum/mind new_objective.target_amount = target_number if ("custom") - var/expl = copytext(sanitize(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null),1,MAX_MESSAGE_LEN) + var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN)) if (!expl) return new_objective = new /datum/objective new_objective.owner = src @@ -748,12 +748,12 @@ datum/mind current.UpdateAppearance() domutcheck(current, null) - else if (href_list["nuclear"]) + else if (href_list["mercenary"]) var/mob/living/carbon/human/H = current current.hud_updateflag |= (1 << SPECIALROLE_HUD) - switch(href_list["nuclear"]) + switch(href_list["mercenary"]) if("clear") if(src in ticker.mode.syndicates) ticker.mode.syndicates -= src @@ -763,7 +763,7 @@ datum/mind objectives-=O current << "\red You have been brainwashed! You are no longer an operative!" log_admin("[key_name_admin(usr)] has de-merc'd [current].") - if("nuclear") + if("mercenary") if(!(src in ticker.mode.syndicates)) ticker.mode.syndicates += src ticker.mode.update_synd_icons_added(src) diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index b2ced9fa0d..f30d55455b 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -47,7 +47,7 @@ return if(target && target.buckled) - target.buckled.unbuckle() + target.buckled.unbuckle_mob() var/list/tempL = L var/attempt = null diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 1b1646ffa4..b5744dffc4 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -20,7 +20,7 @@ if(target.buckled) var/obj/structure/stool/bed/buckled_to = target.buckled. - buckled_to.unbuckle() + buckled_to.unbuckle_mob() var/mobloc = get_turf(target.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 70c418172d..216004c330 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -955,8 +955,13 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee name = "Sterile equipment crate" contains = list(/obj/item/clothing/under/rank/medical/green, /obj/item/clothing/under/rank/medical/green, + /obj/item/clothing/head/surgery/green, + /obj/item/clothing/head/surgery/green, /obj/item/weapon/storage/box/masks, - /obj/item/weapon/storage/box/gloves) + /obj/item/weapon/storage/box/gloves, + /obj/item/weapon/storage/belt/medical, + /obj/item/weapon/storage/belt/medical, + /obj/item/weapon/storage/belt/medical) cost = 15 containertype = "/obj/structure/closet/crate" containername = "Sterile equipment crate" diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 5121b39dbe..3b0b54942f 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -7,7 +7,7 @@ var/list/same_wires = list() // 14 colours, if you're adding more than 14 wires then add more colours here -var/list/wireColours = list("red", "blue", "green", "white", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink", "black", "yellow") +var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink", "black", "yellow") /datum/wires @@ -97,7 +97,7 @@ var/list/wireColours = list("red", "blue", "green", "white", "orange", "brown", html += " [IsAttached(colour) ? "Detach" : "Attach"] Signaller" html += "" html += "" - + if (random) html += "\The [holder] appears to have tamper-resistant electronics installed.

" //maybe this could be more generic? diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 0c971df260..e105d67a5b 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -173,10 +173,11 @@ using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( ) */ var/global/list/PDA_Manifest = list() +var/global/ManifestJSON /obj/effect/datacore/proc/get_manifest_json() if(PDA_Manifest.len) - return PDA_Manifest + return var/heads[0] var/sec[0] var/eng[0] @@ -247,7 +248,8 @@ var/global/list/PDA_Manifest = list() "bot" = bot,\ "misc" = misc\ ) - return PDA_Manifest + ManifestJSON = list2json(PDA_Manifest) + return @@ -302,7 +304,7 @@ var/global/list/PDA_Manifest = list() throwforce = 0.0 throw_speed = 1 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT afterattack(atom/target as mob|obj|turf|area, mob/user as mob) user.drop_item() diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 0921cfabd9..ab7b57cb42 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -3,7 +3,7 @@ desc = "Should anything ever go wrong..." icon = 'icons/obj/items.dmi' icon_state = "red_phone" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 3.0 throwforce = 2.0 throw_speed = 1 @@ -22,7 +22,6 @@ anchored = 0.0 var/stored_matter = 0 var/mode = 1 - flags = TABLEPASS w_class = 3.0 /obj/item/weapon/bananapeel @@ -92,7 +91,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "cane" item_state = "stick" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 throwforce = 7.0 w_class = 2.0 @@ -139,7 +138,7 @@ gender = PLURAL icon = 'icons/obj/items.dmi' icon_state = "handcuff" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT throwforce = 0 w_class = 3.0 origin_tech = "materials=1" @@ -198,7 +197,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS attack_verb = list("warned", "cautioned", "smashed") /obj/item/weapon/caution/cone @@ -217,7 +215,7 @@ var/traitor_frequency = 0.0 var/mob/currentUser = null var/obj/item/device/radio/origradio = null - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT + flags = CONDUCT | ONBELT w_class = 2.0 item_state = "radio" throw_speed = 4 @@ -235,7 +233,7 @@ var/selfdestruct = 0.0 var/traitor_frequency = 0.0 var/obj/item/device/radio/origradio = null - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT item_state = "radio" throwforce = 5 @@ -255,7 +253,7 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS | NOSHIELD + flags = NOSHIELD attack_verb = list("bludgeoned", "whacked", "disciplined") /obj/item/weapon/staff/broom @@ -282,7 +280,7 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS | NOSHIELD + flags = NOSHIELD /obj/item/weapon/wire desc = "This is just a simple piece of regular insulated wire." @@ -304,7 +302,7 @@ icon_state = "std_module" w_class = 2.0 item_state = "electronic" - flags = FPRINT|TABLEPASS|CONDUCT + flags = CONDUCT var/mtype = 1 // 1=electronic 2=hardware /obj/item/weapon/module/card_reader @@ -385,7 +383,7 @@ w_class = 1 throwforce = 2 var/cigarcount = 6 - flags = ONBELT | TABLEPASS */ + flags = ONBELT */ /obj/item/weapon/pai_cable desc = "A flexible coated cable with a universal jack on one end." diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index 44d79a3893..abf4c97dd3 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -1,7 +1,7 @@ proc/log_and_message_admins(var/message as text) - log_admin("[usr]([usr.ckey]) " + message) - message_admins("[usr]([usr.ckey]) " + message) + log_admin(usr ? "[usr]([usr.ckey]) [message]" : "EVENT [message]") + message_admins(usr ? "[usr]([usr.ckey]) [message]" : "EVENT [message]") proc/admin_log_and_message_admins(var/message as text) - log_admin("[key_name(usr)] " + message) - message_admins("[key_name_admin(usr)] " + message, 1) \ No newline at end of file + log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]") + message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]", 1) diff --git a/code/defines/procs/hud.dm b/code/defines/procs/hud.dm index 04afb6c63e..be678b8397 100644 --- a/code/defines/procs/hud.dm +++ b/code/defines/procs/hud.dm @@ -12,7 +12,7 @@ proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt) if(P.Mob.see_invisible < patient.invisibility) continue - if(!(local_scanner || hassensorlevel(P, SUIT_SENSOR_VITAL))) + if(!(local_scanner || hassensorlevel(patient, SUIT_SENSOR_VITAL))) continue P.Client.images += patient.hud_list[HEALTH_HUD] diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm index 0cbd009076..1e0e045928 100644 --- a/code/defines/procs/radio.dm +++ b/code/defines/procs/radio.dm @@ -47,7 +47,7 @@ /proc/get_receiver_reception(var/receiver, var/datum/signal/signal) if(receiver && check_signal(signal)) var/turf/pos = get_turf(receiver) - if(pos.z in signal.data["level"]) + if(pos && (pos.z in signal.data["level"])) return TELECOMMS_RECEPTION_RECEIVER return TELECOMMS_RECEPTION_NONE diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index f875b9975c..8f7a3556ac 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -57,6 +57,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/list/ambience = 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') var/sound/forced_ambience = null + var/rad_shielded = 0 + /*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ var/list/teleportlocs = list() @@ -347,6 +349,7 @@ var/list/ghostteleportlocs = list() name = "\improper Centcom" icon_state = "centcom" requires_power = 0 + unlimited_power = 1 /area/centcom/control name = "\improper Centcom Control" @@ -458,6 +461,7 @@ var/list/ghostteleportlocs = list() icon_state = "yellow" requires_power = 0 unlimited_power = 1 + rad_shielded = 1 /area/syndicate_station/start name = "\improper Mercenary Forward Operating Base" @@ -512,35 +516,33 @@ var/list/ghostteleportlocs = list() icon_state = "yellow" requires_power = 0 +/area/vox_station + requires_power = 0 + rad_shielded = 1 + /area/vox_station/transit name = "\improper hyperspace" icon_state = "shuttle" - requires_power = 0 /area/vox_station/southwest_solars name = "\improper aft port solars" icon_state = "southwest" - requires_power = 0 /area/vox_station/northwest_solars name = "\improper fore port solars" icon_state = "northwest" - requires_power = 0 /area/vox_station/northeast_solars name = "\improper fore starboard solars" icon_state = "northeast" - requires_power = 0 /area/vox_station/southeast_solars name = "\improper aft starboard solars" icon_state = "southeast" - requires_power = 0 /area/vox_station/mining name = "\improper nearby mining asteroid" icon_state = "north" - requires_power = 0 //PRISON /area/prison @@ -633,6 +635,9 @@ var/list/ghostteleportlocs = list() //Maintenance +/area/maintenance + rad_shielded = 1 + /area/maintenance/aft name = "Aft Maintenance" icon_state = "amaint" @@ -906,6 +911,7 @@ var/list/ghostteleportlocs = list() /area/crew_quarters name = "\improper Dormitories" icon_state = "Sleep" + rad_shielded = 1 /area/crew_quarters/toilet name = "\improper Dormitory Toilets" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 30f04da4b1..df288f2cc4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,7 +1,7 @@ /atom layer = 2 var/level = 2 - var/flags = FPRINT + var/flags = 0 var/list/fingerprints var/list/fingerprintshidden var/fingerprintslast = null @@ -195,7 +195,10 @@ its easier to just keep the beam vertical. f_name = "some " else f_name = "a " - f_name += "blood-stained [name][infix]!" + if(blood_color != "#030303") + f_name += "blood-stained [name][infix]!" + else + f_name += "oil-stained [name][infix]." user << "\icon[src] That's [f_name] [suffix]" @@ -231,8 +234,6 @@ its easier to just keep the beam vertical. /atom/proc/add_hiddenprint(mob/living/M as mob) if(isnull(M)) return if(isnull(M.key)) return - if (!( src.flags ) & FPRINT) - return if (ishuman(M)) var/mob/living/carbon/human/H = M if (!istype(H.dna, /datum/dna)) @@ -257,8 +258,6 @@ its easier to just keep the beam vertical. if(isnull(M)) return if(isAI(M)) return if(isnull(M.key)) return - if (!( src.flags ) & FPRINT) - return if (ishuman(M)) //Add the list if it does not exist. if(!fingerprintshidden) @@ -383,7 +382,7 @@ its easier to just keep the beam vertical. //returns 1 if made bloody, returns 0 otherwise /atom/proc/add_blood(mob/living/carbon/human/M as mob) - if((flags & NOBLOODY) || !(flags & FPRINT)) + if(flags & NOBLOODY) return 0 if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 322e65202f..53086de252 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -737,7 +737,7 @@ if (bufferOption == "changeLabel") var/datum/dna2/record/buf = src.buffers[bufferId] - var/text = sanitize(input(usr, "New Label:", "Edit Label", buf.name) as text|null) + var/text = sanitize(copytext(input(usr, "New Label:", "Edit Label", buf.name) as text|null, 1, MAX_NAME_LEN)) buf.name = text src.buffers[bufferId] = buf return 1 diff --git a/code/game/gamemodes/calamity/calamity.dm b/code/game/gamemodes/calamity/calamity.dm index 2e77fcb19d..53cd72d447 100644 --- a/code/game/gamemodes/calamity/calamity.dm +++ b/code/game/gamemodes/calamity/calamity.dm @@ -411,11 +411,7 @@ var/mob/living/simple_animal/borer/roundstart/B = new(target_host) - player.current = B - B.mind = player - B.key = player.key - player.assigned_role = "Cortical Borer" - player.special_role = "Cortical Borer" + B.transfer_personality(player) B.host = target_host B.host_brain.name = target_host.name @@ -424,10 +420,6 @@ var/datum/organ/external/head = target_host.get_organ("head") head.implants += B - player.current << "\blue You are a cortical borer! You are a brain slug that worms its way \ - into the head of its victim, lurking out of sight until it needs to take control." - player.current << "You can speak to your victim with say, to other borers with say ;, and use your Alien tab for abilities." - if(!config.objectives_disabled) player.objectives += new /datum/objective/borer_survive() player.objectives += new /datum/objective/borer_reproduce() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index d8568c8f60..5dcc891fa9 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -657,7 +657,7 @@ var/list/datum/dna/hivemind_bank = list() src << "We return our vocal glands to their original location." return - var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text + var/mimic_voice = stripped_input(usr, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN) if(!mimic_voice) return @@ -856,4 +856,4 @@ var/list/datum/dna/hivemind_bank = list() changeling.absorbed_species += T.species.name feedback_add_details("changeling_powers","ED") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f6aa21e14d..51f77c2cc0 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -3,7 +3,6 @@ desc = "An arcane weapon wielded by the followers of Nar-Sie" icon_state = "cultblade" item_state = "cultblade" - flags = FPRINT | TABLEPASS w_class = 4 force = 30 throwforce = 10 @@ -34,7 +33,7 @@ icon_state = "culthood" desc = "A hood worn by the followers of Nar-Sie." flags_inv = HIDEFACE - flags = FPRINT|TABLEPASS|HEADCOVERSEYES + flags = HEADCOVERSEYES body_parts_covered = HEAD|EYES armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0) cold_protection = HEAD @@ -55,7 +54,6 @@ desc = "A set of armored robes worn by the followers of Nar-Sie" icon_state = "cultrobes" item_state = "cultrobes" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) @@ -68,7 +66,7 @@ item_state = "magus" desc = "A helm worn by the followers of Nar-Sie." flags_inv = HIDEFACE - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0 @@ -78,7 +76,6 @@ desc = "A set of armored robes worn by the followers of Nar-Sie" icon_state = "magusred" item_state = "magusred" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index a3829207fe..e3ac71b77c 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -169,7 +169,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS unique = 1 var/notedat = "" var/tomedat = "" diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 4a0712c712..9964a37813 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -113,7 +113,7 @@ world.Reboot() var/datum/disease2/disease/lethal = new - lethal.makerandom(1) + lethal.makerandom(3) lethal.infectionchance = 5 // the more doctors, the more will be infected diff --git a/code/game/gamemodes/events/holidays/Christmas.dm b/code/game/gamemodes/events/holidays/Christmas.dm index ba1c2be13c..7ca6678902 100644 --- a/code/game/gamemodes/events/holidays/Christmas.dm +++ b/code/game/gamemodes/events/holidays/Christmas.dm @@ -58,7 +58,6 @@ icon_state = "xmashat" desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 - flags = FPRINT|TABLEPASS body_parts_covered = 0 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index c9bce4aca9..6136197a66 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -116,7 +116,7 @@ var/ninja_confirmed_selection = 0 var/commando_list[] = list()//Commandos. //We want the ninja to appear only in certain modes. -// var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") // Commented out for both testing and ninjas +// var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","mercenary","malfunction","monkey") // Commented out for both testing and ninjas // if(!(current_mode.config_tag in acceptable_modes_list)) // return @@ -472,7 +472,7 @@ As such, it's hard-coded for now. No reason for it not to be, really. var/mission while(!mission) - mission = copytext(sanitize(input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN) + mission = sanitize(copytext(input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) if(!mission) if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes") return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index e90b65a333..fca51edf83 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -151,8 +151,6 @@ var/list/area/escape_locations = list(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom) - var/pltext = "Player list:" - for(var/mob/M in player_list) if(M.client) clients++ @@ -187,7 +185,6 @@ text += " ([escaped_total>0 ? escaped_total : "none"] [emergency_shuttle.evac ? "escaped" : "transferred"]) and [ghosts] ghosts.

" else text += "There were no survivors ([ghosts] ghosts)." - text += "
" + pltext //print player list after the general info world << text if(clients > 0) @@ -553,7 +550,7 @@ proc/get_nt_opposed() var/list/refined_log = new() for(var/datum/uplink_item/UI in H.purchase_log) var/obj/I = new UI.path - refined_log.Add("[H.purchase_log[UI]]x\icon[I][I.name]") + refined_log.Add("[H.purchase_log[UI]]x\icon[I][UI.name]") del(I) purchases = english_list(refined_log, nothing_text = "") if(uplink_true) diff --git a/code/game/gamemodes/mutiny/emergency_authentication_device.dm b/code/game/gamemodes/mutiny/emergency_authentication_device.dm index bedd67e64c..028c4113cc 100644 --- a/code/game/gamemodes/mutiny/emergency_authentication_device.dm +++ b/code/game/gamemodes/mutiny/emergency_authentication_device.dm @@ -11,7 +11,6 @@ var/secondary_key var/activated = 0 - flags = FPRINT use_power = 0 New(loc, mode) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 8fd46fc897..b2e54da0d9 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -11,7 +11,7 @@ var/global/list/turf/synd_spawn = list() /datum/game_mode/nuclear name = "mercenary" - config_tag = "nuclear" + config_tag = "mercenary" required_players = 15 required_players_secret = 25 // 25 players - 5 players to be the nuke ops = 20 players remaining required_enemies = 1 @@ -175,7 +175,7 @@ var/global/list/turf/synd_spawn = list() var/obj/item/weapon/paper/P = new P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" - if (ticker.mode.config_tag=="nuclear") + if (ticker.mode.config_tag=="mercenary") P.loc = code_spawn.loc else var/mob/living/carbon/human/H = synd_mind.current diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index ef78dd4286..e73fbf6880 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -23,7 +23,6 @@ var/bomb_set var/timing_wire var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, // 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. - flags = FPRINT use_power = 0 diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 50ae7b9fc1..d26f1a0789 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -2,7 +2,7 @@ name = "pinpointer" icon = 'icons/obj/device.dmi' icon_state = "pinoff" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT w_class = 2.0 item_state = "electronic" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 452fd347d8..534383867e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -537,7 +537,7 @@ datum/objective/steal var/tmp_obj = new custom_target var/custom_name = tmp_obj:name del(tmp_obj) - custom_name = copytext(sanitize(input("Enter target name:", "Objective target", custom_name) as text|null),1,MAX_MESSAGE_LEN) + custom_name = sanitize(copytext(input("Enter target name:", "Objective target", custom_name) as text|null,1,MAX_MESSAGE_LEN)) if (!custom_name) return target_name = custom_name steal_target = custom_target diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 9c1b30bc89..bea6029b46 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -91,7 +91,7 @@ //REMOTEVIEWBLOCK = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS) //REGENERATEBLOCK = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS) //INCREASERUNBLOCK = getAssignedBlock("INCREASERUN", numsToAssign, DNA_HARDER_BOUNDS) - //REMOTETALKBLOCK = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS) + REMOTETALKBLOCK = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS) //MORPHBLOCK = getAssignedBlock("MORPH", numsToAssign, DNA_HARDER_BOUNDS) //COLDBLOCK = getAssignedBlock("COLD", numsToAssign) //HALLUCINATIONBLOCK = getAssignedBlock("HALLUCINATION", numsToAssign) diff --git a/code/game/gamemodes/wizard/artifact.dm b/code/game/gamemodes/wizard/artifact.dm index 0ce1f94d12..15ac80ced4 100644 --- a/code/game/gamemodes/wizard/artifact.dm +++ b/code/game/gamemodes/wizard/artifact.dm @@ -6,7 +6,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "render" item_state = "render" - flags = FPRINT | TABLEPASS force = 15 throwforce = 10 w_class = 3 diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 12360194d1..678ce72582 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -5,7 +5,6 @@ item_state = "electronic" desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." w_class = 1.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT origin_tech = "bluespace=4;materials=4" var/imprinted = "empty" @@ -88,7 +87,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "construct" desc = "A wicked machine used by those skilled in magical arts. It is inactive" - flags = FPRINT | TABLEPASS /obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/device/soulstone)) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index d490e75dc6..716045a721 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -6,7 +6,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS var/uses = 5 var/temp = null var/max_uses = 5 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b79fe4ba30..ab3806a97c 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -120,7 +120,7 @@ var/wizard_name_second = pick(wizard_second) var/randomname = "[wizard_name_first] [wizard_name_second]" spawn(0) - var/newname = copytext(sanitize(input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) + var/newname = sanitize(copytext(input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text,1,MAX_NAME_LEN)) if (!newname) newname = randomname diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 270a4e3867..3211803412 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -9,7 +9,7 @@ selection_color = "#dddddd" access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() - alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Security Cadet") + alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Security Cadet","Visitor") /datum/job/assistant/equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 34fe340a12..e7ce82b595 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -27,7 +27,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) spawn(0) var/religion_name = "Christianity" - var/new_religion = copytext(sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN) + var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN)) if (!new_religion) new_religion = religion_name @@ -62,7 +62,7 @@ spawn(1) var/deity_name = "Space Jesus" - var/new_deity = copytext(sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name)),1,MAX_NAME_LEN) + var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN)) if ((length(new_deity) == 0) || (new_deity == "Space Jesus") ) new_deity = deity_name diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 0c44f6f260..c0d9bd44b3 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -110,3 +110,6 @@ if(H.r_store) H.r_store.add_fingerprint(H,1) return 1 + +/datum/job/proc/is_position_available() + return (current_positions < total_positions) || (total_positions == -1) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 07ceefb8b3..11d8f70a12 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -3,7 +3,7 @@ flag = AI department_flag = ENGSEC faction = "Station" - total_positions = 0 + total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm spawn_positions = 1 selection_color = "#ccffcc" supervisors = "your laws" @@ -14,6 +14,8 @@ if(!H) return 0 return 1 +/datum/job/ai/is_position_available() + return (empty_playable_ai_cores.len != 0) /datum/job/cyborg diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index b3918713e7..87f8989b10 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -463,7 +463,9 @@ var/global/datum/controller/occupations/job_master switch(rank) if("Cyborg") return H.Robotize() - if("AI","Clown") //don't need bag preference stuff! + if("AI") + return H + if("Clown") //don't need bag preference stuff! else switch(H.backbag) //BS12 EDIT if(1) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 9e52c28133..91c96fcfc9 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -189,10 +189,12 @@ if(filtering > 0) if(beaker) if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - src.occupant.vessel.trans_to(beaker, 1) + var/pumped = 0 for(var/datum/reagent/x in src.occupant.reagents.reagent_list) src.occupant.reagents.trans_to(beaker, 3) - src.occupant.vessel.trans_to(beaker, 1) + pumped++ + if (ishuman(src.occupant)) + src.occupant.vessel.trans_to(beaker, pumped + 1) src.updateUsrDialog() return diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 3819c2d9d5..1dd4615461 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -696,6 +696,10 @@ siphoning if(data["scrubbing"]) sensor_data += {" Filtering: +Oxygen +[data["filter_o2"]?"on":"off"]; +Nitrogen +[data["filter_n2"]?"on":"off"]; Carbon Dioxide [data["filter_co2"]?"on":"off"]; Toxins @@ -817,6 +821,8 @@ table tr:first-child th:first-child { border: none;} "adjust_external_pressure", "set_external_pressure", "checks", + "o2_scrub", + "n2_scrub", "co2_scrub", "tox_scrub", "n2o_scrub", @@ -1005,7 +1011,7 @@ Code shamelessly copied from apc_frame desc = "Used for building Air Alarms" icon = 'icons/obj/monitors.dmi' icon_state = "alarm_bitem" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) @@ -1340,7 +1346,7 @@ Code shamelessly copied from apc_frame desc = "Used for building Fire Alarms" icon = 'icons/obj/monitors.dmi' icon_state = "fire_bitem" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3e91d70f6c..4d96320518 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -4,7 +4,7 @@ icon_state = "yellow" density = 1 var/health = 100.0 - flags = FPRINT | CONDUCT + flags = CONDUCT var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6f9a2c4b95..7b44e443c4 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -21,9 +21,16 @@ var/datum/wires/autolathe/wires = null +/obj/machinery/autolathe/proc/update_recipe_list() + if(!machine_recipes) + machine_recipes = autolathe_recipes + /obj/machinery/autolathe/interact(mob/user as mob) - if(..() || disabled) + update_recipe_list() + + if(..() || (disabled && !panel_open)) + user << "\The [src] is disabled!" return if (shocked) @@ -31,7 +38,7 @@ var/dat = "

Autolathe Control Panel


" - if(panel_open == 0) + if(!disabled) dat += "" var/material_top = "" var/material_bottom = "" @@ -81,7 +88,7 @@ dat += "

" //Hacking. - else + if(panel_open) dat += "

Maintenance Panel

" dat += wires.GetInteractWindow() @@ -96,7 +103,7 @@ return if (busy) - user << "\red \The [src] is busy. Please wait for completion of previous operation." + user << "\The [src] is busy. Please wait for completion of previous operation." return if(istype(O, /obj/item/weapon/screwdriver)) @@ -117,6 +124,9 @@ dismantle() return + if(O.loc != user && !(istype(O,/obj/item/stack))) + return 0 + //Resources are being loaded. var/obj/item/eating = O if(!eating.matter) @@ -153,7 +163,7 @@ mass_per_sheet += eating.matter[material] if(!filltype) - user << "\red \The [src] is full. Please remove material from the autolathe in order to insert more." + user << "\The [src] is full. Please remove material from the autolathe in order to insert more." return else if(filltype == 1) user << "You fill \the [src] to capacity with \the [eating]." @@ -185,7 +195,7 @@ add_fingerprint(usr) if(busy) - usr << "\red The autolathe is busy. Please wait for completion of previous operation." + usr << "The autolathe is busy. Please wait for completion of previous operation." return if(href_list["change_category"]) @@ -258,11 +268,6 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(src) RefreshParts() - -/obj/machinery/autolathe/initialize() - ..() - machine_recipes = autolathe_recipes - //Updates overall lathe storage size. /obj/machinery/autolathe/RefreshParts() ..() diff --git a/code/game/machinery/bees_items.dm b/code/game/machinery/bees_items.dm index e02a0a1a23..486b46d33c 100644 --- a/code/game/machinery/bees_items.dm +++ b/code/game/machinery/bees_items.dm @@ -65,7 +65,6 @@ name = "bottle of BeezEez" icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" - flags = FPRINT | TABLEPASS New() src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index b913119a57..30f6dfaa8c 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -9,7 +9,6 @@ throw_speed = 2 throw_range = 5 w_class = 3.0 - flags = TABLEPASS var/created_name = "Cleanbot" diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm index 1c0bd0875f..4db416e7a6 100644 --- a/code/game/machinery/bots/farmbot.dm +++ b/code/game/machinery/bots/farmbot.dm @@ -583,7 +583,7 @@ else if(istype(W, /obj/item/weapon/pen)) var/t = input(user, "Enter new robot name", src.name, src.created_name) as text - t = copytext(sanitize(t), 1, MAX_NAME_LEN) + t = sanitize(copytext(t, 1, MAX_NAME_LEN)) if (!t) return if (!in_range(src, usr) && src.loc != usr) diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index 0164199daa..54c8390234 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -9,7 +9,6 @@ throw_speed = 2 throw_range = 5 w_class = 3.0 - flags = TABLEPASS var/created_name = "Floorbot" /obj/item/weapon/toolbox_tiles_sensor @@ -22,7 +21,6 @@ throw_speed = 2 throw_range = 5 w_class = 3.0 - flags = TABLEPASS var/created_name = "Floorbot" //Floorbot diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 6d3842f879..65a40289d0 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -281,9 +281,6 @@ src.speak(message) src.visible_message("[src] points at [C.name]!") src.last_newpatient_speak = world.time - if(declare_treatment) - var/area/location = get_area(src) - broadcast_medical_hud_message("[src.name] is treating [C] in [location]", src) break else continue @@ -438,6 +435,10 @@ src.patient.reagents.add_reagent(reagent_id,src.injection_amount) visible_message("\red [src] injects [src.patient] with the syringe!") + if(declare_treatment) + var/area/location = get_area(src) + broadcast_medical_hud_message("[src.name] is treating [C] in [location]", src) + src.icon_state = "medibot[src.on]" src.currently_healing = 0 return diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index e7f766a5b4..d130f9e2e4 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -309,7 +309,7 @@ if("setid") refresh=0 - var/new_id = copytext(sanitize(input("Enter new bot ID", "Mulebot [suffix ? "([suffix])" : ""]", suffix) as text|null),1,MAX_NAME_LEN) + var/new_id = sanitize(copytext(input("Enter new bot ID", "Mulebot [suffix ? "([suffix])" : ""]", suffix) as text|null,1,MAX_NAME_LEN)) refresh=1 if(new_id) suffix = new_id diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index eab3e5eda7..d631ca46df 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -36,6 +36,9 @@ wires = new(src) assembly = new(src) assembly.state = 4 + + invalidateCameraCache() + /* // Use this to look for cameras that have the same c_tag. for(var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network @@ -51,7 +54,7 @@ ASSERT(src.network.len > 0) ..() -/obj/machinery/camera/Del() +/obj/machinery/camera/Del() if(!alarm_on) triggerCameraAlarm() @@ -61,6 +64,7 @@ /obj/machinery/camera/emp_act(severity) if(!isEmpProof()) if(prob(100/severity)) + invalidateCameraCache() stat |= EMPED SetLuminosity(0) kick_viewers() @@ -71,7 +75,7 @@ stat &= ~EMPED cancelCameraAlarm() update_icon() - + invalidateCameraCache() ..() /obj/machinery/camera/bullet_act(var/obj/item/projectile/P) @@ -118,7 +122,7 @@ destroy() /obj/machinery/camera/attackby(obj/W as obj, mob/living/user as mob) - + invalidateCameraCache() // DECONSTRUCTION if(isscrewdriver(W)) //user << "You start to [panel_open ? "close" : "open"] the camera's panel." @@ -199,6 +203,7 @@ //legacy support, if choice is != 1 then just kick viewers without changing status kick_viewers() else + invalidateCameraCache() set_status( !src.status ) if (!(src.status)) visible_message("\red [user] has deactivated [src]!") @@ -218,6 +223,7 @@ //Used when someone breaks a camera /obj/machinery/camera/proc/destroy() + invalidateCameraCache() stat |= BROKEN kick_viewers() triggerCameraAlarm() @@ -232,6 +238,7 @@ /obj/machinery/camera/proc/set_status(var/newstatus) if (status != newstatus) status = newstatus + invalidateCameraCache() // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. //I guess that doesn't matter since they couldn't use it anyway? @@ -257,12 +264,18 @@ /obj/machinery/camera/proc/triggerCameraAlarm() alarm_on = 1 + if(!get_area(src)) + return + for(var/mob/living/silicon/S in mob_list) S.triggerAlarm("Camera", get_area(src), list(src), src) /obj/machinery/camera/proc/cancelCameraAlarm() alarm_on = 0 + if(!get_area(src)) + return + for(var/mob/living/silicon/S in mob_list) S.cancelAlarm("Camera", get_area(src), src) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index f274a1d07e..52d74a23b9 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -15,15 +15,11 @@ if(src.stat == 2) return - var/list/L = list() - for (var/obj/machinery/camera/C in cameranet.cameras) - L.Add(C) - - camera_sort(L) + cameranet.process_sort() var/list/T = list() T["Cancel"] = "Cancel" - for (var/obj/machinery/camera/C in L) + for (var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network if (tempnetwork.len) T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C @@ -54,7 +50,7 @@ set name = "Store Camera Location" set desc = "Stores your current camera location by the given name" - loc = copytext(sanitize(loc), 1, MAX_MESSAGE_LEN) + loc = sanitize(copytext(loc, 1, MAX_MESSAGE_LEN)) if(!loc) src << "\red Must supply a location name" return @@ -236,7 +232,11 @@ return 1 /proc/trackable(var/mob/living/M) - return near_camera(M) || (M.loc.z in config.station_levels && hassensorlevel(M, SUIT_SENSOR_TRACKING)) + var/turf/T = get_turf(M) + if(T && (T.z in config.station_levels) && hassensorlevel(M, SUIT_SENSOR_TRACKING)) + return 1 + + return near_camera(M) /obj/machinery/camera/attack_ai(var/mob/living/silicon/ai/user as mob) if (!istype(user)) @@ -248,19 +248,3 @@ /mob/living/silicon/ai/attack_ai(var/mob/user as mob) ai_camera_list() - -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = L.len, i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (a.c_tag_order != b.c_tag_order) - if (a.c_tag_order > b.c_tag_order) - L.Swap(j, j + 1) - else - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index abcdb51a51..e6075cb5a9 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -418,7 +418,6 @@ var/global/list/holodeck_programs = list( icon = 'icons/obj/objects.dmi' icon_state = "stool" anchored = 1.0 - flags = FPRINT pressure_resistance = 15 @@ -454,7 +453,7 @@ var/global/list/holodeck_programs = list( throw_range = 5 throwforce = 0 w_class = 2.0 - flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY + flags = NOSHIELD | NOBLOODY var/active = 0 /obj/item/weapon/holo/esword/green diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 69c884ec70..7bd8e4b8e8 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -168,9 +168,15 @@ if(istype(P, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "\blue You connect the monitor." - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain ) - if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created - A.rename_self("ai", 1) + if(!brain) + var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" + var/obj/structure/AIcore/deactivated/D = new(loc) + if(open_for_latejoin) + empty_playable_ai_cores += D + else + var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain ) + if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created + A.rename_self("ai", 1) feedback_inc("cyborg_ais_created",1) del(src) @@ -207,14 +213,53 @@ if (ai.mind == malfai) return 1 -/obj/structure/AIcore/deactivated/attackby(var/obj/item/device/aicard/card, var/mob/user) +/obj/structure/AIcore/deactivated/attackby(var/obj/item/weapon/W, var/mob/user) - if(istype(card)) + if(istype(W, /obj/item/device/aicard)) + var/obj/item/device/aicard/card = W var/mob/living/silicon/ai/transfer = locate() in card if(transfer) load_ai(transfer,card,user) else user << "\red ERROR: \black Unable to locate artificial intelligence." return + else if(istype(W, /obj/item/weapon/wrench)) + if(anchored) + user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...") + if(!do_after(user,40)) + user.visible_message("\blue \The [user] decides not to unbolt \the [src].") + return + user.visible_message("\blue \The [user] finishes unfastening \the [src]!") + anchored = 0 + return + else + user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...") + if(!do_after(user,40)) + user.visible_message("\blue \The [user] decides not to bolt \the [src].") + return + user.visible_message("\blue \The [user] finishes fastening down \the [src]!") + anchored = 1 + return + else + return ..() - ..() +/client/proc/empty_ai_core_toggle_latejoin() + set name = "Toggle AI Core Latejoin" + set category = "Admin" + + var/list/cores = list() + for(var/obj/structure/AIcore/deactivated/D in world) + cores["[D] ([D.loc.loc])"] = D + + var/id = input("Which core?", "Toggle AI Core Latejoin", null) as null|anything in cores + if(!id) return + + var/obj/structure/AIcore/deactivated/D = cores[id] + if(!D) return + + if(D in empty_playable_ai_cores) + empty_playable_ai_cores -= D + src << "\The [id] is now not available for latejoining AIs." + else + empty_playable_ai_cores += D + src << "\The [id] is now available for latejoining AIs." diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm similarity index 100% rename from code/WorkInProgress/Mini/atmos_control.dm rename to code/game/machinery/computer/atmos_control.dm diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 0a7f27d701..bb2d342bfc 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,5 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +/proc/invalidateCameraCache() + for(var/obj/machinery/computer/security/s in world) + s.camera_cache = null /obj/machinery/computer/security name = "security camera monitor" @@ -10,6 +13,7 @@ var/list/network = list("SS13") var/mapping = 0//For the overview file, interesting bit of code. circuit = /obj/item/weapon/circuitboard/security + var/camera_cache = null attack_ai(var/mob/user as mob) @@ -32,29 +36,45 @@ data["current"] = null - var/list/L = list() - for (var/obj/machinery/camera/C in cameranet.cameras) - if(can_access_camera(C)) - L.Add(C) + if(isnull(camera_cache)) + cameranet.process_sort() - camera_sort(L) + var/cameras[0] + for(var/obj/machinery/camera/C in cameranet.cameras) + if(!can_access_camera(C)) + continue - var/cameras[0] - for(var/obj/machinery/camera/C in L) - var/cam[0] - cam["name"] = C.c_tag - cam["deact"] = !C.can_use() - cam["camera"] = "\ref[C]" - cam["x"] = C.x - cam["y"] = C.y - cam["z"] = C.z + var/cam[0] + cam["name"] = sanitize(C.c_tag) + cam["deact"] = !C.can_use() + cam["camera"] = "\ref[C]" + cam["x"] = C.x + cam["y"] = C.y + cam["z"] = C.z - cameras[++cameras.len] = cam + cameras[++cameras.len] = cam + + if(C == current) + data["current"] = cam + + var/list/camera_list = list("cameras" = cameras) + camera_cache=list2json(camera_list) + + else + if(current) + var/cam[0] + cam["name"] = current.c_tag + cam["deact"] = !current.can_use() + cam["camera"] = "\ref[current]" + cam["x"] = current.x + cam["y"] = current.y + cam["z"] = current.z - if(C == current) data["current"] = cam - data["cameras"] = cameras + + if(ui) + ui.load_cached_data(camera_cache) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -65,6 +85,7 @@ // adding a template with the key "mapHeader" replaces the map header content ui.add_template("mapHeader", "sec_camera_map_header.tmpl") + ui.load_cached_data(camera_cache) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index fddc863575..be5a73d90f 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -191,7 +191,7 @@ if (is_authenticated() && modify) var/t1 = href_list["assign_target"] if(t1 == "Custom") - var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,45) + var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,45)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) modify.assignment = temp_t diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f187957f5b..f18d906383 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -175,10 +175,10 @@ post_status(href_list["statdisp"]) if("setmsg1") - stat_msg1 = reject_bad_text(trim(copytext(sanitize(input("Line 1", "Enter Message Text", stat_msg1) as text|null), 1, 40)), 40) + stat_msg1 = reject_bad_text(trim(sanitize(copytext(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 1, 40))), 40) src.updateDialog() if("setmsg2") - stat_msg2 = reject_bad_text(trim(copytext(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null), 1, 40)), 40) + stat_msg2 = reject_bad_text(trim(sanitize(copytext(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 1, 40))), 40) src.updateDialog() // OMG CENTCOMM LETTERHEAD @@ -496,8 +496,14 @@ return emergency_shuttle.call_transfer() - log_game("[key_name(user)] has called the shuttle.") - message_admins("[key_name_admin(user)] has called the shuttle.", 1) + + //delay events in case of an autotransfer + if (isnull(user)) + event_manager.delay_events(EVENT_LEVEL_MODERATE, 9000) //15 minutes + event_manager.delay_events(EVENT_LEVEL_MAJOR, 9000) + + log_game("[user? key_name(user) : "Autotransfer"] has called the shuttle.") + message_admins("[user? key_name_admin(user) : "Autotransfer"] has called the shuttle.", 1) return diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index ff88f89c5a..b639334c01 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -101,6 +101,20 @@ return text +/obj/machinery/computer/attack_ghost(user as mob) + return src.attack_hand(user) + +/obj/machinery/computer/attack_hand(user as mob) + /* Observers can view computers, but not actually use them via Topic*/ + if(istype(user, /mob/dead/observer)) return 0 + return ..() + +/obj/machinery/computer/Topic(href, href_list) + /* Can't use topic as observer by default */ + if(istype(usr, /mob/dead/observer)) return 0 + return ..() + + /obj/machinery/computer/attackby(I as obj, user as mob) if(istype(I, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/WorkInProgress/Chinsky/guestpass.dm b/code/game/machinery/computer/guestpass.dm similarity index 100% rename from code/WorkInProgress/Chinsky/guestpass.dm rename to code/game/machinery/computer/guestpass.dm diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 5c970f9d67..2d73e17da8 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -50,7 +50,9 @@ else usr << "[src.current.name] selected for law changes." return - + + attack_ghost(user as mob) + return 1 /obj/machinery/computer/borgupload @@ -83,3 +85,6 @@ else usr << "[src.current.name] selected for law changes." return + + attack_ghost(user as mob) + return 1 diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index b8fb87bc31..b67834eb60 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -250,7 +250,7 @@ switch(href_list["field"]) if("fingerprint") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["fingerprint"] = t1 @@ -268,55 +268,55 @@ src.active1.fields["age"] = t1 if("mi_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg"] = t1 if("alg_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg_d"] = t1 if("cdi") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi_d"] = t1 if("notes") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 @@ -331,21 +331,21 @@ src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["name"] = t1 if("vir_desc") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["description"] = t1 @@ -450,7 +450,7 @@ if (!( istype(src.active2, /datum/data/record) )) return var/a2 = src.active2 - var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return var/counter = 1 diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 8cdd7f10fe..a30f355d2a 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -430,7 +430,7 @@ //Enter message if("Message") custommessage = input(usr, "Please enter your message.") as text|null - custommessage = copytext(sanitize(custommessage), 1, MAX_MESSAGE_LEN) + custommessage = sanitize(copytext(custommessage, 1, MAX_MESSAGE_LEN)) //Send message if("Send") diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index cdbdfe048f..00e7554727 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -90,7 +90,7 @@ usr << "Unauthorized Access." else if(href_list["warn"]) - var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) + var/warning = sanitize(copytext(input(usr,"Message:","Enter your message here!",""),1,MAX_MESSAGE_LEN)) if(!warning) return var/obj/item/weapon/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e14c277981..58924ed707 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -384,7 +384,7 @@ What a mess.*/ if (!( istype(active2, /datum/data/record) )) return var/a2 = active2 - var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Add Comment:", "Secure. records", null, null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return var/counter = 1 @@ -432,13 +432,13 @@ What a mess.*/ active1.fields["name"] = t1 if("id") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input id:", "Secure. records", active1.fields["id"], null) as text,1,MAX_MESSAGE_LEN))) if (!t1 || active1 != a1) return active1.fields["id"] = t1 if("fingerprint") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))) if (!t1 || active1 != a1) return active1.fields["fingerprint"] = t1 @@ -456,31 +456,31 @@ What a mess.*/ active1.fields["age"] = t1 if("mi_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN))) if (!t1 || active2 != a2) return active2.fields["mi_crim"] = t1 if("mi_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if (!t1 || active2 != a2) return active2.fields["mi_crim_d"] = t1 if("ma_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN))) if (!t1 || active2 != a2) return active2.fields["ma_crim"] = t1 if("ma_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if (!t1 || active2 != a2) return active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN))) if (!t1 || active2 != a2) return active2.fields["notes"] = t1 @@ -507,7 +507,7 @@ What a mess.*/ alert(usr, "You do not have the required rank to do this!") if("species") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please enter race:", "General records", active1.fields["species"], null) as message,1,MAX_MESSAGE_LEN))) if (!t1 || active1 != a1) return active1.fields["species"] = t1 diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index aa573e39aa..8382f87185 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -315,13 +315,13 @@ What a mess.*/ active1.fields["name"] = t1 if("id") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input id:", "Secure. records", active1.fields["id"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["id"] = t1 if("fingerprint") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["fingerprint"] = t1 @@ -350,7 +350,7 @@ What a mess.*/ alert(usr, "You do not have the required rank to do this!") if("species") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please enter race:", "General records", active1.fields["species"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["species"] = t1 diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index fe109c4771..9f69c7bc1c 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -85,7 +85,7 @@ if(!istype(P)) return var/timeout = world.time + 600 - var/reason = copytext(sanitize(input(usr,"Reason:","Why do you require this item?","") as null|text),1,MAX_MESSAGE_LEN) + var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN)) if(world.time > timeout) return if(!reason) return @@ -289,7 +289,7 @@ if(!istype(P)) return var/timeout = world.time + 600 - var/reason = copytext(sanitize(input(usr,"Reason:","Why do you require this item?","") as null|text),1,MAX_MESSAGE_LEN) + var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN)) if(world.time > timeout) return if(!reason) return diff --git a/code/WorkInProgress/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm similarity index 100% rename from code/WorkInProgress/computer3/NTOS.dm rename to code/game/machinery/computer3/NTOS.dm diff --git a/code/WorkInProgress/computer3/bios.dm b/code/game/machinery/computer3/bios.dm similarity index 100% rename from code/WorkInProgress/computer3/bios.dm rename to code/game/machinery/computer3/bios.dm diff --git a/code/WorkInProgress/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm similarity index 100% rename from code/WorkInProgress/computer3/buildandrepair.dm rename to code/game/machinery/computer3/buildandrepair.dm diff --git a/code/WorkInProgress/computer3/component.dm b/code/game/machinery/computer3/component.dm similarity index 100% rename from code/WorkInProgress/computer3/component.dm rename to code/game/machinery/computer3/component.dm diff --git a/code/WorkInProgress/computer3/computer.dm b/code/game/machinery/computer3/computer.dm similarity index 100% rename from code/WorkInProgress/computer3/computer.dm rename to code/game/machinery/computer3/computer.dm diff --git a/code/WorkInProgress/computer3/computer3_notes.dm b/code/game/machinery/computer3/computer3_notes.dm similarity index 100% rename from code/WorkInProgress/computer3/computer3_notes.dm rename to code/game/machinery/computer3/computer3_notes.dm diff --git a/code/WorkInProgress/computer3/computers/HolodeckControl.dm b/code/game/machinery/computer3/computers/HolodeckControl.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/HolodeckControl.dm rename to code/game/machinery/computer3/computers/HolodeckControl.dm diff --git a/code/WorkInProgress/computer3/computers/Operating.dm b/code/game/machinery/computer3/computers/Operating.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/Operating.dm rename to code/game/machinery/computer3/computers/Operating.dm diff --git a/code/WorkInProgress/computer3/computers/arcade.dm b/code/game/machinery/computer3/computers/arcade.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/arcade.dm rename to code/game/machinery/computer3/computers/arcade.dm diff --git a/code/WorkInProgress/computer3/computers/atmos_alert.dm b/code/game/machinery/computer3/computers/atmos_alert.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/atmos_alert.dm rename to code/game/machinery/computer3/computers/atmos_alert.dm diff --git a/code/WorkInProgress/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm similarity index 99% rename from code/WorkInProgress/computer3/computers/camera.dm rename to code/game/machinery/computer3/computers/camera.dm index b3a0c7fcfa..cacf665849 100644 --- a/code/WorkInProgress/computer3/computers/camera.dm +++ b/code/game/machinery/computer3/computers/camera.dm @@ -141,14 +141,14 @@ if (!computer || computer.z > 6) return null + cameranet.process_sort() + var/list/L = list() for(var/obj/machinery/camera/C in cameranet.cameras) var/list/temp = C.network & key.networks if(temp.len) L.Add(C) - camera_sort(L) - return L verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null) if(!istype(C) || !C.can_use()) diff --git a/code/WorkInProgress/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm similarity index 98% rename from code/WorkInProgress/computer3/computers/card.dm rename to code/game/machinery/computer3/computers/card.dm index 5acb7c9de2..963b1f4de7 100644 --- a/code/WorkInProgress/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -304,7 +304,7 @@ if(auth) var/t1 = href_list["assign"] if(t1 == "Custom") - var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,MAX_MESSAGE_LEN) + var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) if(temp_t) t1 = temp_t set_default_access(t1) diff --git a/code/WorkInProgress/computer3/computers/communications.dm b/code/game/machinery/computer3/computers/communications.dm similarity index 98% rename from code/WorkInProgress/computer3/computers/communications.dm rename to code/game/machinery/computer3/computers/communications.dm index f39c4c17fd..bb268ba0c0 100644 --- a/code/WorkInProgress/computer3/computers/communications.dm +++ b/code/game/machinery/computer3/computers/communications.dm @@ -178,10 +178,10 @@ post_status(href_list["statdisp"]) if("setmsg1" in href_list) - stat_msg1 = reject_bad_text(trim(copytext(sanitize(input("Line 1", "Enter Message Text", stat_msg1) as text|null), 1, 40)), 40) + stat_msg1 = reject_bad_text(trim(sanitize(copytext(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 1, 40)), 40)) computer.updateDialog() if("setmsg2" in href_list) - stat_msg2 = reject_bad_text(trim(copytext(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null), 1, 40)), 40) + stat_msg2 = reject_bad_text(trim(sanitize(copytext(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 1, 40)), 40)) computer.updateDialog() // OMG CENTCOMM LETTERHEAD diff --git a/code/WorkInProgress/computer3/computers/crew.dm b/code/game/machinery/computer3/computers/crew.dm similarity index 96% rename from code/WorkInProgress/computer3/computers/crew.dm rename to code/game/machinery/computer3/computers/crew.dm index 170bd92607..836500a344 100644 --- a/code/WorkInProgress/computer3/computers/crew.dm +++ b/code/game/machinery/computer3/computers/crew.dm @@ -35,7 +35,7 @@ var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]" var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])" - log += "[H.get_id_name()]" + log += "[H.get_authentification_name()] ([H.get_assignment()])" switch(C.sensor_mode) if(1) diff --git a/code/WorkInProgress/computer3/computers/customs.dm b/code/game/machinery/computer3/computers/customs.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/customs.dm rename to code/game/machinery/computer3/computers/customs.dm diff --git a/code/WorkInProgress/computer3/computers/law.dm b/code/game/machinery/computer3/computers/law.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/law.dm rename to code/game/machinery/computer3/computers/law.dm diff --git a/code/WorkInProgress/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm similarity index 94% rename from code/WorkInProgress/computer3/computers/medical.dm rename to code/game/machinery/computer3/computers/medical.dm index f7e6167e1d..fa75c69ac6 100644 --- a/code/WorkInProgress/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -263,7 +263,7 @@ switch(href_list["field"]) if("fingerprint") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["fingerprint"] = t1 @@ -281,55 +281,55 @@ src.active1.fields["age"] = t1 if("mi_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg"] = t1 if("alg_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg_d"] = t1 if("cdi") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi_d"] = t1 if("notes") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 @@ -344,21 +344,21 @@ src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(trim(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(trim(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text),1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["name"] = t1 if("vir_desc") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["description"] = t1 @@ -463,7 +463,7 @@ if (!( istype(src.active2, /datum/data/record) )) return var/a2 = src.active2 - var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return var/counter = 1 diff --git a/code/WorkInProgress/computer3/computers/power.dm b/code/game/machinery/computer3/computers/power.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/power.dm rename to code/game/machinery/computer3/computers/power.dm diff --git a/code/WorkInProgress/computer3/computers/prisoner.dm b/code/game/machinery/computer3/computers/prisoner.dm similarity index 96% rename from code/WorkInProgress/computer3/computers/prisoner.dm rename to code/game/machinery/computer3/computers/prisoner.dm index f1df9b2a59..7b0c97d4ae 100644 --- a/code/WorkInProgress/computer3/computers/prisoner.dm +++ b/code/game/machinery/computer3/computers/prisoner.dm @@ -90,7 +90,7 @@ screen = !screen else if(href_list["warn"]) - var/warning = trim(copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN)) + var/warning = trim(sanitize(copytext(input(usr,"Message:","Enter your message here!",""),1,MAX_MESSAGE_LEN))) if(!warning) return var/obj/item/weapon/implant/I = locate(href_list["warn"]) if( istype(I) && I.imp_in) diff --git a/code/WorkInProgress/computer3/computers/robot.dm b/code/game/machinery/computer3/computers/robot.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/robot.dm rename to code/game/machinery/computer3/computers/robot.dm diff --git a/code/WorkInProgress/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm similarity index 96% rename from code/WorkInProgress/computer3/computers/security.dm rename to code/game/machinery/computer3/computers/security.dm index 1c409da853..8cebdfb5f2 100644 --- a/code/WorkInProgress/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -404,7 +404,7 @@ What a mess.*/ if (!( istype(active2, /datum/data/record) )) return var/a2 = active2 - var/t1 = copytext(sanitize(input("Add Comment:", "Secure. records", null, null) as message),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(input("Add Comment:", "Secure. records", null, null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return var/counter = 1 @@ -450,13 +450,13 @@ What a mess.*/ active1.fields["name"] = t1 if("id") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input id:", "Secure. records", active1.fields["id"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["id"] = t1 if("fingerprint") if (istype(active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["fingerprint"] = t1 @@ -474,31 +474,31 @@ What a mess.*/ active1.fields["age"] = t1 if("mi_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim"] = t1 if("mi_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim_d"] = t1 if("ma_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim"] = t1 if("ma_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = trim(sanitize(copytext(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) + var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["notes"] = t1 @@ -525,7 +525,7 @@ What a mess.*/ alert(usr, "You do not have the required rank to do this!") if("species") if (istype(active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(input("Please enter race:", "General records", active1.fields["species"], null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["species"] = t1 diff --git a/code/WorkInProgress/computer3/computers/welcome.dm b/code/game/machinery/computer3/computers/welcome.dm similarity index 100% rename from code/WorkInProgress/computer3/computers/welcome.dm rename to code/game/machinery/computer3/computers/welcome.dm diff --git a/code/WorkInProgress/computer3/file.dm b/code/game/machinery/computer3/file.dm similarity index 100% rename from code/WorkInProgress/computer3/file.dm rename to code/game/machinery/computer3/file.dm diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm similarity index 100% rename from code/WorkInProgress/computer3/laptop.dm rename to code/game/machinery/computer3/laptop.dm diff --git a/code/WorkInProgress/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm similarity index 99% rename from code/WorkInProgress/computer3/lapvend.dm rename to code/game/machinery/computer3/lapvend.dm index 36de9e4cfc..72531b5d8e 100644 --- a/code/WorkInProgress/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -174,8 +174,9 @@ vendmode = 1 if("cancel") - relap.loc = src.loc - relap = null + if(relap) + relap.loc = src.loc + relap = null vendmode = 0 src.updateUsrDialog() diff --git a/code/WorkInProgress/computer3/networking.dm b/code/game/machinery/computer3/networking.dm similarity index 100% rename from code/WorkInProgress/computer3/networking.dm rename to code/game/machinery/computer3/networking.dm diff --git a/code/WorkInProgress/computer3/program.dm b/code/game/machinery/computer3/program.dm similarity index 100% rename from code/WorkInProgress/computer3/program.dm rename to code/game/machinery/computer3/program.dm diff --git a/code/WorkInProgress/computer3/program_disks.dm b/code/game/machinery/computer3/program_disks.dm similarity index 100% rename from code/WorkInProgress/computer3/program_disks.dm rename to code/game/machinery/computer3/program_disks.dm diff --git a/code/WorkInProgress/computer3/server.dm b/code/game/machinery/computer3/server.dm similarity index 100% rename from code/WorkInProgress/computer3/server.dm rename to code/game/machinery/computer3/server.dm diff --git a/code/WorkInProgress/computer3/storage.dm b/code/game/machinery/computer3/storage.dm similarity index 100% rename from code/WorkInProgress/computer3/storage.dm rename to code/game/machinery/computer3/storage.dm diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 32543822b9..7d10bd9a6f 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -288,6 +288,7 @@ M.client.eye = src M.stop_pulling() M.loc = src + M.ExtinguishMob() if(M.health > -100 && (M.health < 0 || M.sleeping)) M << "\blue You feel a cold liquid surround you. Your skin starts to freeze up." occupant = M diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 4fc82ebf4a..381a9790fb 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -96,7 +96,7 @@ if(!allow_items) return if(frozen_items.len == 0) - user << "\blue There is nothing to recover from storage." + user << "There is nothing to recover from storage." return var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items @@ -104,10 +104,10 @@ return if(!(I in frozen_items)) - user << "\blue \The [I] is no longer in storage." + user << "\The [I] is no longer in storage." return - visible_message("\blue The console beeps happily as it disgorges \the [I].", 3) + visible_message("The console beeps happily as it disgorges \the [I].", 3) I.loc = get_turf(src) frozen_items -= I @@ -116,10 +116,10 @@ if(!allow_items) return if(frozen_items.len == 0) - user << "\blue There is nothing to recover from storage." + user << "There is nothing to recover from storage." return - visible_message("\blue The console beeps happily as it disgorges the desired objects.", 3) + visible_message("The console beeps happily as it disgorges the desired objects.", 3) for(var/obj/item/I in frozen_items) I.loc = get_turf(src) @@ -141,7 +141,7 @@ //Decorative structures to go alongside cryopods. /obj/structure/cryofeed - name = "\improper cryogenic feed" + name = "cryogenic feed" desc = "A bewildering tangle of machinery and pipes." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "cryo_rear" @@ -163,7 +163,7 @@ //Cryopods themselves. /obj/machinery/cryopod - name = "\improper cryogenic freezer" + name = "cryogenic freezer" desc = "A man-sized pod for entering suspended animation." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scanner_0" @@ -277,113 +277,125 @@ if(!find_control_computer(urgent=1)) return - //Drop all items into the pod. - for(var/obj/item/W in occupant) - if(istype(W, /obj/item/device/mmi)) - if(istype(occupant, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = occupant - if(R.mmi == W) - del(W) - continue - occupant.drop_from_inventory(W) - W.loc = src + despawn_occupant() - if(W.contents.len) //Make sure we catch anything not handled by del() on the items. - for(var/obj/item/O in W.contents) - if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck! - continue - O.loc = src +// This function can not be undone; do not call this unless you are sure +// Also make sure there is a valid control computer +/obj/machinery/cryopod/robot/despawn_occupant() + var/mob/living/silicon/robot/R = occupant + if(!istype(R)) return ..() - //Delete all items not on the preservation list. - var/list/items = src.contents - items -= occupant // Don't delete the occupant - items -= announce // or the autosay radio. + del(R.mmi) + for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc + for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags + O.loc = R + del(I) + del(R.module) - for(var/obj/item/W in items) + return ..() - var/preserve = null - for(var/T in preserve_items) - if(istype(W,T)) - preserve = 1 - break +// This function can not be undone; do not call this unless you are sure +// Also make sure there is a valid control computer +/obj/machinery/cryopod/proc/despawn_occupant() + //Drop all items into the pod. + for(var/obj/item/W in occupant) + occupant.drop_from_inventory(W) + W.loc = src - if(!preserve) - del(W) - else - if(control_computer && control_computer.allow_items) - control_computer.frozen_items += W - W.loc = null - else - W.loc = src.loc + if(W.contents.len) //Make sure we catch anything not handled by del() on the items. + for(var/obj/item/O in W.contents) + if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck! + continue + O.loc = src - //Update any existing objectives involving this mob. - for(var/datum/objective/O in all_objectives) - // We don't want revs to get objectives that aren't for heads of staff. Letting - // them win or lose based on cryo is silly so we remove the objective. - if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind) - del(O) - else if(O.target && istype(O.target,/datum/mind)) - if(O.target == occupant.mind) - if(O.owner && O.owner.current) - O.owner.current << "\red You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]..." - O.target = null - spawn(1) //This should ideally fire after the occupant is deleted. - if(!O) return - O.find_target() - if(!(O.target)) - all_objectives -= O - O.owner.objectives -= O - del(O) + //Delete all items not on the preservation list. + var/list/items = src.contents + items -= occupant // Don't delete the occupant + items -= announce // or the autosay radio. - //Handle job slot/tater cleanup. - var/job = occupant.mind.assigned_role + for(var/obj/item/W in items) - job_master.FreeRole(job) + var/preserve = null + for(var/T in preserve_items) + if(istype(W,T)) + preserve = 1 + break - if(occupant.mind.objectives.len) - del(occupant.mind.objectives) - occupant.mind.special_role = null + if(!preserve) + del(W) + else + if(control_computer && control_computer.allow_items) + control_computer.frozen_items += W + W.loc = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode - current_mode.possible_traitors.Remove(occupant) + W.loc = src.loc - // Delete them from datacore. + //Update any existing objectives involving this mob. + for(var/datum/objective/O in all_objectives) + // We don't want revs to get objectives that aren't for heads of staff. Letting + // them win or lose based on cryo is silly so we remove the objective. + if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind) + del(O) + else if(O.target && istype(O.target,/datum/mind)) + if(O.target == occupant.mind) + if(O.owner && O.owner.current) + O.owner.current << "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]..." + O.target = null + spawn(1) //This should ideally fire after the occupant is deleted. + if(!O) return + O.find_target() + if(!(O.target)) + all_objectives -= O + O.owner.objectives -= O + del(O) - if(PDA_Manifest.len) - PDA_Manifest.Cut() - for(var/datum/data/record/R in data_core.medical) - if ((R.fields["name"] == occupant.real_name)) - del(R) - for(var/datum/data/record/T in data_core.security) - if ((T.fields["name"] == occupant.real_name)) - del(T) - for(var/datum/data/record/G in data_core.general) - if ((G.fields["name"] == occupant.real_name)) - del(G) + //Handle job slot/tater cleanup. + var/job = occupant.mind.assigned_role - if(orient_right) - icon_state = "[base_icon_state]-r" - else - icon_state = base_icon_state + job_master.FreeRole(job) - //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags? + if(occupant.mind.objectives.len) + del(occupant.mind.objectives) + occupant.mind.special_role = null + else + if(ticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + current_mode.possible_traitors.Remove(occupant) - //This should guarantee that ghosts don't spawn. - occupant.ckey = null + // Delete them from datacore. - //Make an announcement and log the person entering storage. - control_computer.frozen_crew += "[occupant.real_name]" + if(PDA_Manifest.len) + PDA_Manifest.Cut() + for(var/datum/data/record/R in data_core.medical) + if ((R.fields["name"] == occupant.real_name)) + del(R) + for(var/datum/data/record/T in data_core.security) + if ((T.fields["name"] == occupant.real_name)) + del(T) + for(var/datum/data/record/G in data_core.general) + if ((G.fields["name"] == occupant.real_name)) + del(G) - announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]") - visible_message("\blue \The [src] hums and hisses as it moves [occupant.real_name] into storage.", 3) + if(orient_right) + icon_state = "[base_icon_state]-r" + else + icon_state = base_icon_state - // Delete the mob. - del(occupant) - occupant = null - name = initial(name) + //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags? - return + //This should guarantee that ghosts don't spawn. + occupant.ckey = null + + //Make an announcement and log the person entering storage. + control_computer.frozen_crew += "[occupant.real_name]" + + announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]") + visible_message("\The [src] hums and hisses as it moves [occupant.real_name] into storage.", 3) + + // Delete the mob. + del(occupant) + occupant = null + name = initial(name) /obj/machinery/cryopod/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) @@ -391,7 +403,7 @@ if(istype(G, /obj/item/weapon/grab)) if(occupant) - user << "\blue \The [src] is in use." + user << "\The [src] is in use." return if(!ismob(G:affecting)) @@ -428,15 +440,15 @@ else icon_state = occupied_icon_state - M << "\blue [on_enter_occupant_message]" - M << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + M << "[on_enter_occupant_message]" + M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." occupant = M time_entered = world.time // Book keeping! var/turf/location = get_turf(src) log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)") - message_admins("\blue [key_name_admin(M)] has entered a stasis pod.") + message_admins("[key_name_admin(M)] has entered a stasis pod.") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) @@ -476,7 +488,7 @@ return if(src.occupant) - usr << "\blue \The [src] is in use." + usr << "\The [src] is in use." return for(var/mob/living/carbon/slime/M in range(1,usr)) @@ -492,7 +504,7 @@ return if(src.occupant) - usr << "\blue \The [src] is in use." + usr << "\The [src] is in use." return usr.stop_pulling() @@ -506,8 +518,8 @@ else icon_state = occupied_icon_state - usr << "\blue [on_enter_occupant_message]" - usr << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + usr << "[on_enter_occupant_message]" + usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." occupant = usr time_entered = world.time diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d5c8ae93e2..62e89cf03d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -876,6 +876,7 @@ About the new airlock wires panel: src.welded = 1 else src.welded = null + playsound(src, 'sound/items/Welder.ogg', 100, 1) src.update_icon() return else @@ -904,7 +905,7 @@ About the new airlock wires panel: beingcrowbarred = 1 //derp, Agouri else beingcrowbarred = 0 - if( beingcrowbarred && src.p_open && (operating == -1 || (density && welded && operating != 1 && !src.arePowerSystemsOn() && !src.locked)) ) + if( beingcrowbarred && src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) @@ -924,7 +925,7 @@ About the new airlock wires panel: da.created_name = src.name da.update_state() - if(operating == -1) + if(operating == -1 || (stat & BROKEN)) new /obj/item/weapon/circuitboard/broken(src.loc) operating = 0 else @@ -1073,10 +1074,6 @@ About the new airlock wires panel: /obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) ..() - //High-sec airlocks are much harder to completely break by emitters. - if(secured_wires) - emitter_resistance *= 3 - //if assembly is given, create the new door from the assembly if (assembly) assembly_type = assembly.type @@ -1135,7 +1132,7 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/proc/hasPower() - return ((src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) && !(stat & NOPOWER|BROKEN)) + return ((src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) && !(stat & (NOPOWER|BROKEN))) /obj/machinery/door/airlock/proc/prison_open() src.unlock() diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index c22a1e2bbc..f1f4306f56 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -23,7 +23,6 @@ var/id = 1.0 dir = 1 explosion_resistance = 25 - emitter_resistance = 50 // Lots of emitter blasts, it's *blast* door after all. // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) @@ -55,6 +54,7 @@ src.update_icon() src.SetOpacity(0) sleep(15) + src.layer = open_layer src.operating = 0 // Proc: force_close() @@ -62,6 +62,7 @@ // Description: Closes the door. No checks are done inside this proc. /obj/machinery/door/blast/proc/force_close() src.operating = 1 + src.layer = closed_layer flick(icon_state_closing, src) src.density = 1 update_nearby_tiles() @@ -136,13 +137,9 @@ /obj/machinery/door/blast/proc/repair_price() var/sheets_needed = 0 var/dam = maxhealth - health - var/bla = emitter_hits while(dam > 0) dam -= 150 sheets_needed++ - while(bla > 0) - bla -= 10 - sheets_needed++ return sheets_needed // Proc: repair() @@ -150,14 +147,9 @@ // Description: Fully repairs the blast door. /obj/machinery/door/blast/proc/repair() health = maxhealth - emitter_hits = 0 if(stat & BROKEN) stat &= ~BROKEN - - - - // SUBTYPE: Regular // Your classical blast door, found almost everywhere. obj/machinery/door/blast/regular @@ -175,5 +167,4 @@ obj/machinery/door/blast/regular icon_state_opening = "shutterc0" icon_state_closed = "shutter1" icon_state_closing = "shutterc1" - icon_state = "shutter1" - emitter_resistance = 20 \ No newline at end of file + icon_state = "shutter1" \ No newline at end of file diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 6668f79c76..1749fc1b4a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,8 +27,7 @@ var/air_properties_vary_with_direction = 0 var/maxhealth = 300 var/health - var/emitter_hits = 0 // For use when tracking amount of emitter hits taken. - var/emitter_resistance = 10 // Amount of emitter hits doors whistand + var/destroy_hits = 10 //How many strong hits it takes to destroy the door var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon var/obj/item/stack/sheet/metal/repairing @@ -146,18 +145,21 @@ return // Emitter Blasts - these will eventually completely destroy the door, given enough time. - if (istype(Proj, /obj/item/projectile/beam/emitter)) - if(health > 0) - Proj.damage /= 4 - else - emitter_hits ++ - if(emitter_hits >= emitter_resistance) - visible_message("\red [src.name] breaks apart!", 1) - new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! - del(src) + if (Proj.damage > 90) + destroy_hits-- + if (destroy_hits <= 0) + visible_message("\red \The [src.name] disintegrates!") + switch (Proj.damage_type) + if(BRUTE) + new /obj/item/stack/sheet/metal(src.loc, 2) + new /obj/item/stack/rods(src.loc, 3) + if(BURN) + new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! + del(src) if(Proj.damage) - take_damage(Proj.damage) + //cap projectile damage so that there's still a minimum number of hits required to break the door + take_damage(min(Proj.damage, 100)) @@ -188,7 +190,7 @@ /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/device/detective_scanner)) return - if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. + if(src.operating > 0 || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. src.add_fingerprint(user) if(!Adjacent(user)) user = null @@ -250,13 +252,6 @@ repairing = null return - if(src.density && (operable() && istype(I, /obj/item/weapon/card/emag))) - flick("door_spark", src) - sleep(6) - open() - operating = -1 - return 1 - //psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them. if(src.density && istype(I, /obj/item/weapon) && user.a_intent == "hurt" && !istype(I, /obj/item/weapon/card)) var/obj/item/weapon/W = I @@ -269,6 +264,15 @@ take_damage(W.force) return + if(src.operating) return + + if(src.density && (operable() && istype(I, /obj/item/weapon/card/emag))) + flick("door_spark", src) + sleep(6) + open() + operating = -1 + return 1 + if(src.allowed(user) && operable()) if(src.density) open() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 264fecbc2b..55b392feff 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -186,13 +186,14 @@ add_fingerprint(user) if(operating) return//Already doing something. - if(istype(C, /obj/item/weapon/weldingtool)) + if(istype(C, /obj/item/weapon/weldingtool) && !repairing) var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0, user)) blocked = !blocked user.visible_message("\The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].",\ "You [blocked ? "weld" : "unweld"] \the [src] with \the [W].",\ "You hear something being welded.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) update_icon() return @@ -203,7 +204,7 @@ update_icon() return - if(blocked && istype(C, /obj/item/weapon/crowbar)) + if(blocked && istype(C, /obj/item/weapon/crowbar) && !repairing) if(!hatch_open) user << "You must open the maintenance hatch first!" else @@ -215,19 +216,24 @@ user.visible_message("[user] has removed the electronics from \the [src].", "You have removed the electronics from [src].") - new/obj/item/weapon/airalarm_electronics(src.loc) + if (stat & BROKEN) + new /obj/item/weapon/circuitboard/broken(src.loc) + else + new/obj/item/weapon/airalarm_electronics(src.loc) + var/obj/structure/firedoor_assembly/FA = new/obj/structure/firedoor_assembly(src.loc) FA.anchored = 1 FA.density = 1 + FA.wired = 1 FA.update_icon() del(src) return if(blocked) - user << "\The [src] is welded solid!" + user << "\The [src] is welded shut!" return - if(istype(C, /obj/item/weapon/crowbar) || istype(C,/obj/item/weapon/melee/energy/blade) || istype(C,/obj/item/weapon/twohanded/fireaxe)) + if(istype(C, /obj/item/weapon/crowbar) || istype(C,/obj/item/weapon/twohanded/fireaxe)) if(operating) return @@ -262,6 +268,8 @@ spawn(0) close() return + + return ..() // CHECK PRESSURE /obj/machinery/door/firedoor/process() diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm index 017e758ef3..435a927857 100644 --- a/code/game/machinery/doors/firedoor_assembly.dm +++ b/code/game/machinery/doors/firedoor_assembly.dm @@ -5,7 +5,8 @@ obj/structure/firedoor_assembly icon_state = "door_construction" anchored = 0 opacity = 0 - density = 0 + density = 1 + var/wired = 0 obj/structure/firedoor_assembly/update_icon() if(anchored) @@ -14,7 +15,28 @@ obj/structure/firedoor_assembly/update_icon() icon_state = "door_construction" obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob) - if(istype(C, /obj/item/weapon/airalarm_electronics)) + if(istype(C, /obj/item/stack/cable_coil) && !wired && anchored) + var/obj/item/stack/cable_coil/cable = C + if (cable.get_amount() < 1) + user << "You need one length of coil to wire \the [src]." + return + user.visible_message("[user] wires \the [src].", "You start to wire \the [src].") + if(do_after(user, 40) && !wired && anchored) + if (cable.use(1)) + wired = 1 + user << "You wire \the [src]." + + else if(istype(C, /obj/item/weapon/wirecutters) && wired ) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].") + + if(do_after(user, 40)) + if(!src) return + user << "You cut the wires!" + new/obj/item/stack/cable_coil(src.loc, 1) + wired = 0 + + else if(istype(C, /obj/item/weapon/airalarm_electronics) && wired) if(anchored) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] has inserted a circuit into \the [src]!", @@ -26,7 +48,6 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob) user << "You must secure \the [src] first!" else if(istype(C, /obj/item/weapon/wrench)) anchored = !anchored - density = !density playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message("[user] has [anchored ? "" : "un" ]secured \the [src]!", "You have [anchored ? "" : "un" ]secured \the [src]!") diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 1a3cce2cf9..2b577a469a 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -230,6 +230,10 @@ Class Procs: /mob/living/silicon/ai/canUseTopic(atom/movable/M) if(stat) return + // Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras) + // unless it's on the same level as the object it's interacting with. + if(!(z == M.z || M.z in config.player_levels)) + return //stop AIs from leaving windows open and using then after they lose vision //apc_override is needed here because AIs use their own APC when powerless if(cameranet && !cameranet.checkTurfVis(get_turf(M)) && !apc_override) @@ -278,7 +282,7 @@ Class Procs: src.add_fingerprint(user) - return 0 + return ..() /obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames. return diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index a2dd432d99..8569ede3fd 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -323,7 +323,7 @@ if(speed <= 0) speed = 1 if("setpath") - var/newpath = copytext(sanitize(input(usr, "Please define a new path!",,path) as text|null),1,MAX_MESSAGE_LEN) + var/newpath = sanitize(copytext(input(usr, "Please define a new path!",,path) as text|null,1,MAX_MESSAGE_LEN)) if(newpath && newpath != "") moving = 0 // stop moving path = newpath diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 16e1cc032d..56fcd1298e 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -194,7 +194,7 @@ Transponder Codes:
    "} updateDialog() else if(href_list["locedit"]) - var/newloc = copytext(sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null),1,MAX_MESSAGE_LEN) + var/newloc = sanitize(copytext(input("Enter New Location", "Navigation Beacon", location) as text|null,1,MAX_MESSAGE_LEN)) if(newloc) location = newloc updateDialog() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 5e278bf2f5..5c56690228 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -945,7 +945,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) user << "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?" else var/s = strip_html( input(user, "Write something", "Newspaper", "") ) - s = copytext(sanitize(s), 1, MAX_MESSAGE_LEN) + s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN)) if (!s) return if (!in_range(src, usr) && src.loc != usr) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index baa5b9f975..8241887072 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -48,6 +48,8 @@ Buildable meters #define PIPE_SCRUBBERS_DOWN 40 #define PIPE_SUPPLY_CAP 41 #define PIPE_SCRUBBERS_CAP 42 +///// Mirrored T-valve ~ because I couldn't be bothered re-sorting all of the defines +#define PIPE_MTVALVEM 43 /obj/item/pipe name = "pipe" @@ -60,7 +62,6 @@ Buildable meters icon = 'icons/obj/pipe-item.dmi' icon_state = "simple" item_state = "buildpipe" - flags = TABLEPASS|FPRINT w_class = 3 level = 2 @@ -130,6 +131,8 @@ Buildable meters src.pipe_type = PIPE_PASSIVE_GATE else if(istype(make_from, /obj/machinery/atmospherics/unary/heat_exchanger)) src.pipe_type = PIPE_HEAT_EXCHANGE + else if(istype(make_from, /obj/machinery/atmospherics/tvalve/mirrored)) + src.pipe_type = PIPE_MTVALVEM else if(istype(make_from, /obj/machinery/atmospherics/tvalve)) src.pipe_type = PIPE_MTVALVE else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/visible/supply) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply)) @@ -244,6 +247,7 @@ Buildable meters "scrubbers pipe down", \ "supply pipe cap", \ "scrubbers pipe cap", \ + "t-valve m", \ ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -293,6 +297,7 @@ Buildable meters "cap", \ "cap", \ "cap", \ + "mtvalvem", \ ) icon_state = islist[pipe_type + 1] @@ -369,9 +374,9 @@ Buildable meters return dir|flip|cw|acw if(PIPE_MANIFOLD, PIPE_SUPPLY_MANIFOLD, PIPE_SCRUBBERS_MANIFOLD) return flip|cw|acw - if(PIPE_GAS_FILTER, PIPE_GAS_MIXER,PIPE_MTVALVE) + if(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_MTVALVE) return dir|flip|cw - if(PIPE_GAS_FILTER_M, PIPE_GAS_MIXER_M) + if(PIPE_GAS_FILTER_M, PIPE_GAS_MIXER_M, PIPE_MTVALVEM) return dir|flip|acw if(PIPE_GAS_MIXER_T) return dir|cw|acw @@ -925,6 +930,26 @@ Buildable meters V.node3.initialize() V.node3.build_network() + if(PIPE_MTVALVEM) //manual t-valve + var/obj/machinery/atmospherics/tvalve/mirrored/V = new(src.loc) + V.set_dir(dir) + V.initialize_directions = pipe_dir + if (pipename) + V.name = pipename + var/turf/T = V.loc + V.level = T.intact ? 2 : 1 + V.initialize() + V.build_network() + if (V.node1) + V.node1.initialize() + V.node1.build_network() + if (V.node2) + V.node2.initialize() + V.node2.build_network() + if (V.node3) + V.node3.initialize() + V.node3.build_network() + if(PIPE_CAP) var/obj/machinery/atmospherics/pipe/cap/C = new(src.loc) C.set_dir(dir) @@ -1133,7 +1158,6 @@ Buildable meters icon = 'icons/obj/pipe-item.dmi' icon_state = "meter" item_state = "buildpipe" - flags = TABLEPASS|FPRINT w_class = 4 /obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) @@ -1168,6 +1192,7 @@ Buildable meters #undef PIPE_VOLUME_PUMP #undef PIPE_OUTLET_INJECT #undef PIPE_MTVALVE +#undef PIPE_MTVALVEM #undef PIPE_GAS_FILTER_M #undef PIPE_GAS_MIXER_T #undef PIPE_GAS_MIXER_M diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 49f566af57..fb296d2409 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -20,6 +20,7 @@ Pipe Cap
    4-Way Manifold
    Manual T-Valve
    +Manual T-Valve - Mirrored
    Upward Pipe
    Downward Pipe
    Supply pipes:
    @@ -48,10 +49,10 @@ Scrubber
    Meter
    Gas Filter
    -Gas Filter-Mirrored
    +Gas Filter - Mirrored
    Gas Mixer
    -Gas Mixer-Mirrored
    -Gas Mixer-T
    +Gas Mixer - Mirrored
    +Gas Mixer - T
    Omni Gas Mixer
    Omni Gas Filter
    Heat exchange:
    diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 7cfb901350..c531e53f96 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -154,6 +154,12 @@ user << "There seems to be a firewall preventing you from accessing this device." return 0 + if (get_dist(src, user) > 1 && !issilicon(user)) + user << "You are too far away." + user.unset_machine() + user << browse(null, "window=turretid") + return 0 + if(locked && !issilicon(user)) user << "Access denied." return 0 @@ -175,7 +181,6 @@ Automatic Portable Turret Installation

    Status: []
    Behaviour controls are [locked ? "locked" : "unlocked"]"}, - "[on ? "On" : "Off"]" ) if(!locked || issilicon(user)) @@ -546,7 +551,7 @@ raising = 0 cover.icon_state = "turretCover" raised = 0 - invisibility = 2 + invisibility = INVISIBILITY_LEVEL_TWO update_icon() @@ -816,7 +821,7 @@ if(istype(I, /obj/item/weapon/pen)) //you can rename turrets like bots! var/t = input(user, "Enter new turret name", name, finish_name) as text - t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) + t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index bc65e08eb4..ab4967d04e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -11,8 +11,6 @@ var/set_temperature = T0C + 50 //K var/heating_power = 40000 - flags = FPRINT - /obj/machinery/space_heater/New() ..() diff --git a/code/game/machinery/status_display_ai.dm b/code/game/machinery/status_display_ai.dm index 4077c6d56d..0b7371c1b0 100644 --- a/code/game/machinery/status_display_ai.dm +++ b/code/game/machinery/status_display_ai.dm @@ -43,6 +43,7 @@ var/list/ai_status_emotions = list( if(istype(M, /obj/machinery/ai_status_display)) var/obj/machinery/ai_status_display/AISD = M AISD.emotion = emote + AISD.update() //if Friend Computer, change ALL displays else if(istype(M, /obj/machinery/status_display)) @@ -72,6 +73,9 @@ var/list/ai_status_emotions = list( var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions src.emotion = emote +/obj/machinery/ai_status_display/process() + return + /obj/machinery/ai_status_display/proc/update() if(mode==0) //Blank overlays.Cut() @@ -91,3 +95,11 @@ var/list/ai_status_emotions = list( if(overlays.len) overlays.Cut() overlays += image('icons/obj/status_display.dmi', icon_state=picture_state) + +/obj/machinery/ai_status_display/power_change() + ..() + if(stat & NOPOWER) + if(overlays.len) + overlays.Cut() + else + update() diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm index aacd770d79..97e747c0db 100644 --- a/code/game/machinery/supply_display.dm +++ b/code/game/machinery/supply_display.dm @@ -3,7 +3,7 @@ /obj/machinery/status_display/supply_display/update() if(!..() && mode == STATUS_DISPLAY_CUSTOM) - message1 = "SUPPLY" + message1 = "CARGO" message2 = "" var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 4d01598311..fe638408fc 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -64,36 +64,12 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(long_range_link == 0 && machine.long_range_link == 0) continue // If we're sending a copy, be sure to create the copy for EACH machine and paste the data - var/datum/signal/copy = new + var/datum/signal/copy if(copysig) - + copy = new copy.transmission_method = 2 copy.frequency = signal.frequency - // Copy the main data contents! Workaround for some nasty bug where the actual array memory is copied and not its contents. - copy.data = list( - - "mob" = signal.data["mob"], - "mobtype" = signal.data["mobtype"], - "realname" = signal.data["realname"], - "name" = signal.data["name"], - "job" = signal.data["job"], - "key" = signal.data["key"], - "vmessage" = signal.data["vmessage"], - "vname" = signal.data["vname"], - "vmask" = signal.data["vmask"], - "compression" = signal.data["compression"], - "message" = signal.data["message"], - "connection" = signal.data["connection"], - "radio" = signal.data["radio"], - "slow" = signal.data["slow"], - "traffic" = signal.data["traffic"], - "type" = signal.data["type"], - "server" = signal.data["server"], - "reject" = signal.data["reject"], - "level" = signal.data["level"], - "verb" = signal.data["verb"], - "language" = signal.data["language"] - ) + copy.data = signal.data.Copy() // Keep the "original" signal constant if(!signal.data["original"]) @@ -101,10 +77,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() else copy.data["original"] = signal.data["original"] - else - del(copy) - - send_count++ if(machine.is_freq_listening(signal)) machine.traffic++ @@ -232,13 +204,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() else if(on) produce_heat() delay = initial(delay) - - + + /obj/machinery/telecomms/proc/produce_heat() if (!produces_heat) return - + if (!use_power) return @@ -252,11 +224,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) - + var/heat_produced = idle_power_usage //obviously can't produce more heat than the machine draws from it's power source if (traffic <= 0) heat_produced *= 0.30 //if idle, produce less heat. - + removed.add_thermal_energy(heat_produced) env.merge(removed) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 04b8c5644a..f5db4a1ac0 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -9,6 +9,10 @@ var/one_time_use = 0 //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. +/* Ghosts can't use this */ +/obj/machinery/computer/teleporter/attack_ghost(user as mob) + return 1 + /obj/machinery/computer/teleporter/New() src.id = "[rand(1000, 9999)]" ..() @@ -80,9 +84,11 @@ /obj/machinery/teleport/station/attack_ai() src.attack_hand() -/obj/machinery/computer/teleporter/attack_hand() - if(stat & (NOPOWER|BROKEN)) - return +/obj/machinery/computer/teleporter/attack_hand(user as mob) + if(..()) return + + /* Ghosts can't use this one because it's a direct selection */ + if(istype(user, /mob/dead/observer)) return var/list/L = list() var/list/areaindex = list() @@ -91,7 +97,7 @@ var/turf/T = get_turf(R) if (!T) continue - if(T.z == 2 || T.z > 7) + if(!(T.z in config.player_levels)) continue var/tmpname = T.loc.name if(areaindex[tmpname]) @@ -118,7 +124,12 @@ areaindex[tmpname] = 1 L[tmpname] = I - var/desc = input("Please select a location to lock in.", "Locking Computer") in L + var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null + if(!desc) + return + if(get_dist(src, usr) > 1 && !issilicon(usr)) + return + src.locked = L[desc] for(var/mob/O in hearers(src, null)) O.show_message("\blue Locked In", 2) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index ce2a3b73ad..41a98103be 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -66,15 +66,20 @@ return /obj/machinery/turretid/proc/can_use(mob/user) + if(ailock && issilicon(user)) + user << "There seems to be a firewall preventing you from accessing this device." + return 0 + if (get_dist(src, user) > 0 && !issilicon(user)) user << "You are too far away." user.unset_machine() user << browse(null, "window=turretid") return 0 - if(ailock && issilicon(user)) - user << "There seems to be a firewall preventing you from accessing this device." + if(locked && !issilicon(user)) + user << "Access denied." return 0 + return 1 /obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) @@ -124,7 +129,9 @@ if (!istype(loc, /area)) return var/area/area = loc - var/dat = "" + var/dat = text({"Status: []
    + Behaviour controls are [locked ? "locked" : "unlocked"]"}, + "[enabled ? "On" : "Off"]" ) if(!locked || issilicon(user)) dat += text({"

    diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 999df5b8d5..e66796fa9c 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -189,48 +189,51 @@ if(get_dist(chassis, target)>2) return set_ready_state(0) if(do_after_cooldown(target)) - if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) + if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) var/obj/o = target var/amount = o.reagents.trans_to(src, 200) occupant_message("\blue [amount] units transferred into internal tank.") playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) - else - if(src.reagents.total_volume > 0) - playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3) - var/direction = get_dir(chassis,target) - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) + return - var/list/the_targets = list(T,T1,T2) - for(var/a=0, a= 1) src.resources[material] += amnt stack.use(1) count++ diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index b9a6ab4e78..c3257bb61b 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -9,7 +9,7 @@ icon = 'icons/mecha/mech_construct.dmi' icon_state = "blank" w_class = 5 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT origin_tech = "programming=2;materials=2" var/construction_time = 100 var/list/construction_cost = list("metal"=20000,"glass"=5000) @@ -20,7 +20,7 @@ icon_state = "backbone" var/datum/construction/construct construction_cost = list("metal"=20000) - flags = FPRINT | CONDUCT + flags = CONDUCT attackby(obj/item/W as obj, mob/user as mob) if(!construct || !construct.action(W, user)) diff --git a/code/game/mecha/working/hoverpod.dm b/code/game/mecha/working/hoverpod.dm index 5736e00b4f..1c15bb232d 100644 --- a/code/game/mecha/working/hoverpod.dm +++ b/code/game/mecha/working/hoverpod.dm @@ -5,7 +5,7 @@ initial_icon = "engineering_pod" internal_damage_threshold = 80 step_in = 4 - step_energy_drain = 15 + step_energy_drain = 10 max_temperature = 20000 health = 150 infra_luminosity = 6 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm new file mode 100644 index 0000000000..f0f5a53aea --- /dev/null +++ b/code/game/objects/buckling.dm @@ -0,0 +1,86 @@ +/obj + var/can_buckle = 0 + var/buckle_movable = 0 + var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1 + var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes + var/mob/living/buckled_mob = null + +/obj/attack_hand(mob/living/user) + . = ..() + if(can_buckle && buckled_mob) + user_unbuckle_mob(user) + +/obj/MouseDrop_T(mob/living/M, mob/living/user) + . = ..() + if(can_buckle && istype(M)) + user_buckle_mob(M, user) + +/obj/Del() + unbuckle_mob() + return ..() + +/obj/proc/buckle_mob(mob/living/M) + if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained())) + return 0 + + M.buckled = src + M.set_dir(dir) + M.update_canmove() + buckled_mob = M + post_buckle_mob(M) + return 1 + +/obj/proc/unbuckle_mob() + if(buckled_mob && buckled_mob.buckled == src) + . = buckled_mob + buckled_mob.buckled = null + buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.update_canmove() + buckled_mob = null + + post_buckle_mob(.) + +/obj/proc/post_buckle_mob(mob/living/M) + return + +/obj/proc/user_buckle_mob(mob/living/M, mob/user) + if(!ticker) + user << "You can't buckle anyone in before the game starts." + if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat || istype(user, /mob/living/silicon/pai)) + return + + if(istype(M, /mob/living/carbon/slime)) + user << "The [M] is too squishy to buckle in." + return + + add_fingerprint(user) + unbuckle_mob() + + if(buckle_mob(M)) + if(M == user) + M.visible_message(\ + "[M.name] buckles themselves to [src].",\ + "You buckle yourself to [src].",\ + "You hear metal clanking.") + else + M.visible_message(\ + "[M.name] is buckled to [src] by [user.name]!",\ + "You are buckled to [src] by [user.name]!",\ + "You hear metal clanking.") + +/obj/proc/user_unbuckle_mob(mob/user) + var/mob/living/M = unbuckle_mob() + world << 3 + if(M) + if(M != user) + M.visible_message(\ + "[M.name] was unbuckled by [user.name]!",\ + "You were unbuckled from [src] by [user.name].",\ + "You hear metal clanking.") + else + M.visible_message(\ + "[M.name] unbuckled themselves!",\ + "You unbuckle yourself from [src].",\ + "You hear metal clanking.") + add_fingerprint(user) + return M diff --git a/code/game/objects/closets/ert.dm b/code/game/objects/closets/ert.dm deleted file mode 100644 index fa49001c45..0000000000 --- a/code/game/objects/closets/ert.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/structure/closet/secure_closet/ert/commander - name = "\improper ERT commander locker" - req_access = list(ACCESS_SECURITY) - icon_state = "capsecure1" - icon_closed = "capsecure" - icon_locked = "capsecure1" - icon_opened = "capsecureopen" - icon_broken = "capsecurebroken" - icon_off = "capsecureoff" - - New() - ..() - new /obj/item/clothing/head/helmet/space/ert/commander(src) - new /obj/item/clothing/suit/space/ert/commander(src) - new /obj/item/weapon/plastique(src) - new /obj/item/weapon/storage/belt/security/full(src) - new /obj/item/weapon/gun/energy/ionrifle(src) - new /obj/item/weapon/gun/energy/gun/nuclear(src) - new /obj/item/clothing/glasses/thermal(src) - new /obj/item/weapon/flame/lighter/zippo(src) - new /obj/item/weapon/pinpointer(src) - return - -/obj/structure/closet/secure_closet/ert/security - name = "\improper ERT security locker" - req_access = list(ACCESS_SECURITY) - icon_state = "sec1" - icon_closed = "sec" - icon_locked = "sec1" - icon_opened = "secopen" - icon_broken = "secbroken" - icon_off = "secoff" - - New() - ..() - new /obj/item/clothing/head/helmet/space/ert/security(src) - new /obj/item/clothing/suit/space/ert/security(src) - new /obj/item/weapon/plastique(src) - new /obj/item/weapon/storage/belt/security/full(src) - new /obj/item/weapon/gun/energy/ionrifle(src) - new /obj/item/weapon/gun/energy/gun/nuclear(src) - new /obj/item/clothing/glasses/thermal(src) - return - - -/obj/structure/closet/secure_closet/ert/engineer - name = "\improper ERT engineer locker" - req_access = list(ACCESS_ENGINE) - icon_state = "secureeng1" - icon_closed = "secureeng" - icon_locked = "secureeng1" - icon_opened = "secureengopen" - icon_broken = "secureengbroken" - icon_off = "secureengoff" - - New() - ..() - new /obj/item/clothing/head/helmet/space/ert/engineer(src) - new /obj/item/clothing/suit/space/ert/engineer(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/weapon/storage/belt/utility/full(src) - new /obj/item/weapon/storage/backpack/industrial/full(src) - new /obj/item/device/t_scanner(src) - new /obj/item/clothing/glasses/meson(src) - return - -/obj/structure/closet/secure_closet/ert/medical - name = "\improper ERT medical locker" - req_access = list(ACCESS_MEDICAL) - icon_state = "securemed1" - icon_closed = "securemed" - icon_locked = "securemed1" - icon_opened = "securemedopen" - icon_broken = "securemedbroken" - icon_off = "securemedoff" - - New() - ..() - new /obj/item/clothing/head/helmet/space/ert/medical(src) - new /obj/item/clothing/suit/space/ert/medical(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/weapon/storage/backpack/medic/full(src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/clothing/glasses/hud/health(src) - return \ No newline at end of file diff --git a/code/game/objects/closets/secure/civilian.dm b/code/game/objects/closets/secure/civilian.dm deleted file mode 100644 index 5dbcd966a5..0000000000 --- a/code/game/objects/closets/secure/civilian.dm +++ /dev/null @@ -1,122 +0,0 @@ - -/obj/structure/closet/secure_closet/chef_personal - name = "Chef's Locker" - req_access = list(ACCESS_KITCHEN) - - New() - ..() - new /obj/item/wardrobe/chef(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/radio/headset(src) - -/obj/structure/closet/secure_closet/bar - name = "Booze" - req_access = list(ACCESS_BAR) - - - 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/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - return - -/obj/structure/closet/secure_closet/barman_personal - name = "Barman's Locker" - req_access = list(ACCESS_BAR) - - New() - ..() - new /obj/item/wardrobe/bartender(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/radio/headset(src) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - new /obj/item/ammo_casing/shotgun/beanbag(BPK) - -/obj/structure/closet/secure_closet/hydro_personal - name = "Botanist's Locker" - req_access = list(ACCESS_HYDROPONICS) - - New() - ..() - new /obj/item/wardrobe/hydro - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/analyzer/plant_analyzer(src) - new /obj/item/device/radio/headset(src) - -/obj/structure/closet/secure_closet/janitor_personal - name = "Janitor's Locker" - req_access = list(ACCESS_JANITOR) - - New() - ..() - new /obj/item/wardrobe/janitor(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/pda/janitor(src) - -/obj/structure/closet/secure_closet/lawyer_personal - name = "Lawyer's Locker" - req_access = list(ACCESS_LAWYER) - - New() - ..() - new /obj/item/wardrobe/lawyer(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/pda/lawyer(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/weapon/storage/briefcase(src) - -/obj/structure/closet/secure_closet/librarian_personal - name = "Librarian's Locker" - req_access = list(ACCESS_LIBRARY) - - New() - ..() - new /obj/item/wardrobe/librarian(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/weapon/barcodescanner(src) - -/obj/structure/closet/secure_closet/counselor_personal - name = "Counselor's Locker" - req_access = list(ACCESS_CHAPEL_OFFICE) - - New() - ..() - new /obj/item/wardrobe/chaplain(src) - // - new /obj/item/weapon/storage/backpack/cultpack (src) - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/weapon/storage/bible(src) - new /obj/item/device/pda/chaplain(src) - new /obj/item/device/radio/headset(src) - new /obj/item/weapon/candlepack(src) - new /obj/item/weapon/candlepack(src) diff --git a/code/game/objects/closets/secure/research.dm b/code/game/objects/closets/secure/research.dm deleted file mode 100755 index 3bbd5899f4..0000000000 --- a/code/game/objects/closets/secure/research.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/structure/closet/secure_closet/scientist - name = "Scientist's Locker" - req_access = list(ACCESS_RESEARCH) - icon_state = "secureres1" - icon_closed = "secureres" - icon_locked = "secureres1" - icon_opened = "secureresopen" - icon_broken = "secureresbroken" - icon_off = "secureresoff" - - New() - ..() - new /obj/item/wardrobe/scientist(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/pda/science(src) - new /obj/item/weapon/tank/oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/radio/headset/headset_sci(src) - - - -/obj/structure/closet/secure_closet/rd - name = "Research Director's Locker" - req_access = list(ACCESS_RD) - icon_state = "rdsecure1" - icon_closed = "rdsecure" - icon_locked = "rdsecure1" - icon_opened = "rdsecureopen" - icon_broken = "rdsecurebroken" - icon_off = "rdsecureoff" - - New() - ..() - new /obj/item/wardrobe/rd(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/weapon/clipboard(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/flash(src) - new /obj/item/device/radio/headset/heads/rd(src) - // \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 2314509098..ed996e3f1e 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -57,15 +57,21 @@ var/global/list/image/splatter_cache=list() if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) hasfeet = 0 if(perp.shoes && !perp.buckled)//Adding blood to shoes - perp.shoes.blood_color = basecolor - perp.shoes:track_blood = max(amount,perp.shoes:track_blood) - if(!perp.shoes.blood_overlay) - perp.shoes.generate_blood_overlay() - if(!perp.shoes.blood_DNA) - perp.shoes.blood_DNA = list() - perp.shoes.blood_overlay.color = basecolor - perp.shoes.overlays += perp.shoes.blood_overlay - perp.shoes.blood_DNA |= blood_DNA.Copy() + var/obj/item/clothing/shoes/S = perp.shoes + if(istype(S)) + S.blood_color = basecolor + S.track_blood = max(amount,S.track_blood) + if(!S.blood_overlay) + S.generate_blood_overlay() + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_overlay.color = basecolor + S.overlays += S.blood_overlay + if(S.blood_overlay && S.blood_overlay.color != basecolor) + S.blood_overlay.color = basecolor + S.overlays.Cut() + S.overlays += S.blood_overlay + S.blood_DNA |= blood_DNA.Copy() else if (hasfeet)//Or feet perp.feet_blood_color = basecolor @@ -108,13 +114,19 @@ var/global/list/image/splatter_cache=list() amount = 2 /obj/effect/decal/cleanable/blood/drip - name = "drips of blood" - desc = "It's red." - gender = PLURAL - icon = 'icons/effects/drip.dmi' - icon_state = "1" - random_icon_states = list("1","2","3","4","5") - amount = 0 + name = "drips of blood" + desc = "It's red." + gender = PLURAL + icon = 'icons/effects/drip.dmi' + icon_state = "1" + random_icon_states = list("1","2","3","4","5") + amount = 0 + var/list/drips = list() + +/obj/effect/decal/cleanable/blood/drip/New() + ..() + spawn(1) + drips |= icon_state /obj/effect/decal/cleanable/blood/writing icon_state = "tracks" diff --git a/code/WorkInProgress/explosion_particles.dm b/code/game/objects/effects/explosion_particles.dm similarity index 100% rename from code/WorkInProgress/explosion_particles.dm rename to code/game/objects/effects/explosion_particles.dm diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index c48d062e9e..32f05901b4 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -70,8 +70,12 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit lighting_controller.processing = 0 + + + var/approximate_intensity = (devastation_range * 3) + (heavy_impact_range * 2) + light_impact_range var/powernet_rebuild_was_deferred_already = defer_powernet_rebuild - if(defer_powernet_rebuild != 2) + // Large enough explosion. For performance reasons, powernets will be rebuilt manually + if(!defer_powernet_rebuild && (approximate_intensity > 25)) defer_powernet_rebuild = 1 if(heavy_impact_range > 1) @@ -110,9 +114,9 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa sleep(8) if(!lighting_controller.processing) lighting_controller.processing = lighting_controller_was_processing - if(!powernet_rebuild_was_deferred_already) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 + if(!powernet_rebuild_was_deferred_already && defer_powernet_rebuild) + makepowernets() + defer_powernet_rebuild = 0 return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 089b47aadd..13081d6abb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -10,7 +10,6 @@ var/burning = null var/hitsound = null var/w_class = 3.0 - flags = FPRINT | TABLEPASS var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE pressure_resistance = 5 @@ -35,7 +34,7 @@ var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N - var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/zoomdevicename = null //name used for message when binoculars/scope is used @@ -115,10 +114,7 @@ size = "bulky" if(5.0) size = "huge" - else - //if ((CLUMSY in usr.mutations) && prob(50)) t = "funny-looking" - var/custom_suffix = "It is a [size] item." - return ..(user, distance, suffix = custom_suffix) + return ..(user, distance, "", "It is a [size] item.") /obj/item/attack_hand(mob/user as mob) if (!user) return diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 418209d744..a11b326e45 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -5,7 +5,7 @@ desc = "Used for repairing or building APCs" icon = 'icons/obj/apc_repair.dmi' icon_state = "apc_frame" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() diff --git a/code/WorkInProgress/Chinsky/ashtray.dm b/code/game/objects/items/ashtray.dm similarity index 100% rename from code/WorkInProgress/Chinsky/ashtray.dm rename to code/game/objects/items/ashtray.dm diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index b1b46654bc..5183170aa6 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -39,7 +39,7 @@ close_sound = 'sound/items/zip.ogg' var/item_path = /obj/item/bodybag density = 0 - storage_capacity = (mob_size * 2) - 1 + storage_capacity = (default_mob_size * 2) - 1 var/contains_body = 0 /obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob) @@ -49,7 +49,7 @@ return if (!in_range(src, user) && src.loc != user) return - t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + t = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if (t) src.name = "body bag - " src.name += t diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index b68e1e61cd..8e1a382a86 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -91,7 +91,8 @@ /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) if(M == user) user << "You take a bite of the crayon and swallow it." -// user.nutrition += 5 + user.nutrition += 1 + user.reagents.add_reagent("crayon_dust",min(5,uses)/3) if(uses) uses -= 5 if(uses <= 0) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9280ccba90..f4f3b843b0 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -10,7 +10,6 @@ var/global/list/obj/item/device/pda/PDAs = list() icon_state = "pda" item_state = "electronic" w_class = 2.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_ID | SLOT_BELT //Main variables @@ -464,7 +463,7 @@ var/global/list/obj/item/device/pda/PDAs = list() data["convo_job"] = sanitize(c["job"]) break if(mode==41) - data["manifest"] = data_core.get_manifest_json() + data_core.get_manifest_json() if(mode==3) @@ -535,12 +534,19 @@ var/global/list/obj/item/device/pda/PDAs = list() nanoUI = data // update the ui if it exists, returns null if no ui is passed/found + if(ui) + ui.load_cached_data(ManifestJSON) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) // the ui does not exist, so we'll create a new() one - // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400) // when the ui is first opened this is the data it will use + + ui.load_cached_data(ManifestJSON) + ui.set_initial_data(data) // open the new ui window ui.open() @@ -720,7 +726,7 @@ var/global/list/obj/item/device/pda/PDAs = list() U << "The PDA softly beeps." ui.close() else - t = copytext(sanitize(t), 1, 20) + t = sanitize(copytext(t, 1, 20)) ttone = t else ui.close() @@ -729,7 +735,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/t = input(U, "Please enter new news tone", name, newstone) as text if (in_range(src, U) && loc == U) if (t) - t = copytext(sanitize(t), 1, 20) + t = sanitize(copytext(t, 1, 20)) newstone = t else ui.close() @@ -965,7 +971,8 @@ var/global/list/obj/item/device/pda/PDAs = list() U.visible_message("[U] taps on \his PDA's screen.") U.last_target_click = world.time var/t = input(U, "Please enter message", P.name, null) as text - t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) + t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) + t = readd_quotes(t) if (!t || !istype(P)) return if (!in_range(src, U) && loc != U) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index f8bcb9e86b..8c86a37ac0 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -562,10 +562,10 @@ if("alert") post_status("alert", href_list["alert"]) if("setmsg1") - message1 = reject_bad_text(trim(copytext(sanitize(input("Line 1", "Enter Message Text", message1) as text|null), 1, 40)), 40) + message1 = reject_bad_text(trim(sanitize(copytext(input("Line 1", "Enter Message Text", message1) as text|null, 1, 40))), 40) updateSelfDialog() if("setmsg2") - message2 = reject_bad_text(trim(copytext(sanitize(input("Line 2", "Enter Message Text", message2) as text|null), 1, 40)), 40) + message2 = reject_bad_text(trim(sanitize(copytext(input("Line 2", "Enter Message Text", message2) as text|null, 1, 40))), 40) updateSelfDialog() else post_status(href_list["statdisp"]) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index fc4f555ed4..75122c7ce0 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -4,7 +4,6 @@ icon_state = "aicard" // aicard-full item_state = "electronic" w_class = 2.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT var/flush = null origin_tech = "programming=4;materials=4" diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index 0cafa7679c..b6e0ca1aca 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -4,7 +4,7 @@ desc = "A pair of binoculars." icon_state = "binoculars" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 w_class = 2.0 throwforce = 5.0 diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 978cfdb304..1982fbb4f4 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -1,7 +1,7 @@ /obj/item/device/chameleon name = "chameleon projector" icon_state = "shield0" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT item_state = "electronic" throwforce = 5.0 diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm index 3168e00feb..faab1ee054 100644 --- a/code/game/objects/items/devices/debugger.dm +++ b/code/game/objects/items/devices/debugger.dm @@ -9,7 +9,7 @@ desc = "Used to debug electronic equipment." icon = 'icons/obj/hacktool.dmi' icon_state = "hacktool-g" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 w_class = 2.0 throwforce = 5.0 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 152aa2fa34..6e924ba719 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -7,7 +7,7 @@ w_class = 2.0 throw_speed = 4 throw_range = 10 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT origin_tech = "magnets=2;combat=1" var/times_used = 0 //Number of times it's been used. diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 35ff3b720a..0f6d0abb10 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -5,7 +5,7 @@ icon_state = "flashlight" item_state = "flashlight" w_class = 2 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT matter = list("metal" = 50,"glass" = 20) @@ -106,7 +106,7 @@ desc = "A pen-sized light, used by medical staff." icon_state = "penlight" item_state = "" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT brightness_on = 2 w_class = 1 @@ -115,7 +115,7 @@ desc = "A miniature lamp, that might be used by small robots." icon_state = "penlight" item_state = "" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT brightness_on = 2 w_class = 1 @@ -128,7 +128,7 @@ item_state = "lamp" brightness_on = 5 w_class = 4 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT on = 1 diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c6238f2648..7e69ffe17a 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -47,7 +47,7 @@ icon_state = "lightreplacer0" item_state = "electronic" - flags = FPRINT | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT origin_tech = "magnets=3;materials=2" diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index db79c6390b..5bf49de055 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -4,7 +4,7 @@ icon_state = "megaphone" item_state = "radio" w_class = 2.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT var/spamcheck = 0 var/emagged = 0 @@ -25,7 +25,7 @@ user << "\red \The [src] needs to recharge!" return - var/message = copytext(sanitize(input(user, "Shout a message?", "Megaphone", null) as text),1,MAX_MESSAGE_LEN) + var/message = sanitize(copytext(input(user, "Shout a message?", "Megaphone", null) as text,1,MAX_MESSAGE_LEN)) if(!message) return message = capitalize(message) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 6378f8823f..1765c32ade 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -8,7 +8,7 @@ name = "multitool" desc = "Used for pulsing wires to test which to cut. Not recommended by doctors." icon_state = "multitool" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 w_class = 2.0 throwforce = 5.0 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index f2df13a2db..a938d6b977 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -4,7 +4,6 @@ icon_state = "pai" item_state = "electronic" w_class = 2.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT origin_tech = "programming=2" var/obj/item/device/radio/radio @@ -261,7 +260,7 @@ if(2) radio.ToggleReception() if(href_list["setlaws"]) - var/newlaws = copytext(sanitize(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws) as message),1,MAX_MESSAGE_LEN) + var/newlaws = sanitize(copytext(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws) as message,1,MAX_MESSAGE_LEN)) if(newlaws) pai.pai_laws = newlaws pai << "Your supplemental directives have been updated. Your new directives are:" diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index cf92db9a39..8b2469d2dd 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -6,7 +6,7 @@ icon_state = "powersink0" item_state = "electronic" w_class = 4.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT throwforce = 5 throw_speed = 1 throw_range = 2 diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 00666b2e2a..e7f9ec3b9f 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -4,7 +4,7 @@ icon_state = "electropack0" item_state = "electropack" frequency = 1449 - flags = FPRINT | CONDUCT | TABLEPASS + flags = CONDUCT slot_flags = SLOT_BACK w_class = 5.0 diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index b28fe2cac1..567dc49bf4 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -5,7 +5,7 @@ anchored = 1 w_class = 4.0 canhear_range = 2 - flags = FPRINT | CONDUCT | TABLEPASS | NOBLOODY + flags = CONDUCT | NOBLOODY var/number = 0 var/anyai = 1 var/mob/living/silicon/ai/ai = list() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index bb6f0d91f5..24c44694f5 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -20,7 +20,7 @@ var/syndie = 0//Holder to see if it's a syndicate encrpyed radio var/maxf = 1499 // "Example" = FREQ_LISTENING|FREQ_BROADCASTING - flags = FPRINT | CONDUCT | TABLEPASS + flags = CONDUCT slot_flags = SLOT_BELT throw_speed = 2 throw_range = 9 @@ -194,7 +194,7 @@ return radio_connection // Otherwise, if a channel is specified, look for it. - if(channels) + if(channels && channels.len > 0) if (message_mode == "department") // Department radio shortcut message_mode = channels[1] @@ -506,6 +506,7 @@ icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component. icon_state = "radio" canhear_range = 3 + subspace_transmission = 1 /obj/item/device/radio/borg/talk_into() . = ..() @@ -594,11 +595,11 @@ if (href_list["mode"]) if(subspace_transmission != 1) subspace_transmission = 1 - usr << "Subspace Transmission is disabled" + usr << "Subspace Transmission is enabled" else subspace_transmission = 0 - usr << "Subspace Transmission is enabled" - if(subspace_transmission == 1)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled + usr << "Subspace Transmission is disabled" + if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled channels = list() else recalculateChannels() @@ -625,10 +626,10 @@ + +
    Toggle Broadcast Mode
    - Toggle Loudspeaker
    + Loudspeaker: [shut_up ? "Disengaged" : "Engaged"]
    "} - if(!subspace_transmission)//Don't even bother if subspace isn't turned on + if(subspace_transmission)//Don't even bother if subspace isn't turned on for (var/ch_name in channels) dat+=text_sec_channel(ch_name, channels[ch_name]) dat+={"[text_wires()]
    "} diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5afc8ebc10..922d5418cb 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -13,7 +13,6 @@ REAGENT SCANNER desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." icon_state = "t-ray0" var/on = 0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT w_class = 2 item_state = "electronic" @@ -69,7 +68,7 @@ REAGENT SCANNER desc = "A hand-held body scanner able to distinguish vital signs of the subject." icon_state = "health" item_state = "analyzer" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 w_class = 2.0 @@ -232,7 +231,7 @@ REAGENT SCANNER icon_state = "atmos" item_state = "analyzer" w_class = 2.0 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 @@ -279,7 +278,7 @@ REAGENT SCANNER icon_state = "spectrometer" item_state = "analyzer" w_class = 2.0 - flags = FPRINT | TABLEPASS| CONDUCT | OPENCONTAINER + flags = CONDUCT | OPENCONTAINER slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 @@ -353,7 +352,7 @@ REAGENT SCANNER icon_state = "spectrometer" item_state = "analyzer" w_class = 2.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index f32b5256b5..291053f25d 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -7,7 +7,7 @@ slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage //copied from tank.dm - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 5.0 throwforce = 10.0 throw_speed = 1 diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index f5e43436b9..dc74f0272c 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -15,7 +15,7 @@ var/list/storedinfo = new/list() var/list/timestamp = new/list() var/canprint = 1 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT throwforce = 2 throw_speed = 4 throw_range = 20 diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 52e5e220f2..3c2aebd871 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -22,7 +22,7 @@ effective or pretty fucking useless. w_class = 1.0 throw_speed = 4 throw_range = 10 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT item_state = "electronic" origin_tech = "magnets=3;combat=3;syndicate=3" diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index befba4b133..49df9aa31c 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -4,7 +4,7 @@ icon_state = "voice0" item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang) w_class = 1.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT var/spamcheck = 0 var/emagged = 0 diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 87a6fdc04c..25461eae37 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/robot_parts.dmi' item_state = "buildpipe" icon_state = "blank" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT var/construction_time = 100 var/list/construction_cost = list("metal"=20000,"glass"=5000) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index d2825c82f7..45350a71e9 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -3,7 +3,7 @@ desc = "Some rods. Can be used for building, or something." singular_name = "metal rod" icon_state = "rods" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT w_class = 3.0 force = 9.0 throwforce = 15.0 diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index c5df032d64..de96eda5f4 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -8,7 +8,7 @@ throwforce = 5.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 /obj/item/stack/light_w/attackby(var/obj/item/O as obj, var/mob/user as mob) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index a5336c0797..6c440dcb3d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -29,7 +29,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ null, \ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \ new/datum/stack_recipe("rack parts", /obj/item/weapon/table_parts/rack), \ - new/datum/stack_recipe("metal baseball bat", /obj/item/weapon/baseballbat/metal, 10, time = 20, one_per_turf = 0, on_floor = 1), \ + new/datum/stack_recipe("metal baseball bat", /obj/item/weapon/twohanded/baseballbat/metal, 10, time = 20, one_per_turf = 0, on_floor = 1), \ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \ @@ -82,7 +82,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ icon_state = "sheet-metal" matter = list("metal" = 3750) throwforce = 14.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT origin_tech = "materials=1" /obj/item/stack/sheet/metal/cyborg @@ -91,7 +91,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ singular_name = "metal sheet" icon_state = "sheet-metal" throwforce = 14.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT stacktype = /obj/item/stack/sheet/metal /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) @@ -118,7 +118,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ item_state = "sheet-metal" matter = list("metal" = 7500) throwforce = 15.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT origin_tech = "materials=2" /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) @@ -137,7 +137,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("baseball bat", /obj/item/weapon/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1) \ + new/datum/stack_recipe("baseball bat", /obj/item/weapon/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1) \ // new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0) ) @@ -197,7 +197,6 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ desc = "Large sheets of card, like boxes folded flat." singular_name = "cardboard sheet" icon_state = "sheet-card" - flags = FPRINT | TABLEPASS origin_tech = "materials=1" /obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null) diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index b140b4e6fd..ed0a9d2a31 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -1,6 +1,5 @@ /obj/item/stack/sheet name = "sheet" - flags = FPRINT | TABLEPASS w_class = 3.0 force = 5 throwforce = 5 diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2ab4f72bd2..69b6e97533 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -99,14 +99,14 @@ /obj/item/stack/proc/produce_recipe(datum/stack_recipe/recipe, var/quantity, mob/user) var/required = quantity*recipe.req_amount var/produced = min(quantity*recipe.res_amount, recipe.max_res_amount) - + if (!can_use(required)) if (produced>1) user << "\red You haven't got enough [src] to build \the [produced] [recipe.title]\s!" else user << "\red You haven't got enough [src] to build \the [recipe.title]!" return - + if (recipe.one_per_turf && (locate(recipe.result_type) in user.loc)) user << "\red There is another [recipe.title] here!" return @@ -114,21 +114,21 @@ if (recipe.on_floor && !isfloor(user.loc)) user << "\red \The [recipe.title] must be constructed on the floor!" return - + if (recipe.time) user << "\blue Building [recipe.title] ..." if (!do_after(user, recipe.time)) return - + if (use(required)) var/atom/O = new recipe.result_type(user.loc) O.set_dir(user.dir) O.add_fingerprint(user) - + if (istype(O, /obj/item/stack)) var/obj/item/stack/S = O S.amount = produced - + if (istype(O, /obj/item/weapon/storage)) //BubbleWrap - so newly formed boxes are empty for (var/obj/item/I in O) del(I) @@ -148,12 +148,12 @@ if (href_list["sublist"]) var/datum/stack_recipe_list/srl = recipes_list[text2num(href_list["sublist"])] recipes_list = srl.recipes - + var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] var/multiplier = text2num(href_list["multiplier"]) if (!multiplier || (multiplier <= 0)) //href exploit protection return - + src.produce_recipe(R, multiplier, usr) if (src && usr.machine==src) //do not reopen closed window @@ -189,7 +189,7 @@ return 1 /* - The transfer and split procs work differently than use() and add(). + The transfer and split procs work differently than use() and add(). Whereas those procs take no action if the desired amount cannot be added or removed these procs will try to transfer whatever they can. They also remove an equal amount from the source stack. */ @@ -209,7 +209,10 @@ if (transfer && src.use(transfer)) S.add(transfer) if (prob(transfer/orig_amount * 100)) - S.copy_evidences(src) + transfer_fingerprints_to(S) + if(blood_DNA) + S.blood_DNA |= blood_DNA + //todo bloody overlay return transfer return 0 @@ -217,14 +220,16 @@ /obj/item/stack/proc/split(var/tamount) if (!amount) return null - + var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0) - + var/orig_amount = src.amount if (transfer && src.use(transfer)) var/obj/item/stack/newstack = new src.type(loc, transfer) if (prob(transfer/orig_amount * 100)) - newstack.copy_evidences(src) + transfer_fingerprints_to(newstack) + if(blood_DNA) + newstack.blood_DNA |= blood_DNA return newstack return null @@ -272,13 +277,6 @@ src.interact(usr) else return ..() -/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj) - src.blood_DNA |= from.blood_DNA - src.fingerprints |= from.fingerprints - src.fingerprintshidden |= from.fingerprintshidden - src.fingerprintslast = from.fingerprintslast - //TODO bloody overlay - /* * Recipe datum */ diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index f346d216a7..3a14ff1e56 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -8,7 +8,7 @@ throwforce = 5.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") var/on = 1 diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index e238a80323..7816c45f53 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -9,7 +9,7 @@ throwforce = 15.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 /obj/item/stack/tile/plasteel/New(var/loc, var/amount=null) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index e0963d08cc..7ad6abdd60 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -18,7 +18,7 @@ throwforce = 1.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 origin_tech = "biotech=1" @@ -35,7 +35,7 @@ throwforce = 1.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 /* @@ -51,5 +51,5 @@ throwforce = 1.0 throw_speed = 5 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT max_amount = 60 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 837824bf39..cee5076a55 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -127,7 +127,7 @@ icon = 'icons/obj/gun.dmi' icon_state = "revolver" item_state = "gun" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT w_class = 3.0 @@ -183,7 +183,7 @@ desc = "There are 7 caps left! Make sure to recyle the box in an autolathe when it gets empty." icon = 'icons/obj/ammo.dmi' icon_state = "357-7" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT w_class = 1.0 matter = list("metal" = 10,"glass" = 10) @@ -205,7 +205,6 @@ icon = 'icons/obj/gun.dmi' icon_state = "crossbow" item_state = "crossbow" - flags = FPRINT | TABLEPASS w_class = 2.0 attack_verb = list("attacked", "struck", "hit") var/bullets = 5 @@ -299,7 +298,6 @@ desc = "It's nerf or nothing! Ages 8 and up." icon = 'icons/obj/toy.dmi' icon_state = "foamdart" - flags = FPRINT | TABLEPASS w_class = 1.0 /obj/effect/foam_dart_dummy @@ -322,7 +320,7 @@ item_state = "sword0" var/active = 0.0 w_class = 2.0 - flags = FPRINT | TABLEPASS | NOSHIELD + flags = NOSHIELD attack_verb = list("attacked", "struck", "hit") attack_self(mob/user as mob) @@ -354,7 +352,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "katana" item_state = "katana" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT | SLOT_BACK force = 5 throwforce = 5 @@ -570,7 +568,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "katana" item_state = "katana" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT | SLOT_BACK force = 5 throwforce = 5 @@ -643,6 +641,5 @@ desc = "No bother to sink or swim when you can just float!" icon_state = "inflatable" item_state = "inflatable" - flags = FPRINT | TABLEPASS icon = 'icons/obj/clothing/belts.dmi' slot_flags = SLOT_BELT diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index c8fec27bb8..5f22d21924 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -12,7 +12,7 @@ AI MODULES icon_state = "std_mod" item_state = "electronic" desc = "An AI Module for transmitting encrypted instructions to the AI." - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 w_class = 2.0 throwforce = 5.0 @@ -261,7 +261,7 @@ AI MODULES if(new_lawpos < 15) return lawpos = min(new_lawpos, 50) var/newlaw = "" - var/targName = copytext(sanitize(input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)),1,MAX_MESSAGE_LEN) + var/targName = sanitize(copytext(input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw),1,MAX_MESSAGE_LEN)) newFreeFormLaw = targName desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index ff7d010b14..37dcbf9f4e 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -7,7 +7,7 @@ opacity = 0 density = 0 anchored = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 10.0 throwforce = 10.0 throw_speed = 1 @@ -26,6 +26,9 @@ /obj/item/weapon/rcd/attack() return 0 +/obj/item/weapon/rcd/proc/can_use(var/mob/user,var/turf/T) + return (user.Adjacent(T) && user.get_active_hand() == src && !user.stat && !user.restrained()) + /obj/item/weapon/rcd/examine() ..() if(src.type == /obj/item/weapon/rcd && loc == usr) @@ -127,7 +130,7 @@ return 0 working = 0 - if(build_delay && (!user.Adjacent(T) || user.get_active_hand() != src || user.stat || user.restrained())) + if(build_delay && !can_use(user,T)) return 0 if(build_turf) @@ -168,6 +171,10 @@ /obj/item/weapon/rcd/borg/attackby() return +/obj/item/weapon/rcd/borg/can_use(var/mob/user,var/turf/T) + return (user.Adjacent(T) && !user.stat) + + /obj/item/weapon/rcd/mounted/useResource(var/amount, var/mob/user) var/cost = amount*30 if(istype(loc,/obj/item/rig_module)) @@ -180,3 +187,6 @@ /obj/item/weapon/rcd/mounted/attackby() return + +/obj/item/weapon/rcd/mounted/can_use(var/mob/user,var/turf/T) + return (user.Adjacent(T) && !user.stat && !user.restrained()) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index f9f32bbeb1..c92b0bbf35 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -14,7 +14,6 @@ RSF anchored = 0.0 var/stored_matter = 30 var/mode = 1 - flags = TABLEPASS w_class = 3.0 /obj/item/weapon/rsf/examine(mob/user) diff --git a/code/WorkInProgress/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm similarity index 99% rename from code/WorkInProgress/autopsy.dm rename to code/game/objects/items/weapons/autopsy.dm index 95cfa23494..d78c7d4093 100644 --- a/code/WorkInProgress/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -7,7 +7,7 @@ desc = "Extracts information on wounds." icon = 'icons/obj/autopsy_scanner.dmi' icon_state = "" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT w_class = 2.0 origin_tech = "materials=1;biotech=1" var/list/datum/autopsy_data_scanner/wdata = list() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 0203bf0846..8d63998722 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -90,7 +90,6 @@ /obj/machinery/suspension_gen, /obj/machinery/shield_capacitor, /obj/machinery/shield_gen, - /obj/machinery/zero_point_emitter, /obj/machinery/clonepod, /obj/machinery/deployable, /obj/machinery/door_control, @@ -231,7 +230,7 @@ return src.registered_name = t - var u = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Agent")),1,MAX_MESSAGE_LEN) + var u = sanitize(copytext(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Agent"),1,MAX_MESSAGE_LEN)) if(!u) alert("Invalid assignment.") src.registered_name = "" @@ -246,13 +245,13 @@ switch(alert("Would you like to display the ID, or retitle it?","Choose.","Rename","Show")) if("Rename") - var t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)),1,26) + var t = sanitize(copytext(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name),1,26)) if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall") //Same as mob/new_player/prefrences.dm alert("Invalid name.") return src.registered_name = t - var u = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")),1,MAX_MESSAGE_LEN) + var u = sanitize(copytext(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant"),1,MAX_MESSAGE_LEN)) if(!u) alert("Invalid assignment.") return diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 4d09a26bcf..337c111799 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -31,6 +31,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM attack_verb = list("burnt", "singed") /obj/item/weapon/flame/match/process() + if(isliving(loc)) + var/mob/living/M = loc + M.IgniteMob() var/turf/location = get_turf(src) smoketime-- if(smoketime < 1) @@ -162,6 +165,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/process() + if(isliving(loc)) + var/mob/living/M = loc + M.IgniteMob() var/turf/location = get_turf(src) smoketime-- if(smoketime < 1) @@ -385,7 +391,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/icon_off = "lighter-g" w_class = 1 throwforce = 4 - flags = TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT attack_verb = list("burnt", "singed") @@ -444,6 +450,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/flame/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M, /mob)) return + M.IgniteMob() if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit) var/obj/item/clothing/mask/cigarette/cig = M.wear_mask diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index bc44b3d7df..00cc7a6835 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -13,7 +13,7 @@ density = 0 anchored = 0 w_class = 2.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 5.0 throwforce = 5.0 throw_speed = 3 diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 5e6d4d9538..6241bd5051 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -4,7 +4,6 @@ desc = "A generic brand of lipstick." icon = 'icons/obj/items.dmi' icon_state = "lipstick" - flags = FPRINT | TABLEPASS w_class = 1.0 var/colour = "red" var/open = 0 diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index f5f4208073..71fb259dcd 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "plastic-explosive0" item_state = "plasticx" - flags = FPRINT | TABLEPASS | NOBLUDGEON + flags = NOBLUDGEON w_class = 2.0 origin_tech = "syndicate=2" var/datum/wires/explosive/c4/wires = null diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index f6758e53e6..800f47773c 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -5,7 +5,7 @@ icon_state = "fire_extinguisher0" item_state = "fire_extinguisher" hitsound = 'sound/weapons/smash.ogg' - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT throwforce = 10 w_class = 3.0 throw_speed = 2 @@ -13,7 +13,7 @@ force = 10.0 matter = list("metal" = 90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") - + var/spray_particles = 6 var/spray_amount = 2 //units of liquid per particle var/max_water = 120 @@ -27,7 +27,6 @@ icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. - flags = FPRINT | TABLEPASS throwforce = 2 w_class = 2.0 force = 3.0 @@ -124,7 +123,7 @@ R.my_atom = W if(!W || !src) return src.reagents.trans_to(W, spray_amount) - + for(var/b=0, b<5, b++) step_towards(W,my_target) if(!W || !W.reagents) return @@ -135,6 +134,9 @@ if(!W.reagents) break W.reagents.reaction(atm) + if(isliving(atm)) //For extinguishing mobs on fire + var/mob/living/M = atm + M.ExtinguishMob() if(W.loc == my_target) break sleep(2) W.delete() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 3830f105fd..50508594cf 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/flamethrower.dmi' icon_state = "flamethrowerbase" item_state = "flamethrower_0" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 3.0 throwforce = 10.0 throw_speed = 1 diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index d1fb667e99..f501753807 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -7,7 +7,7 @@ item_state = "flashbang" throw_speed = 4 throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT var/active = 0 var/det_time = 50 diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index d518567a5d..139baacb6f 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -5,7 +5,6 @@ icon_state = "flashbang" det_time = 20 item_state = "flashbang" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT var/datum/effect/effect/system/smoke_spread/bad/smoke diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index a1ea44daa9..246636890d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -4,7 +4,7 @@ gender = PLURAL icon = 'icons/obj/items.dmi' icon_state = "handcuff" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 5 w_class = 2.0 diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index f3d5703225..0b492c2659 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -10,7 +10,6 @@ desc = "A small satchel made for organizing seeds." var/mode = 1; //0 = pick one at a time, 1 = pick all on tile var/capacity = 500; //the number of seeds it can carry. - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT w_class = 1 var/list/item_quants = list() diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index ae77d373da..00ce8a7950 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -26,7 +26,7 @@ return if((!in_range(src, usr) && src.loc != user)) return - t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + t = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if(t) src.name = text("Glass Case - '[]'", t) else diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index d7be368665..d32ae9d8ba 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -23,6 +23,8 @@ if (source.handcuffed) var/obj/item/weapon/W = source.handcuffed source.handcuffed = null + if(source.buckled && source.buckled.buckle_require_restraints) + source.buckled.unbuckle_mob() source.update_inv_handcuffed() if (source.client) source.client.screen -= W diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index e0bca0c65a..66d8c6d01b 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -22,7 +22,7 @@ throwforce = 5.0 throw_speed = 3 throw_range = 5 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT origin_tech = "materials=1" attack_verb = list("attacked", "stabbed", "poked") sharp = 0 @@ -61,6 +61,8 @@ playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) overlays.Cut() return + else + ..() /obj/item/weapon/kitchen/utensil/fork name = "fork" @@ -135,7 +137,7 @@ icon = 'icons/obj/kitchen.dmi' icon_state = "knife" desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT sharp = 1 edge = 1 force = 10.0 @@ -167,7 +169,7 @@ icon = 'icons/obj/kitchen.dmi' icon_state = "butch" desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 15.0 w_class = 2.0 throwforce = 8.0 @@ -244,7 +246,7 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT matter = list("metal" = 3000) /* // NOPE var/food_total= 0 diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index e29860dc2c..1b1d5b04f3 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -5,10 +5,12 @@ var/active_w_class sharp = 0 edge = 0 - flags = FPRINT | TABLEPASS | NOBLOODY + flags = NOBLOODY /obj/item/weapon/melee/energy/proc/activate(mob/living/user) anchored = 1 + if(active) + return active = 1 force = active_force throwforce = active_throwforce @@ -19,13 +21,15 @@ /obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) anchored = 0 + if(!active) + return + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) active = 0 force = initial(force) throwforce = initial(throwforce) sharp = initial(sharp) edge = initial(edge) w_class = initial(w_class) - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) /obj/item/weapon/melee/energy/attack_self(mob/living/user as mob) if (active) @@ -69,7 +73,7 @@ throw_speed = 1 throw_range = 5 w_class = 3 - flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS | NOBLOODY + flags = CONDUCT | NOSHIELD | NOBLOODY origin_tech = "magnets=3;combat=4" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 @@ -105,7 +109,7 @@ throw_speed = 1 throw_range = 5 w_class = 2 - flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY + flags = NOSHIELD | NOBLOODY origin_tech = "magnets=3;syndicate=4" /obj/item/weapon/melee/energy/sword/dropped(var/mob/user) @@ -173,7 +177,7 @@ throw_speed = 1 throw_range = 1 w_class = 4.0//So you can't hide it in your pocket or some such. - flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY + flags = NOSHIELD | NOBLOODY attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/mob/living/creator var/datum/effect/effect/system/spark_spread/spark_system diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 36dbc26537..c5efdae1fb 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -3,7 +3,7 @@ desc = "A tool used by great men to placate the frothing masses." icon_state = "chain" item_state = "chain" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 10 throwforce = 7 diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 017db06a04..fe9945f8f0 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -8,7 +8,6 @@ throw_speed = 5 throw_range = 10 w_class = 3.0 - flags = FPRINT | TABLEPASS attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") var/mopping = 0 var/mopcount = 0 diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 2c0e1d812d..0606569c4f 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -12,8 +12,8 @@ var/global/list/cached_icons = list() w_class = 3.0 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(10,20,30,50,70) - volume = 70 - flags = FPRINT | OPENCONTAINER + volume = 60 + flags = OPENCONTAINER var/paint_type = "" afterattack(turf/simulated/target, mob/user, proximity) @@ -33,7 +33,13 @@ var/global/list/cached_icons = list() else if(paint_type && lentext(paint_type) > 0) name = paint_type + " " + name ..() - reagents.add_reagent("paint_[paint_type]", volume) + reagents.add_reagent("water", volume*3/5) + reagents.add_reagent("plasticide", volume/5) + if(paint_type == "white") //why don't white crayons exist + reagents.add_reagent("aluminum", volume/5) + else + reagents.add_reagent("crayon_dust_[paint_type]", volume/5) + reagents.handle_reactions() on_reagent_change() //Until we have a generic "paint", this will give new colours to all paints in the can var/mixedcolor = mix_color_from_reagents(reagents.reagent_list) @@ -44,6 +50,10 @@ var/global/list/cached_icons = list() icon_state = "paint_red" paint_type = "red" + yellow + icon_state = "paint_yellow" + paint_type = "yellow" + green icon_state = "paint_green" paint_type = "green" @@ -52,17 +62,13 @@ var/global/list/cached_icons = list() icon_state = "paint_blue" paint_type = "blue" - yellow - icon_state = "paint_yellow" - paint_type = "yellow" - violet icon_state = "paint_violet" - paint_type = "violet" + paint_type = "purple" black icon_state = "paint_black" - paint_type = "black" + paint_type = "gray" white icon_state = "paint_white" @@ -81,71 +87,6 @@ var/global/list/cached_icons = list() item_state = "paintcan" w_class = 3.0 -/obj/item/weapon/paint/red - name = "red paint" - color = "FF0000" - icon_state = "paint_red" - -/obj/item/weapon/paint/green - name = "green paint" - color = "00FF00" - icon_state = "paint_green" - -/obj/item/weapon/paint/blue - name = "blue paint" - color = "0000FF" - icon_state = "paint_blue" - -/obj/item/weapon/paint/yellow - name = "yellow paint" - color = "FFFF00" - icon_state = "paint_yellow" - -/obj/item/weapon/paint/violet - name = "violet paint" - color = "FF00FF" - icon_state = "paint_violet" - -/obj/item/weapon/paint/black - name = "black paint" - color = "333333" - icon_state = "paint_black" - -/obj/item/weapon/paint/white - name = "white paint" - color = "FFFFFF" - icon_state = "paint_white" - - -/obj/item/weapon/paint/anycolor - gender= PLURAL - name = "any color" - icon_state = "paint_neutral" - - attack_self(mob/user as mob) - var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "black", "white") - if ((user.get_active_hand() != src || user.stat || user.restrained())) - return - switch(t1) - if("red") - color = "FF0000" - if("blue") - color = "0000FF" - if("green") - color = "00FF00" - if("yellow") - color = "FFFF00" - if("violet") - color = "FF00FF" - if("white") - color = "FFFFFF" - if("black") - color = "333333" - icon_state = "paint_[t1]" - add_fingerprint(user) - return - - /obj/item/weapon/paint/afterattack(turf/target, mob/user as mob, proximity) if(!proximity) return if(!istype(target) || istype(target, /turf/space)) @@ -171,7 +112,7 @@ var/global/list/cached_icons = list() target.icon = initial(target.icon) return */ - +/* datum/reagent/paint name = "Paint" id = "paint_" @@ -179,15 +120,7 @@ datum/reagent/paint color = "#808080" description = "This paint will only adhere to floor tiles." - reaction_turf(var/turf/T, var/volume) - if(!istype(T) || istype(T, /turf/space)) - return - T.color = color - reaction_obj(var/obj/O, var/volume) - ..() - if(istype(O,/obj/item/weapon/light)) - O.color = color red name = "Red Paint" @@ -235,3 +168,4 @@ datum/reagent/paint_remover if(istype(T) && T.icon != initial(T.icon)) T.icon = initial(T.icon) return +*/ diff --git a/code/WorkInProgress/Ported/policetape.dm b/code/game/objects/items/weapons/policetape.dm similarity index 97% rename from code/WorkInProgress/Ported/policetape.dm rename to code/game/objects/items/weapons/policetape.dm index a4d2c31bdc..8791ea1075 100644 --- a/code/WorkInProgress/Ported/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -3,7 +3,6 @@ name = "tape roll" icon = 'icons/policetape.dmi' icon_state = "rollstart" - flags = FPRINT w_class = 2.0 var/turf/start var/turf/end @@ -98,8 +97,8 @@ //is_blocked_turf(var/turf/T) usr << "\blue You finish placing the [src]." //Git Test -/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob) - if (istype(A, /obj/machinery/door/airlock)) +/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) + if (proximity && istype(A, /obj/machinery/door/airlock)) var/turf/T = get_turf(A) var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) P.loc = locate(T.x,T.y,T.z) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index b0b8fbdc04..5cab6b24cb 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -5,7 +5,6 @@ icon_state = "cell" item_state = "cell" origin_tech = "powerstorage=1" - flags = FPRINT|TABLEPASS force = 5.0 throwforce = 5.0 throw_speed = 3 diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index e9aa6f3ca6..92ba323a6a 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "scroll" var/uses = 4.0 - flags = FPRINT | TABLEPASS w_class = 2.0 item_state = "paper" throw_speed = 4 @@ -70,7 +69,7 @@ return if(user && user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() var/list/tempL = L var/attempt = null diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 2814c6fe4d..65f1abddfb 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -6,7 +6,7 @@ desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." icon = 'icons/obj/weapons.dmi' icon_state = "riot" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK force = 5.0 throwforce = 5.0 @@ -39,7 +39,7 @@ desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." icon = 'icons/obj/weapons.dmi' icon_state = "eshield0" // eshield1 for expanded - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 3.0 throwforce = 5.0 throw_speed = 1 @@ -88,7 +88,7 @@ icon = 'icons/obj/device.dmi' icon_state = "shield0" var/active = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT item_state = "electronic" throwforce = 10.0 throw_speed = 2 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 0304aac95e..2b38772b86 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -9,7 +9,6 @@ icon_state = "backpack" item_state = "backpack" w_class = 4.0 - flags = FPRINT|TABLEPASS slot_flags = SLOT_BACK //ERROOOOO max_w_class = 3 max_combined_w_class = 21 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index b2d54be947..88db6abd3e 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -21,7 +21,6 @@ display_contents_with_number = 0 // UNStABLE AS FuCK, turn on when it stops crashing clients use_to_pickup = 1 slot_flags = SLOT_BELT - flags = FPRINT | TABLEPASS // ----------------------------- // Trash bag diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 941fdaae3b..0c4a94eb86 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 0545f85d21..822b986488 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -5,7 +5,6 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 - flags = FPRINT | TABLEPASS var/mob/affecting = null var/deity_name = "Christ" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 4b9a7dbe64..ced886bedd 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -444,7 +444,6 @@ item_state = "zippo" storage_slots = 10 w_class = 1 - flags = TABLEPASS slot_flags = SLOT_BELT can_hold = list("/obj/item/weapon/flame/match") diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 126d60e1e4..f6addee005 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -3,7 +3,7 @@ desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional." icon_state = "briefcase" item_state = "briefcase" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 8.0 throw_speed = 1 throw_range = 4 diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 64d8e89bb7..2ddc1da1d3 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -69,7 +69,6 @@ item_state = "candlebox5" storage_slots = 5 throwforce = 2 - flags = TABLEPASS slot_flags = SLOT_BELT @@ -133,7 +132,6 @@ item_state = "cigpacket" w_class = 1 throwforce = 2 - flags = TABLEPASS slot_flags = SLOT_BELT storage_slots = 6 can_hold = list("/obj/item/clothing/mask/cigarette") @@ -190,7 +188,6 @@ icon = 'icons/obj/cigarettes.dmi' w_class = 1 throwforce = 2 - flags = TABLEPASS slot_flags = SLOT_BELT storage_slots = 7 can_hold = list("/obj/item/clothing/mask/cigarette/cigar") diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index b3e94bf4d9..74c47cab05 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -145,7 +145,6 @@ icon_state = "secure" item_state = "sec-case" desc = "A large briefcase with a digital locking system." - flags = FPRINT | TABLEPASS force = 8.0 throw_speed = 1 throw_range = 4 @@ -216,7 +215,6 @@ icon_opened = "safe0" icon_locking = "safeb" icon_sparking = "safespark" - flags = FPRINT | TABLEPASS force = 8.0 w_class = 8.0 max_w_class = 8 diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index b6b11af106..a585b96ce2 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "red" item_state = "toolbox_red" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 5.0 throwforce = 10.0 throw_speed = 1 diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index d9d7ec0126..383e21ff4f 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -17,7 +17,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "retractor" matter = list("metal" = 10000, "glass" = 5000) - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT w_class = 2.0 origin_tech = "materials=1;biotech=1" @@ -30,7 +30,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "hemostat" matter = list("metal" = 5000, "glass" = 2500) - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT w_class = 2.0 origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "pinched") @@ -44,7 +44,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "cautery" matter = list("metal" = 5000, "glass" = 2500) - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT w_class = 2.0 origin_tech = "materials=1;biotech=1" attack_verb = list("burnt") @@ -59,7 +59,7 @@ icon_state = "drill" hitsound = 'sound/weapons/circsawhit.ogg' matter = list("metal" = 15000, "glass" = 10000) - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 15.0 w_class = 2.0 origin_tech = "materials=1;biotech=1" @@ -78,7 +78,7 @@ desc = "Cut, cut, and once more cut." icon = 'icons/obj/surgery.dmi' icon_state = "scalpel" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 10.0 sharp = 1 edge = 1 @@ -134,7 +134,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "saw3" hitsound = 'sound/weapons/circsawhit.ogg' - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 15.0 w_class = 2.0 throwforce = 9.0 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 34516e875f..e7d46bc68e 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -21,7 +21,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "baton" item_state = "classic_baton" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT force = 10 @@ -70,7 +69,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "telebaton_0" item_state = "telebaton_0" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT w_class = 2 force = 3 diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index fff0deed5f..2dfc3f4730 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/items.dmi' icon_state = "table_parts" matter = list("metal" = 3750) - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked") var/build_type = /obj/structure/table @@ -50,7 +50,7 @@ icon = 'icons/obj/items.dmi' icon_state = "reinf_tableparts" matter = list("metal" = 7500) - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT stack_types = list(/obj/item/stack/sheet/metal, /obj/item/stack/rods) build_type = /obj/structure/table/reinforced diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 23a5690e3f..02d50e0d26 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -85,7 +85,7 @@ name = "phoron tank" desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." icon_state = "phoron" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = null //they have no straps! @@ -114,7 +114,7 @@ name = "emergency oxygen tank" desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." icon_state = "emergency" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT w_class = 2.0 force = 4.0 diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index f6485f0a16..551e4790dc 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -4,7 +4,7 @@ /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK w_class = 3 @@ -117,10 +117,16 @@ ui_interact(user) /obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/mob/living/carbon/location = null + if(istype(loc, /obj/item/weapon/rig)) // check for tanks in rigs + if(istype(loc.loc, /mob/living/carbon)) + location = loc.loc + else if(istype(loc, /mob/living/carbon)) + location = loc + var/using_internal - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc + if(istype(location)) if(location.internal==src) using_internal = 1 @@ -133,9 +139,20 @@ data["valveOpen"] = using_internal ? 1 : 0 data["maskConnected"] = 0 - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) + + if(istype(location)) + var/mask_check = 0 + + if(location.internal == src) // if tank is current internal + mask_check = 1 + else if(src in location) // or if tank is in the mobs possession + if(!location.internal) // and they do not have any active internals + mask_check = 1 + else if(istype(src.loc, /obj/item/weapon/rig) && src.loc in location) // or the rig is in the mobs possession + if(!location.internal) // and they do not have any active internals + mask_check = 1 + + if(mask_check) if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) data["maskConnected"] = 1 else if(istype(location, /mob/living/carbon/human)) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 2d82cacaad..477bce6b32 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -13,7 +13,7 @@ user.put_in_hands(tape) */ -/obj/item/weapon/tape_roll/proc/stick(var/obj/item/weapon/W, mob/user as mob) +/obj/item/weapon/tape_roll/proc/stick(var/obj/item/weapon/W, mob/user) if(!istype(W, /obj/item/weapon/paper)) return @@ -30,14 +30,14 @@ w_class = 1 layer = 4 anchored = 1 //it's sticky, no you cant move it - + var/obj/item/weapon/stuck = null /obj/item/weapon/ducttape/New() ..() flags |= NOBLUDGEON -/obj/item/weapon/ducttape/examine(mob/user as mob) +/obj/item/weapon/ducttape/examine(mob/user) return stuck.examine(user) /obj/item/weapon/ducttape/proc/attach(var/obj/item/weapon/W) @@ -47,7 +47,7 @@ name = W.name + " (taped)" overlays = W.overlays -/obj/item/weapon/ducttape/attack_self(mob/user as mob) +/obj/item/weapon/ducttape/attack_self(mob/user) if(!stuck) return @@ -60,7 +60,7 @@ overlays = null del(src) -/obj/item/weapon/ducttape/afterattack(var/A, mob/user as mob, flag, params) +/obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params) if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck) return @@ -70,6 +70,9 @@ var/dir_offset = 0 if(target_turf != source_turf) dir_offset = get_dir(source_turf, target_turf) + if(!(dir_offset in cardinal)) + user << "You cannot reach that from here." // can only place stuck papers in cardinal directions, to + return // reduce papers around corners issue. user.drop_from_inventory(src) forceMove(source_turf) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index e04a5f0888..d8c811d2f6 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -16,7 +16,7 @@ var/frequency = 1451 var/broadcasting = null var/listening = 1.0 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT w_class = 2.0 item_state = "electronic" throw_speed = 4 diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 62793f0b2c..ee56415be7 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -19,7 +19,7 @@ desc = "A wrench with many common uses. Can be usually found in your hand." icon = 'icons/obj/items.dmi' icon_state = "wrench" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 5.0 throwforce = 7.0 @@ -37,7 +37,7 @@ desc = "You can be totally screwwy with this." icon = 'icons/obj/items.dmi' icon_state = "screwdriver" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 5.0 w_class = 1.0 @@ -96,7 +96,7 @@ desc = "This cuts wires." icon = 'icons/obj/items.dmi' icon_state = "cutters" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 6.0 throw_speed = 2 @@ -119,6 +119,8 @@ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") C.handcuffed = null + if(C.buckled && C.buckled.buckle_require_restraints) + C.buckled.unbuckle_mob() C.update_inv_handcuffed() return else @@ -131,7 +133,7 @@ name = "welding tool" icon = 'icons/obj/items.dmi' icon_state = "welder" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT //Amount of OUCH when it's thrown @@ -259,6 +261,9 @@ if (src.welding) remove_fuel(1) var/turf/location = get_turf(user) + if(isliving(O)) + var/mob/living/L = O + L.IgniteMob() if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) return @@ -433,7 +438,7 @@ desc = "Used to remove floors and to pry open doors." icon = 'icons/obj/items.dmi' icon_state = "crowbar" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 5.0 throwforce = 7.0 @@ -531,4 +536,4 @@ if(!resolved && tool && target) tool.afterattack(target,user,1) if(tool) - tool.loc = src*/ + tool.loc = src*/ diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index c8e67078b2..2ccd78d361 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -21,6 +21,7 @@ var/force_wielded = 0 var/wieldsound = null var/unwieldsound = null + var/base_icon /obj/item/weapon/twohanded/proc/unwield() wielded = 0 @@ -34,6 +35,10 @@ name = "[initial(name)] (Wielded)" update_icon() +/obj/item/weapon/twohanded/New() + ..() + update_icon() + /obj/item/weapon/twohanded/mob_can_equip(M as mob, slot) //Cannot equip wielded items. if(wielded) @@ -51,7 +56,8 @@ return unwield() /obj/item/weapon/twohanded/update_icon() - return + icon_state = "[base_icon][wielded]" + item_state = icon_state /obj/item/weapon/twohanded/pickup(mob/user) unwield() @@ -106,11 +112,15 @@ wield() del(src) +/obj/item/weapon/twohanded/offhand/update_icon() + return + /* * Fireaxe */ /obj/item/weapon/twohanded/fireaxe // DEM AXES MAN, marker -Agouri icon_state = "fireaxe0" + base_icon = "fireaxe" name = "fire axe" desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" force = 10 @@ -121,10 +131,6 @@ force_wielded = 40 attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") -/obj/item/weapon/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons. - icon_state = "fireaxe[wielded]" - return - /obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) if(!proximity) return ..() @@ -146,6 +152,7 @@ */ /obj/item/weapon/twohanded/dualsaber icon_state = "dualsaber0" + base_icon = "dualsaber" name = "double-bladed energy sword" desc = "Handle with care." force = 3 @@ -156,16 +163,12 @@ force_wielded = 30 wieldsound = 'sound/weapons/saberon.ogg' unwieldsound = 'sound/weapons/saberoff.ogg' - flags = FPRINT | TABLEPASS | NOSHIELD + flags = NOSHIELD origin_tech = "magnets=3;syndicate=4" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharp = 1 edge = 1 -/obj/item/weapon/twohanded/dualsaber/update_icon() - icon_state = "dualsaber[wielded]" - return - /obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob) ..() if((CLUMSY in user.mutations) && (wielded) &&prob(40)) @@ -187,6 +190,7 @@ //spears, bay edition /obj/item/weapon/twohanded/spear icon_state = "spearglass0" + base_icon = "spearglass" name = "spear" desc = "A haphazardly-constructed yet still deadly weapon of ancient design." force = 14 @@ -201,6 +205,29 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") -/obj/item/weapon/twohanded/spear/update_icon() - icon_state = "spearglass[wielded]" - return +/obj/item/weapon/twohanded/baseballbat + name = "wooden bat" + desc = "HOME RUN!" + icon_state = "woodbat0" + base_icon = "woodbat" + item_state = "woodbat" + sharp = 0 + edge = 0 + w_class = 3 + force = 15 + throw_speed = 3 + throw_range = 7 + throwforce = 7 + attack_verb = list("smashed", "beaten", "slammed", "smacked", "striked", "battered", "bonked") + hitsound = 'sound/weapons/genhit3.ogg' + force_wielded = 23 + +/obj/item/weapon/twohanded/baseballbat/metal + name = "metal bat" + desc = "A shiny metal bat." + icon_state = "metalbat0" + base_icon = "metalbat" + item_state = "metalbat" + force = 18 + w_class = 3.0 + force_wielded = 27 \ No newline at end of file diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index a584f3db4b..02f6642037 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -3,7 +3,6 @@ name = "banhammer" icon = 'icons/obj/items.dmi' icon_state = "toyhammer" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT throwforce = 0 w_class = 2.0 @@ -20,7 +19,6 @@ desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." icon_state = "nullrod" item_state = "nullrod" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT force = 15 throw_speed = 1 @@ -77,7 +75,6 @@ desc = "This thing is so unspeakably shitty you are having a hard time even holding it." icon_state = "sord" item_state = "sord" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT force = 2 throwforce = 1 @@ -99,7 +96,7 @@ desc = "What are you standing around staring at this for? Get to killing!" icon_state = "claymore" item_state = "claymore" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 40 throwforce = 10 @@ -124,7 +121,7 @@ desc = "Woefully underpowered in D20" icon_state = "katana" item_state = "katana" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT | SLOT_BACK force = 40 throwforce = 10 @@ -156,30 +153,6 @@ w_class = 3 attack_verb = list("jabbed","stabbed","ripped") -/obj/item/weapon/baseballbat - name = "wooden bat" - desc = "HOME RUN!" - icon_state = "woodbat" - item_state = "woodbat" - sharp = 0 - edge = 0 - w_class = 3 - force = 15 - throw_speed = 3 - throw_range = 7 - throwforce = 7 - attack_verb = list("smashed", "beaten", "slammed", "smacked", "striked", "battered", "bonked") - hitsound = 'sound/weapons/genhit3.ogg' - - -/obj/item/weapon/baseballbat/metal - name = "metal bat" - desc = "A shiny metal bat." - icon_state = "metalbat" - item_state = "metalbat" - force = 18 - w_class = 3.0 - /obj/item/weapon/butterfly name = "butterfly knife" desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket." diff --git a/code/WorkInProgress/Wrongnumber/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm similarity index 100% rename from code/WorkInProgress/Wrongnumber/weldbackpack.dm rename to code/game/objects/items/weapons/weldbackpack.dm diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index d105caae00..a23bb65cf8 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -20,7 +20,7 @@ var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) attack_generic(user,1,"slices") - return + return ..() /obj/structure/blob_act() if(prob(50)) @@ -67,10 +67,10 @@ /obj/structure/MouseDrop_T(mob/target, mob/user) var/mob/living/H = user - if(!istype(H) || target != user) // No making other people climb onto tables. - return - - do_climb(target) + if(istype(H) && can_climb(H) && target == user) + do_climb(target) + else + return ..() /obj/structure/proc/can_climb(var/mob/living/user) if (!can_touch(user) || !climbable) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a929ff7201..d9abac8979 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/closet.dmi' icon_state = "closed" density = 1 - flags = FPRINT var/icon_closed = "closed" var/icon_opened = "open" var/opened = 0 @@ -21,7 +20,7 @@ var/store_items = 1 var/store_mobs = 1 - var/const/mob_size = 15 + var/const/default_mob_size = 15 /obj/structure/closet/initialize() if(!opened) // if closed, any item at the crate's loc is put in the contents @@ -121,20 +120,17 @@ /obj/structure/closet/proc/store_mobs(var/stored_units) var/added_units = 0 - for(var/mob/M in src.loc) - if(stored_units + added_units + mob_size > storage_capacity) - break - if(istype (M, /mob/dead/observer)) - continue + for(var/mob/living/M in src.loc) if(M.buckled || M.pinned.len) continue - + var/current_mob_size = (M.mob_size ? M.mob_size : default_mob_size) + if(stored_units + added_units + current_mob_size > storage_capacity) + break if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src - M.loc = src - added_units += mob_size + added_units += current_mob_size return added_units /obj/structure/closet/proc/toggle(mob/user as mob) @@ -191,7 +187,8 @@ /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) if(istype(W, /obj/item/weapon/grab)) - src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet + var/obj/item/weapon/grab/G = W + src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet if(istype(W,/obj/item/tk_grab)) return 0 if(istype(W, /obj/item/weapon/weldingtool)) @@ -206,6 +203,8 @@ return if(isrobot(user)) return + if(W.loc != user) // This should stop mounted modules ending up outside the module. + return usr.drop_item() if(W) W.loc = src.loc diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 09810842d4..a3b9f39928 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -66,12 +66,15 @@ /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W if(src.large) - src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet + src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet else - user << "The locker is too small to stuff [W:affecting] into!" + user << "The locker is too small to stuff [G.affecting] into!" if(isrobot(user)) return + if(W.loc != user) // This should stop mounted modules ending up outside the module. + return user.drop_item() if(W) W.loc = src.loc diff --git a/code/game/objects/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm similarity index 100% rename from code/game/objects/closets/walllocker.dm rename to code/game/objects/structures/crates_lockers/closets/walllocker.dm diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 3f6f321129..4c233f24ef 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -70,6 +70,8 @@ if(opened) if(isrobot(user)) return + if(W.loc != user) // This should stop mounted modules ending up outside the module. + return user.drop_item() if(W) W.loc = src.loc diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index e9fdd40966..d2b1f56eb3 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/storage.dmi' icon_state = "densecrate" density = 1 - flags = FPRINT /obj/structure/largecrate/attack_hand(mob/user as mob) user << "You need a crowbar to pry this open!" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 67c2ddf9a3..db0a5acc91 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -14,6 +14,11 @@ return 1 /obj/structure/girder/bullet_act(var/obj/item/projectile/Proj) + + //Tasers and the like should not damage girders. + if(Proj.damage_type == HALLOSS || Proj.damage_type == TOX || Proj.damage_type == CLONE) + return + if(istype(Proj, /obj/item/projectile/beam)) health -= Proj.damage ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 9bb1cec396..2b06bcb534 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -5,7 +5,7 @@ icon_state = "grille" density = 1 anchored = 1 - flags = FPRINT | CONDUCT + flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE layer = 2.9 explosion_resistance = 5 diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 0b542dd2bb..836b35ca02 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -211,7 +211,7 @@ /obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle() + unbuckle_mob() if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key)) step(src, direction) update_mob() @@ -226,22 +226,9 @@ buckled_mob.loc = loc -/obj/structure/stool/bed/chair/janicart/buckle_mob(mob/M, mob/user) - if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon)) - return - - unbuckle() - - M.visible_message(\ - "[M] climbs onto the [callme]!",\ - "You climb onto the [callme]!") - M.buckled = src - M.loc = loc - M.set_dir(dir) - M.update_canmove() - buckled_mob = M +/obj/structure/stool/bed/chair/janicart/post_buckle_mob(mob/living/M) update_mob() - add_fingerprint(user) + return ..() /obj/structure/stool/bed/chair/janicart/update_layer() @@ -251,11 +238,12 @@ layer = OBJ_LAYER -/obj/structure/stool/bed/chair/janicart/unbuckle() - if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - ..() +/obj/structure/stool/bed/chair/janicart/unbuckle_mob() + var/mob/living/M = ..() + if(M) + M.pixel_x = 0 + M.pixel_y = 0 + return M /obj/structure/stool/bed/chair/janicart/set_dir() diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 06aae9557b..ec568b8408 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -5,7 +5,7 @@ icon_state = "mopbucket" density = 1 pressure_resistance = 5 - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 0b0c063af2..5d00b0a0cb 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -92,7 +92,7 @@ return if ((!in_range(src, usr) && src.loc != user)) return - t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + t = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if (t) src.name = text("Morgue- '[]'", t) else @@ -258,7 +258,7 @@ return if ((!in_range(src, usr) > 1 && src.loc != user)) return - t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + t = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if (t) src.name = text("Crematorium- '[]'", t) else @@ -316,7 +316,7 @@ var/mob/living/carbon/C = M if (!(C.species && (C.species.flags & NO_PAIN))) C.emote("scream") - + //Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out. //M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]" diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 1f23e10411..a5ad84c20e 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -3,7 +3,6 @@ desc = "A board for pinning important notices upon." icon = 'icons/obj/stationobjs.dmi' icon_state = "nboard00" - flags = FPRINT density = 0 anchored = 1 var/notices = 0 diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index e67fea3849..451bfd8b3e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -8,7 +8,7 @@ icon_state = "nest" var/health = 100 -/obj/structure/stool/bed/nest/manual_unbuckle(mob/user as mob) +/obj/structure/stool/bed/nest/user_unbuckle_mob(mob/user as mob) if(buckled_mob) if(buckled_mob.buckled == src) if(buckled_mob != user) @@ -18,7 +18,7 @@ "You hear squelching...") buckled_mob.pixel_y = 0 buckled_mob.old_y = 0 - unbuckle() + unbuckle_mob() else if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME) return @@ -32,16 +32,15 @@ buckled_mob.last_special = world.time buckled_mob.pixel_y = 0 buckled_mob.old_y = 0 - unbuckle() + unbuckle_mob() src.add_fingerprint(user) return -/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob) - +/obj/structure/stool/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob) if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) return - unbuckle() + unbuckle_mob() var/mob/living/carbon/xenos = user var/mob/living/carbon/victim = M 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 8902dbc8ec..cd8d78c4c6 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -11,8 +11,10 @@ name = "bed" desc = "This is used to lie in, sleep in or strap on." icon_state = "bed" - var/mob/living/buckled_mob - var/movable = 0 // For mobility checks + can_buckle = 1 + buckle_lying = 1 + //var/mob/living/buckled_mob + //var/movable = 0 // For mobility checks /obj/structure/stool/bed/psych name = "psychiatrists couch" @@ -24,7 +26,7 @@ desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" icon_state = "abed" -/obj/structure/stool/bed/Del() +/*/obj/structure/stool/bed/Del() unbuckle() ..() return @@ -80,7 +82,7 @@ /obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob) if (!ticker) user << "You can't buckle anyone in before the game starts." - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || M.pinned.len || istype(user, /mob/living/silicon/pai) ) + if (!ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || M.pinned.len || istype(user, /mob/living/silicon/pai) ) return if (istype(M, /mob/living/carbon/slime)) @@ -106,7 +108,7 @@ src.buckled_mob = M src.add_fingerprint(user) afterbuckle(M) - return + return*/ /* * Roller beds @@ -120,7 +122,7 @@ /obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/roller_holder)) if(buckled_mob) - manual_unbuckle() + user_unbuckle_mob(user) else visible_message("[user] collapses \the [src.name].") new/obj/item/roller(get_turf(src)) @@ -185,29 +187,19 @@ else buckled_mob = null -/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 = 6 - M.old_y = 6 - density = 1 - icon_state = "up" - ..() - return +/obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M as mob) + if(M == buckled_mob) + M.pixel_y = 6 + M.old_y = 6 + density = 1 + icon_state = "up" + else + buckled_mob.pixel_y = 0 + buckled_mob.old_y = 0 + density = 0 + icon_state = "down" -/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 = 0 - buckled_mob.old_y = 0 - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.buckled = null - buckled_mob.update_canmove() - buckled_mob = null - density = 0 - icon_state = "down" - ..() - return + return ..() /obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location) ..() 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 16d84f6aad..55f3e36398 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -2,12 +2,10 @@ name = "chair" desc = "You sit in this. Either by will or force." icon_state = "chair" + buckle_lying = 0 //force people to sit up in chairs when buckled var/propelled = 0 // Check for fire-extinguisher-driven chairs -/obj/structure/stool/MouseDrop(atom/over_object) - return - /obj/structure/stool/bed/chair/New() ..() spawn(3) //sorry. i don't think there's a better way to do this. @@ -68,11 +66,6 @@ src.set_dir(turn(src.dir, 90)) return -/obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob) - if(!istype(M)) return - buckle_mob(M, user) - return - // Chair types /obj/structure/stool/bed/chair/wood/normal icon_state = "wooden_chair" @@ -105,7 +98,7 @@ return ..() -/obj/structure/stool/bed/chair/comfy/afterbuckle() +/obj/structure/stool/bed/chair/comfy/post_buckle_mob() if(buckled_mob) overlays += armrest else @@ -122,7 +115,7 @@ /obj/structure/stool/bed/chair/office anchored = 0 - movable = 1 + buckle_movable = 1 /obj/structure/stool/bed/chair/comfy/black color = rgb(167,164,153) @@ -143,15 +136,14 @@ if (O != occupant) Bump(O) else - unbuckle() + unbuckle_mob() /obj/structure/stool/bed/chair/office/Bump(atom/A) ..() if(!buckled_mob) return if(propelled) - var/mob/living/occupant = buckled_mob - unbuckle() + var/mob/living/occupant = unbuckle_mob() var/def_zone = ran_zone() var/blocked = occupant.run_armor_check(def_zone, "melee") diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index f412467c65..dce74304ec 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/objects.dmi' icon_state = "stool" anchored = 1.0 - flags = FPRINT pressure_resistance = 15 /obj/structure/stool/ex_act(severity) @@ -35,7 +34,7 @@ return /obj/structure/stool/MouseDrop(atom/over_object) - if (istype(over_object, /mob/living/carbon/human)) + if(istype(over_object, /mob/living/carbon/human) && type == /obj/structure/stool) //i am sorry for this, but the inheritance mess requires it var/mob/living/carbon/human/H = over_object if (H==usr && !H.restrained() && !H.stat && in_range(src, over_object)) var/obj/item/weapon/stool/S = new/obj/item/weapon/stool() @@ -43,6 +42,8 @@ src.loc = S H.put_in_hands(S) H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!") + return + return ..() /obj/item/weapon/stool name = "stool" diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 59a819b8b9..d07f1a33cb 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -3,7 +3,7 @@ desc = "You sit in this. Either by will or force." icon_state = "wheelchair" anchored = 0 - movable = 1 + buckle_movable = 1 var/driving = 0 var/mob/living/pulling = null @@ -93,7 +93,7 @@ if (O != occupant) Bump(O) else - unbuckle() + unbuckle_mob() if (pulling && (get_dist(src, pulling) > 1)) pulling.pulledby = null pulling << "\red You lost your grip!" @@ -102,11 +102,11 @@ if (occupant && (src.loc != occupant.loc)) src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving -/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob) +/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/living/user as mob) if (pulling) MouseDrop(usr) else - manual_unbuckle(user) + user_unbuckle_mob(user) return /obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) @@ -138,8 +138,7 @@ if(!buckled_mob) return if(propelled || (pulling && (pulling.a_intent == "hurt"))) - var/mob/living/occupant = buckled_mob - unbuckle() + var/mob/living/occupant = unbuckle_mob() if (pulling && (pulling.a_intent == "hurt")) occupant.throw_at(A, 3, 3, pulling) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 33235ae124..e77f1e602c 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -211,6 +211,11 @@ /obj/machinery/shower/proc/wash(atom/movable/O as obj|mob) if(!on) return + if(isliving(O)) + var/mob/living/L = O + L.ExtinguishMob() + L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily + if(iscarbon(O)) var/mob/living/carbon/M = O if(M.r_hand) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cd55637b35..458c5626bc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -15,25 +15,70 @@ var/basestate var/shardtype = /obj/item/weapon/shard var/glasstype = null // Set this in subtypes. Null is assumed strange or otherwise impossible to dismantle, such as for shuttle glass. -// var/silicate = 0 // number of units of silicate -// var/icon/silicateIcon = null // the silicated icon + var/silicate = 0 // number of units of silicate + +/obj/structure/window/examine(mob/user) + . = ..(user) + + if(health == maxhealth) + user << "It looks fully intact." + else + var/perc = health / maxhealth + if(perc > 0.75) + user << "It has a few cracks." + else if(perc > 0.5) + user << "It looks slightly damaged." + else if(perc > 0.25) + user << "It looks moderately damaged." + else + user << "It looks heavily damaged." + if(silicate) + if (silicate < 30) + user << "It has a thin layer of silicate." + else if (silicate < 70) + user << "It is covered in silicate." + else + user << "There is a thick layer of silicate covering it." /obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1) - var/initialhealth = src.health - src.health = max(0, src.health - damage) - if(src.health <= 0) - src.shatter() + var/initialhealth = health + + if(silicate) + damage = damage * (1 - silicate / 200) + + health = max(0, health - damage) + + if(health <= 0) + shatter() else if(sound_effect) playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) - if(src.health < src.maxhealth / 4 && initialhealth >= src.maxhealth / 4) + if(health < maxhealth / 4 && initialhealth >= maxhealth / 4) visible_message("[src] looks like it's about to shatter!" ) - else if(src.health < src.maxhealth / 2 && initialhealth >= src.maxhealth / 2) + else if(health < maxhealth / 2 && initialhealth >= maxhealth / 2) visible_message("[src] looks seriously damaged!" ) - else if(src.health < src.maxhealth * 3/4 && initialhealth >= src.maxhealth * 3/4) + else if(health < maxhealth * 3/4 && initialhealth >= maxhealth * 3/4) visible_message("Cracks begin to appear in [src]!" ) return +/obj/structure/window/proc/apply_silicate(var/amount) + if(health < maxhealth) // Mend the damage + health = min(health + amount * 3, maxhealth) + if(health == maxhealth) + visible_message("[src] looks fully repaired." ) + else // Reinforce + silicate = min(silicate + amount, 100) + updateSilicate() + +/obj/structure/window/proc/updateSilicate() + if (overlays) + overlays.Cut() + + var/image/img = image(src.icon, src.icon_state) + img.color = "#ffffff" + img.alpha = silicate * 255 / 100 + overlays += img + /obj/structure/window/proc/shatter(var/display_message = 1) playsound(src, "shatter", 70, 1) if(display_message) @@ -251,7 +296,7 @@ update_nearby_tiles(need_rebuild=1) //Compel updates before set_dir(turn(dir, 90)) -// updateSilicate() + updateSilicate() update_nearby_tiles(need_rebuild=1) return @@ -267,27 +312,10 @@ update_nearby_tiles(need_rebuild=1) //Compel updates before set_dir(turn(dir, 270)) -// updateSilicate() + updateSilicate() update_nearby_tiles(need_rebuild=1) return - -/* -/obj/structure/window/proc/updateSilicate() - if(silicateIcon && silicate) - icon = initial(icon) - - var/icon/I = icon(icon,icon_state,dir) - - var/r = (silicate / 100) + 1 - var/g = (silicate / 70) + 1 - var/b = (silicate / 50) + 1 - I.SetIntensity(r,g,b) - icon = I - silicateIcon = I -*/ - - /obj/structure/window/New(Loc, start_dir=null, constructed=0) ..() diff --git a/code/WorkInProgress/periodic_news.dm b/code/game/periodic_news.dm similarity index 100% rename from code/WorkInProgress/periodic_news.dm rename to code/game/periodic_news.dm diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 6686171279..84ec0adecb 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -27,7 +27,9 @@ if (istype(A,/mob/living/carbon)) var/mob/living/carbon/M = A - if(M.lying) return + if(M.lying) + ..() + return dirt++ var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) if (dirt >= 50) @@ -77,7 +79,7 @@ for (var/obj/structure/stool/bed/chair/C in loc) if (C.buckled_mob == M) noslip = 1 - if (noslip) + if((wet == 1 && M.m_intent == "walk") || noslip) return // no slipping while sitting in a chair, plz if(src.wet) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 5561d9cfbd..572ed0ff8d 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -25,18 +25,26 @@ /turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) - // Tasers and stuff? No thanks. - if(Proj.damage_type == HALLOSS) + // Tasers and stuff? No thanks. Also no clone or tox damage crap. + if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) return - // Emitter blasts are somewhat weaker as emitters have large rate of fire and don't require limited power cell to run - if(istype(Proj, /obj/item/projectile/beam/emitter)) - Proj.damage /= 4 + //cap the amount of damage, so that things like emitters can't destroy walls in one hit. + var/damage = min(Proj.damage, 100) * armor - take_damage(Proj.damage * armor) + take_damage(damage) return - +/turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) + ..() + if(ismob(AM)) + return + + var/tforce = AM:throwforce * (speed/THROWFORCE_SPEED_DIVISOR) + if (tforce < 15) + return + + take_damage(tforce * armor) /turf/simulated/wall/Del() for(var/obj/effect/E in src) if(E.name == "Wallrot") del E @@ -117,7 +125,7 @@ /turf/simulated/wall/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) if(adj_temp > max_temperature) - take_damage(log(rand(0.9, 1.1) * (adj_temp - max_temperature))) + take_damage(log(RAND_F(0.9, 1.1) * (adj_temp - max_temperature))) return ..() @@ -265,7 +273,7 @@ user << rotting_touch_message if(rotting_destroy_touch) dismantle_wall() - return 1 + return 1 if(..()) return 1 @@ -467,6 +475,9 @@ else if(istype(W,/obj/item/weapon/rcd)) //I bitterly resent having to write this. ~Z return + + else if(istype(W, /obj/item/weapon/reagent_containers)) + return // They tend to have meaningful afterattack - let them apply it without destroying a rotting wall else return attack_hand(user) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index e06f9ba980..b08363a715 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -5,7 +5,7 @@ opacity = 1 density = 1 - damage_cap = 1000 + damage_cap = 500 max_temperature = 6000 armor = 0.1 // Only 10% damage from gunfire, it's made from strong alloys and stuff. @@ -291,7 +291,10 @@ var/obj/item/light_fixture_frame/small/AH = W AH.try_build(src) return - + + else if(istype(W, /obj/item/weapon/reagent_containers)) + return // They tend to have meaningful afterattack - let them apply it without destroying a rotting wall + //Finally, CHECKING FOR FALSE WALLS if it isn't damaged else if(!d_state) return attack_hand(user) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6c9ee85751..1f86703322 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -128,34 +128,27 @@ if(!istype(atom, /atom/movable)) return - var/atom/movable/M = atom + var/atom/movable/A = atom var/loopsanity = 100 - if(ismob(M)) - if(!M:lastarea) - M:lastarea = get_area(M.loc) - if(M:lastarea.has_gravity == 0) + if(ismob(A)) + var/mob/M = A + if(!M.lastarea) + M.lastarea = get_area(M.loc) + if(M.lastarea.has_gravity == 0) inertial_drift(M) - /* - if(M.flags & NOGRAV) - inertial_drift(M) - */ - - - else if(!istype(src, /turf/space)) - M:inertia_dir = 0 - var/mob/M1 = M - M1.make_floating(0) + M.inertia_dir = 0 + M.make_floating(0) ..() var/objects = 0 - for(var/atom/A as mob|obj|turf|area in range(1)) + for(var/atom/O as mob|obj|turf|area in range(1)) if(objects > loopsanity) break objects++ spawn( 0 ) - if ((A && M)) - A.HasProximity(M, 1) + if ((O && A)) + O.HasProximity(A, 1) return return @@ -257,9 +250,9 @@ //W.Assimilate_Air() W.lighting_lumcount += old_lumcount - if(old_lumcount != W.lighting_lumcount) - W.lighting_changed = 1 - lighting_controller.changed_turfs += W + + if(W.lighting_lumcount) + W.UpdateAffectingLights() if(old_fire) fire = old_fire diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index e1b6428712..b8c124dcd8 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -12,7 +12,7 @@ src << "Guests may not use OOC." return - msg = trim(copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)) + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) if(!msg) return if(!(prefs.toggles & CHAT_OOC)) @@ -77,7 +77,7 @@ src << "Guests may not use OOC." return - msg = trim(copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)) + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) if(!msg) return if(!(prefs.toggles & CHAT_LOOC)) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 82a81e5af7..ab3c8dcc80 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -59,7 +59,8 @@ //Do 175 damage divided by the number of damage types applied. if(damagetype & BRUTELOSS) - adjustBruteLoss(175/damage_mod) + adjustBruteLoss(30/damage_mod) //hack to prevent gibbing + adjustOxyLoss(145/damage_mod) if(damagetype & FIRELOSS) adjustFireLoss(175/damage_mod) diff --git a/code/global.dm b/code/global.dm index 19ddbbe289..13f10c0764 100644 --- a/code/global.dm +++ b/code/global.dm @@ -231,3 +231,6 @@ var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons // Bomb cap! var/max_explosion_range = 14 + +// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. +var/global/obj/item/device/radio/intercom/global_announcer = new(null) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 9c3acb9c78..fdfb9f0e3e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -653,6 +653,7 @@ var/global/floorIsLava = 0 Ghost Mode
    Make all players retarded
    Make all items look like guns
    + Paintball Mode
    Japanese Animes Mode
    Egalitarian Station Mode
    Launch a shuttle
    @@ -948,7 +949,7 @@ var/global/floorIsLava = 0 return 2 return 1 if(M.mind in ticker.mode.syndicates) - if (ticker.mode.config_tag == "nuclear") + if (ticker.mode.config_tag == "mercenary") return 2 return 1 if(M.mind in ticker.mode.wizards) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 8d9e62cdcf..823fb69f80 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -46,6 +46,7 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_create_centcom_report, /client/proc/check_words, /*displays cult-words*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /client/proc/rename_ai, /*properly renames the AI*/ /client/proc/check_antagonists, /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ @@ -77,7 +78,8 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_antagHUD_use, /client/proc/toggle_antagHUD_restrictions, /client/proc/allow_character_respawn, /* Allows a ghost to respawn */ - /client/proc/event_manager_panel + /client/proc/event_manager_panel, + /client/proc/empty_ai_core_toggle_latejoin ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -282,7 +284,7 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SERVER) verbs += admin_verbs_server if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(config.debugparanoid && !check_rights(R_ADMIN)) + if(config.debugparanoid && !check_rights(R_ADMIN)) verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. if(holder.rights & R_POSSESS) verbs += admin_verbs_possess if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions @@ -308,24 +310,7 @@ var/list/admin_verbs_mentor = list( admin_verbs_rejuv, admin_verbs_sounds, admin_verbs_spawn, - /*Debug verbs added by "show debug verbs"*/ - /client/proc/Cell, - /client/proc/do_not_use_these, - /client/proc/camera_view, - /client/proc/sec_camera_report, - /client/proc/intercom_view, - /client/proc/atmosscan, - /client/proc/powerdebug, - /client/proc/count_objects_on_z_level, - /client/proc/count_objects_all, - /client/proc/cmd_assume_direct_control, - /client/proc/jump_to_dead_group, - /client/proc/startSinglo, - /client/proc/ticklag, - /client/proc/cmd_admin_grantfullaccess, - /client/proc/kaboom, - /client/proc/splash, - /client/proc/cmd_admin_areatest + debug_verbs ) /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs @@ -608,12 +593,14 @@ var/list/admin_verbs_mentor = list( var/datum/disease2/disease/D = new /datum/disease2/disease() - var/greater = ((input("Is this a lesser or greater disease?", "Give Disease") in list("Lesser", "Greater")) == "Greater") - - D.makerandom(greater) - if (!greater) - D.infectionchance = 1 + var/severity = 1 + var/greater = input("Is this a lesser, greater, or badmin disease?", "Give Disease") in list("Lesser", "Greater", "Badmin") + switch(greater) + if ("Lesser") severity = 1 + if ("Greater") severity = 2 + if ("Badmin") severity = 99 + D.makerandom(severity) D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num if(istype(T,/mob/living/carbon/human)) @@ -626,8 +613,8 @@ var/list/admin_verbs_mentor = list( infect_virus2(T,D,1) feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].") - message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].", 1) + log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") + message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) /client/proc/make_sound(var/obj/O in world) // -- TLE set category = "Special Verbs" @@ -706,6 +693,17 @@ var/list/admin_verbs_mentor = list( if(holder) src.holder.output_ai_laws() +/client/proc/rename_ai(mob/living/silicon/ai/AI in world) + set name = "Rename AI" + set category = "Admin" + + if(holder) + var/new_name = trim_strip_input(src, "Enter new AI name. Leave blank or as is to cancel.", "Enter new AI Name", AI.name) + if(new_name && new_name != AI.name) + admin_log_and_message_admins("has renamed the AI '[AI.name]' to '[new_name]'") + AI.SetName(new_name) + feedback_add_details("admin_verb","RAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + //---- bs12 verbs ---- diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 8a8ee1b50a..1d5e0f7b05 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -643,6 +643,12 @@ else jobs += "Dionaea" + if(jobban_isbanned(M, "Borer")) + jobs += "Borer" + else + jobs += "Borer" + + jobs += "" @@ -1974,7 +1980,7 @@ if(!ticker) alert("The game hasn't started yet!") return - var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN) + var/objective = sanitize(copytext(input("Enter an objective"),1,MAX_MESSAGE_LEN)) if(!objective) return feedback_inc("admin_secrets_fun_used",1) @@ -2393,6 +2399,16 @@ W.item_color = "schoolgirl" message_admins("[key_name_admin(usr)] activated Japanese Animes mode") world << sound('sound/AI/animes.ogg') + if("paintball") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","PB") + for(var/species in all_species) + var/datum/species/S = all_species[species] + S.blood_color = "rainbow" + for(var/obj/effect/decal/cleanable/blood/B in world) + B.basecolor = "rainbow" + B.update_icon() + message_admins("[key_name_admin(usr)] activated Paintball mode") if("eagles")//SCRAW feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","EgL") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 39a5fa778c..9e5260fbd6 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,18 +1,8 @@ -#define AHELP_ADMIN 1 -#define AHELP_MENTOR 2 -#define AHELP_DEV 3 //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as") -var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHELP_MENTOR,\ - "Admin - Rule/Gameplay issue" = AHELP_ADMIN,\ - "Dev - Bug report" = AHELP_DEV) - -/client/proc/adminhelp_admin(message) - adminhelp("Admin - Rule/Gameplay issue", message) - -/client/verb/adminhelp(selected_type in adminhelp_categories, msg as text) +/client/verb/adminhelp(msg as text) set category = "Admin" set name = "Adminhelp" @@ -27,18 +17,6 @@ var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHE adminhelped = 1 //Determines if they get the message to reply by clicking the name. - /**src.verbs -= /client/verb/adminhelp - - spawn(1200) - src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps - src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps//Go to hell - **/ - - if(!msg || alert("The following message will be sent to staff that administers\n the '[selected_type]' category:\n\n[msg]\n", "Admin Help", "Ok", "Cancel") == "Cancel") - return - - var/selected_upper = uppertext(selected_type) - if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return @@ -109,62 +87,12 @@ var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHE var/ai_cl if(ai_found) ai_cl = " (CL)" - var/mentor_msg = "\blue [selected_upper]: [get_options_bar(mob, 0, 0, 1, 0)][ai_cl]: [msg]" - var/dev_msg = "\blue [selected_upper]: [get_options_bar(mob, 3, 0, 1, 0)][ai_cl]: [msg]" - msg = "\blue [selected_upper]: [get_options_bar(mob, 2, 1, 1)][ai_cl]: [msg]" + var/mentor_msg = "\blue Request for Help: [get_options_bar(mob, 0, 0, 1, 0)][ai_cl]: [msg]" + msg = "\blue Request for Help:: [get_options_bar(mob, 2, 1, 1)][ai_cl]: [msg]" var/admin_number_afk = 0 - var/list/mentorholders = list() - var/list/debugholders = list() - var/list/adminholders = list() for(var/client/X in admins) - if(R_MENTOR & X.holder.rights && !(R_ADMIN & X.holder.rights)) // we don't want to count admins twice. This list should be JUST mentors - mentorholders += X - if(X.is_afk()) - admin_number_afk++ - if(R_DEBUG & X.holder.rights) // Looking for anyone with +Debug which will be admins, developers, and developer mentors - debugholders += X - if(!(R_ADMIN & X.holder.rights)) - if(X.is_afk()) - admin_number_afk++ - if(R_ADMIN | R_MOD & X.holder.rights) // just admins here please - adminholders += X - if(X.is_afk()) - admin_number_afk++ - - switch(adminhelp_categories[selected_type]) - if(AHELP_MENTOR) - if(mentorholders.len) - for(var/client/X in mentorholders) // Mentors get a message without buttons and no character name - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << mentor_msg - if(adminholders.len) - for(var/client/X in adminholders) // Admins get the full monty - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg - if(AHELP_ADMIN) - if(adminholders.len) - for(var/client/X in adminholders) // Admins of course get everything in their helps - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg - if(AHELP_DEV) - if(debugholders.len) - for(var/client/X in debugholders) - if(R_ADMIN | R_MOD & X.holder.rights) // Admins get every button & special highlights in theirs - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg - else - if (R_DEBUG & X.holder.rights) // Just devs or devmentors get non-highlighted names, but they do get JMP and VV for their bug reports. - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << dev_msg - - /*for(var/client/X in admins) if((R_ADMIN|R_MOD|R_MENTOR) & X.holder.rights) if(X.is_afk()) admin_number_afk++ @@ -173,20 +101,17 @@ var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHE if(X.holder.rights == R_MENTOR) X << mentor_msg // Mentors won't see coloring of names on people with special_roles (Antags, etc.) else - X << msg*/ + X << msg //show it to the person adminhelping too - src << "PM to-Staff ([selected_type]): [original_msg]" + src << "PM to-Staff : [original_msg]" var/admin_number_present = admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) - send2adminirc("[selected_upper] from [key_name(src)]: [html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") + send2adminirc("Request for Help from [key_name(src)]: [html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") else - send2adminirc("[selected_upper] from [key_name(src)]: [html_decode(original_msg)]") + send2adminirc("Request for Help from [key_name(src)]: [html_decode(original_msg)]") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return -#undef AHELP_ADMIN -#undef AHELP_MENTOR -#undef AHELP_DEV \ No newline at end of file diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 0b3f82aaa1..1c358c8cf4 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -96,7 +96,7 @@ if(sender) C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them else - adminhelp_admin(reply) //sender has left, adminhelp instead + adminhelp(reply) //sender has left, adminhelp instead return src << "" + create_text_tag("pm_out_alt", "PM", src) + " to [get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]: [msg]" C << "" + create_text_tag("pm_in", "", C) + " \[[recieve_pm_type] PM\] [get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]: [msg]" diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index acb194e792..e3aa767ecd 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -4,7 +4,7 @@ set hidden = 1 if(!check_rights(R_ADMIN)) return - msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)) if(!msg) return log_admin("[key_name(src)] : [msg]") @@ -23,7 +23,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return - msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)) log_admin("MOD: [key_name(src)] : [msg]") if (!msg) diff --git a/code/WorkInProgress/buildmode.dm b/code/modules/admin/verbs/buildmode.dm similarity index 100% rename from code/WorkInProgress/buildmode.dm rename to code/modules/admin/verbs/buildmode.dm diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 1e03dc1775..bb66843c16 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -25,11 +25,11 @@ if (src.holder.rights & R_MENTOR) stafftype = "MENTOR" - + if (src.holder.rights & R_ADMIN) stafftype = "ADMIN" - msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)) log_admin("[key_name(src)] : [msg]") if (!msg) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 0f088f9897..71d50c1e8b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -736,8 +736,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_syndicate_commando() if("nanotrasen representative") - M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/representative(M), slot_w_uniform) - M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes) + M.equip_if_possible(new /obj/item/clothing/under/rank/centcom(M), slot_w_uniform) + M.equip_if_possible(new /obj/item/clothing/shoes/laceup(M), slot_shoes) M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves) M.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(M), slot_l_ear) @@ -761,8 +761,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(W, slot_wear_id) if("nanotrasen officer") - M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform) - M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes) + M.equip_if_possible(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) + M.equip_if_possible(new /obj/item/clothing/shoes/laceup(M), slot_shoes) M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves) M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) @@ -786,8 +786,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if("nanotrasen captain") - M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) - M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes) + M.equip_if_possible(new /obj/item/clothing/under/rank/centcom_captain(M), slot_w_uniform) + M.equip_if_possible(new /obj/item/clothing/shoes/laceup(M), slot_shoes) M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves) M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 48681c93a3..6e79bbbc3f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -6,7 +6,7 @@ usr << "\red Speech is currently admin-disabled." return - msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)) if(!msg) return if(usr.client) @@ -29,14 +29,14 @@ //log_admin("HELP: [key_name(src)]: [msg]") /proc/Centcomm_announce(var/text , var/mob/Sender , var/iamessage) - var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) + var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg /proc/Syndicate_announce(var/text , var/mob/Sender) - var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) + var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index b107182333..36199c0305 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -19,7 +19,7 @@ var/global/sent_strike_team = 0 var/input = null while(!input) - input = copytext(sanitize(input(src, "Please specify which mission the death commando squad shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN) + input = sanitize(copytext(input(src, "Please specify which mission the death commando squad shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) if(!input) if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes") return diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 39059ba4f6..6a16f22d1f 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -24,7 +24,7 @@ var/global/sent_syndicate_strike_team = 0 var/input = null while(!input) - input = copytext(sanitize(input(src, "Please specify which mission the strike team shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN) + input = sanitize(copytext(input(src, "Please specify which mission the strike team shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) if(!input) if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes") return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index b48651e8b7..ca4717307a 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -3,7 +3,7 @@ desc = "A small electronic device that should never exist." icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT w_class = 2.0 matter = list("metal" = 100) throwforce = 2 diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index cb0a90c454..ed3edf5fc0 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -6,7 +6,7 @@ w_class = 3.0 throw_speed = 2 throw_range = 4 - flags = FPRINT | TABLEPASS| CONDUCT //Copied this from old code, so this may or may not be necessary + flags = CONDUCT //Copied this from old code, so this may or may not be necessary var/status = 0 //0 - not readied //1 - bomb finished with welder var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device var/obj/item/weapon/tank/bombtank = null //the second part of the bomb is a phoron tank diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 82f7450981..f3bf44b53b 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "holder" item_state = "assembly" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT throwforce = 5 w_class = 2.0 throw_speed = 3 diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 3a70e85399..89699b3427 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -168,7 +168,6 @@ var/visible = 0.0 var/left = null anchored = 1.0 - flags = TABLEPASS /obj/effect/beam/i_beam/proc/hit() diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 880424e66b..4cbef90875 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -6,7 +6,7 @@ var/obj/item/device/radio/electropack/part2 = null var/status = 0 w_class = 5.0 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/assembly/shock_kit/Del() del(part1) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 0be6799a43..781dd8c44f 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -219,7 +219,7 @@ /obj/effect/landmark/corpse/commander name = "Commander" - corpseuniform = /obj/item/clothing/under/rank/centcom_commander + corpseuniform = /obj/item/clothing/under/rank/centcom_captain corpsesuit = /obj/item/clothing/suit/armor/bulletproof corpseradio = /obj/item/device/radio/headset/heads/captain corpseglasses = /obj/item/clothing/glasses/eyepatch diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 3e8c8e3a3c..ac83f318d2 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -288,6 +288,12 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 3 +/datum/gear/blackjumpskirt + display_name = "jumpskirt, black" + path = /obj/item/clothing/under/blackjumpskirt + slot = slot_w_uniform + cost = 2 + /datum/gear/skirt_blue display_name = "plaid skirt, blue" path = /obj/item/clothing/under/dress/plaid_blue @@ -492,6 +498,12 @@ var/global/list/gear_datums = list() cost = 3 slot = slot_wear_suit +/datum/gear/blue_lawyer_jacket + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket + cost = 3 + slot = slot_wear_suit + /datum/gear/hoodie display_name = "hoodie, grey" path = /obj/item/clothing/suit/hoodie @@ -517,7 +529,7 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_wear_suit -/datum/gear/gponcho +/datum/gear/bponcho display_name = "poncho, blue" path = /obj/item/clothing/suit/poncho/blue cost = 3 @@ -529,7 +541,7 @@ var/global/list/gear_datums = list() cost = 3 slot = slot_wear_suit -/datum/gear/rponcho +/datum/gear/pponcho display_name = "poncho, purple" path = /obj/item/clothing/suit/poncho/purple cost = 3 @@ -657,7 +669,7 @@ var/global/list/gear_datums = list() /datum/gear/dress_shoes display_name = "shoes, dress" - path = /obj/item/clothing/shoes/centcom + path = /obj/item/clothing/shoes/laceup cost = 1 slot = slot_shoes diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 38b60890c0..f6dc6cc337 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -44,6 +44,9 @@ return 1 /obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + //Set species_restricted list switch(target_species) if("Human", "Skrell") //humanoid bodytypes @@ -63,6 +66,9 @@ icon = initial(icon) /obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + //Set species_restricted list switch(target_species) if("Skrell") @@ -225,7 +231,7 @@ BLIND // can't see anything user.visible_message("\red [user] cuts the fingertips off of the [src].","\red You cut the fingertips off of the [src].") clipped = 1 - name = "mangled [name]" + name = "modified [name]" desc = "[desc]
    They have had the fingertips cut off of them." if("exclude" in species_restricted) species_restricted -= "Unathi" @@ -365,7 +371,6 @@ BLIND // can't see anything icon = 'icons/obj/clothing/suits.dmi' name = "suit" var/fire_resist = T0C+100 - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS allowed = list(/obj/item/weapon/tank/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) @@ -386,7 +391,6 @@ BLIND // can't see anything name = "under" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS permeability_coefficient = 0.90 - flags = FPRINT | TABLEPASS slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) w_class = 3 @@ -399,8 +403,6 @@ BLIND // can't see anything */ var/obj/item/clothing/tie/hastie = null var/displays_id = 1 - var/rolled_down = 0 - var/basecolor sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') /obj/item/clothing/under/update_clothing_icon() @@ -526,11 +528,14 @@ BLIND // can't see anything if(!istype(usr, /mob/living)) return if(usr.stat) return - if(copytext(item_color,-2) != "_d") - basecolor = item_color - if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi')) - body_parts_covered = "[basecolor]" ? LEGS|LOWER_TORSO : UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" + if(initial(item_color) + "_d_s" in icon_states('icons/mob/uniform.dmi')) + if (item_color == initial(item_color)) + body_parts_covered &= LOWER_TORSO|LEGS|FEET + item_color = "[initial(item_color)]_d" + else + body_parts_covered = initial(body_parts_covered) + item_color = initial(item_color) + update_clothing_icon() else usr << "You cannot roll down the uniform!" diff --git a/code/modules/clothing/ears/skrell.dm b/code/modules/clothing/ears/skrell.dm index 986f5a02ec..a92722db5e 100644 --- a/code/modules/clothing/ears/skrell.dm +++ b/code/modules/clothing/ears/skrell.dm @@ -7,7 +7,7 @@ desc = "Some stuff worn by skrell to adorn their head tentacles." icon = 'icons/obj/clothing/ears.dmi' w_class = 1 - slot_flags = SLOT_EARS | SLOT_TWOEARS + slot_flags = SLOT_EARS species_restricted = list("Skrell") /obj/item/clothing/ears/skrell/chain diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm deleted file mode 100644 index 976b16e7e6..0000000000 --- a/code/modules/clothing/gloves/stungloves.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(istype(src, /obj/item/clothing/gloves/boxing)) //quick fix for stunglove overlay not working nicely with boxing gloves. - user << "That won't work." //i'm not putting my lips on that! - ..() - return - - //add wires - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if (clipped) - user << "The [src] are too badly mangled for wiring." - return - - if(wired) - user << "The [src] are already wired." - return - - if(C.get_amount() < 2) - user << "There is not enough wire to cover the [src]." - return - - C.use(2) - wired = 1 - siemens_coefficient = 3.0 - user << "You wrap some wires around the [src]." - update_icon() - return - - //add cell - else if(istype(W, /obj/item/weapon/cell)) - if(!wired) - user << "The [src] need to be wired first." - else if(!cell) - user.drop_item() - W.loc = src - cell = W - user << "You attach the [cell] to the [src]." - update_icon() - else - user << "A [cell] is already attached to the [src]." - return - - else if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) - - //stunglove stuff - if(cell) - cell.updateicon() - user << "You cut the [cell] away from the [src]." - cell.loc = get_turf(src.loc) - cell = null - update_icon() - return - if(wired) //wires disappear into the void because fuck that shit - wired = 0 - siemens_coefficient = initial(siemens_coefficient) - user << "You cut the wires away from the [src]." - update_icon() - return - - //clipping fingertips - if(!clipped) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("\red [user] cuts the fingertips off of the [src].","\red You cut the fingertips off of the [src].") - - clipped = 1 - name = "mangled [name]" - desc = "[desc]
    They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= "Unathi" - species_restricted -= "Tajara" - return - else - user << "The [src] have already been clipped!" - update_icon() - return - - return - - ..() - -/obj/item/clothing/gloves/update_icon() - ..() - overlays.Cut() - if(wired) - overlays += "gloves_wire" - if(cell) - overlays += "gloves_cell" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 3fc78b871a..2034aad363 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -2,7 +2,6 @@ name = "hard hat" desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." icon_state = "hardhat0_yellow" - flags = FPRINT | TABLEPASS item_state = "hardhat0_yellow" brightness_on = 4 //luminosity when on light_overlay = "hardhat_light" @@ -21,7 +20,7 @@ item_state = "hardhat0_red" item_color = "red" name = "firefighter helmet" - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE @@ -29,7 +28,7 @@ icon_state = "hardhat0_white" item_state = "hardhat0_white" item_color = "white" - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 1556b01ddc..eec6c828d8 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -2,7 +2,7 @@ name = "helmet" desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | THICKMATERIAL + flags = HEADCOVERSEYES | THICKMATERIAL item_state = "helmet" armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEEARS|HIDEEYES @@ -39,7 +39,7 @@ desc = "It's a helmet specifically designed to protect against close range attacks." icon_state = "riot" item_state = "helmet" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES + flags = HEADCOVERSEYES armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) flags_inv = HIDEEARS siemens_coefficient = 0.7 @@ -48,7 +48,7 @@ name = "\improper SWAT helmet" desc = "They're often used by highly trained Swat Members." icon_state = "swat" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES + flags = HEADCOVERSEYES item_state = "swat" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags_inv = HIDEEARS|HIDEEYES @@ -60,7 +60,7 @@ name = "\improper Thunderdome helmet" desc = "'Let the battle commence!'" icon_state = "thunderdome" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES + flags = HEADCOVERSEYES item_state = "thunderdome" armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0) cold_protection = HEAD @@ -71,7 +71,7 @@ name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." icon_state = "gladiator" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR item_state = "gladiator" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES siemens_coefficient = 1 @@ -81,7 +81,7 @@ desc = "An armored helmet capable of being fitted with a multitude of attachments." icon_state = "swathelm" item_state = "helmet" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES + flags = HEADCOVERSEYES sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', @@ -95,7 +95,7 @@ name = "Augment Array" desc = "A helmet with optical and cranial augments coupled to it." icon_state = "v62" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES + flags = HEADCOVERSEYES item_state = "v62" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags_inv = HIDEEARS|HIDEEYES diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 36fa4823e4..ae2873e8f4 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -6,7 +6,6 @@ icon_state = "chefhat" item_state = "chefhat" desc = "The commander in chef's head wear." - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 //Captain: This probably shouldn't be space-worthy @@ -14,7 +13,6 @@ name = "captain's hat" icon_state = "captain" desc = "It's good being the king." - flags = FPRINT|TABLEPASS item_state = "caphat" siemens_coefficient = 0.9 @@ -23,7 +21,6 @@ name = "captain's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" - flags = FPRINT|TABLEPASS flags_inv = 0 body_parts_covered = 0 cold_protection = HEAD @@ -36,7 +33,7 @@ name = "chaplain's hood" desc = "It's hood that covers the head. It keeps you warm during the space winters." icon_state = "chaplain_hood" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR siemens_coefficient = 0.9 body_parts_covered = HEAD|EYES @@ -45,7 +42,7 @@ name = "nun hood" desc = "Maximum piety in this star system." icon_state = "nun_hood" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR siemens_coefficient = 0.9 //Mime @@ -53,7 +50,6 @@ name = "beret" desc = "A beret, an artists favorite headwear." icon_state = "beret" - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 body_parts_covered = 0 @@ -62,40 +58,41 @@ name = "security beret" desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety." icon_state = "beret_badge" - flags = FPRINT | TABLEPASS /obj/item/clothing/head/beret/sec/alt name = "officer beret" desc = "A navy blue beret with an officer's rank emblem. For officers that are more inclined towards style than safety." icon_state = "officerberet" - flags = FPRINT | TABLEPASS /obj/item/clothing/head/beret/sec/hos name = "officer beret" desc = "A navy blue beret with a commander's rank emblem. For officers that are more inclined towards style than safety." icon_state = "hosberet" - flags = FPRINT | TABLEPASS /obj/item/clothing/head/beret/sec/warden name = "warden beret" desc = "A navy blue beret with a warden's rank emblem. For officers that are more inclined towards style than safety." icon_state = "wardenberet" - flags = FPRINT | TABLEPASS /obj/item/clothing/head/beret/eng name = "engineering beret" desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety." icon_state = "e_beret_badge" - flags = FPRINT | TABLEPASS /obj/item/clothing/head/beret/jan name = "purple beret" desc = "A stylish, if purple, beret." icon_state = "purpleberet" - flags = FPRINT | TABLEPASS - +/obj/item/clothing/head/beret/centcom/officer + name = "officers beret" + desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the NanoTrasen security forces." + icon_state = "centcomofficerberet" +/obj/item/clothing/head/beret/centcom/captain + name = "captains beret" + desc = "A white beret adorned with the shield—a silver kite shield with an engraved sword—of the NanoTrasen security forces." + icon_state = "centcomcaptain" //Medical /obj/item/clothing/head/surgery name = "surgical cap" desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs." icon_state = "surgcap_blue" - flags = FPRINT | TABLEPASS | BLOCKHEADHAIR + flags = BLOCKHEADHAIR /obj/item/clothing/head/surgery/purple desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple." diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 991d01a216..7b13c10b4b 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -4,7 +4,6 @@ name = "\improper CentComm. hat" icon_state = "centcom" desc = "It's good to be emperor." - flags = FPRINT|TABLEPASS item_state = "centhat" siemens_coefficient = 0.9 body_parts_covered = 0 @@ -14,7 +13,6 @@ icon_state = "hairflower" desc = "Smells nice." item_state = "hairflower" - flags = FPRINT|TABLEPASS slot_flags = SLOT_HEAD | SLOT_EARS body_parts_covered = 0 @@ -29,7 +27,6 @@ desc = "It's an amish looking hat." icon_state = "tophat" item_state = "that" - flags = FPRINT|TABLEPASS siemens_coefficient = 0.9 body_parts_covered = 0 @@ -37,21 +34,18 @@ name = "redcoat's hat" icon_state = "redcoat" desc = "'I guess it's a redhead.'" - flags = FPRINT | TABLEPASS body_parts_covered = 0 /obj/item/clothing/head/mailman name = "station cap" icon_state = "mailman" desc = "Choo-choo!" - flags = FPRINT | TABLEPASS body_parts_covered = 0 /obj/item/clothing/head/plaguedoctorhat name = "plague doctor's hat" desc = "These were once used by Plague doctors. They're pretty much useless." icon_state = "plaguedoctor" - flags = FPRINT | TABLEPASS permeability_coefficient = 0.01 siemens_coefficient = 0.9 body_parts_covered = 0 @@ -60,14 +54,13 @@ name = "hastur's hood" desc = "It's unspeakably stylish" icon_state = "hasturhood" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/nursehat name = "nurse's hat" desc = "It allows quick identification of trained medical personnel." icon_state = "nursehat" - flags = FPRINT|TABLEPASS siemens_coefficient = 0.9 body_parts_covered = 0 @@ -76,7 +69,7 @@ icon_state = "syndicate" item_state = "syndicate" desc = "A plastic replica of a bloodthirsty mercenary's space helmet, you'll look just like a real murderous criminal operative in this! This is a toy, it is not made for use in space!" - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE siemens_coefficient = 2.0 body_parts_covered = HEAD|FACE|EYES @@ -85,7 +78,7 @@ name = "cueball helmet" desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR item_state="cueball" flags_inv = 0 body_parts_covered = HEAD|FACE|EYES @@ -95,7 +88,6 @@ desc = "It's a green bandana with some fine nanotech lining." icon_state = "greenbandana" item_state = "greenbandana" - flags = FPRINT|TABLEPASS flags_inv = 0 body_parts_covered = 0 @@ -104,7 +96,7 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH + flags = HEADCOVERSEYES | HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = HEAD|FACE|EYES @@ -113,7 +105,7 @@ desc = "fight for what's righteous!" icon_state = "justicered" item_state = "justicered" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR /obj/item/clothing/head/justice/blue icon_state = "justiceblue" @@ -135,7 +127,6 @@ name = "rabbit ears" desc = "Wearing these makes you looks useless, and only good for your sex appeal." icon_state = "bunny" - flags = FPRINT | TABLEPASS body_parts_covered = 0 /obj/item/clothing/head/flatcap @@ -170,7 +161,6 @@ desc = "Gentleman, elite aboard!" icon_state = "bowler" item_state = "bowler" - flags = FPRINT | TABLEPASS body_parts_covered = 0 //stylish bs12 hats @@ -180,7 +170,6 @@ icon_state = "bowler_hat" item_state = "bowler_hat" desc = "For the gentleman of distinction." - flags = FPRINT|TABLEPASS body_parts_covered = 0 /obj/item/clothing/head/beaverhat @@ -188,35 +177,30 @@ icon_state = "beaver_hat" item_state = "beaver_hat" desc = "Soft felt makes this hat both comfortable and elegant." - flags = FPRINT|TABLEPASS /obj/item/clothing/head/boaterhat name = "boater hat" icon_state = "boater_hat" item_state = "boater_hat" desc = "The ultimate in summer fashion." - flags = FPRINT|TABLEPASS /obj/item/clothing/head/fedora name = "\improper fedora" icon_state = "fedora" item_state = "fedora" desc = "A sharp, stylish hat." - flags = FPRINT|TABLEPASS /obj/item/clothing/head/feathertrilby name = "\improper feather trilby" icon_state = "feather_trilby" item_state = "feather_trilby" desc = "A sharp, stylish hat with a feather." - flags = FPRINT|TABLEPASS /obj/item/clothing/head/fez name = "\improper fez" icon_state = "fez" item_state = "fez" desc = "You should wear a fez. Fezzes are cool." - flags = FPRINT|TABLEPASS //end bs12 hats @@ -225,7 +209,7 @@ desc = "Eeeee~heheheheheheh!" icon_state = "witch" item_state = "witch" - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR siemens_coefficient = 2.0 /obj/item/clothing/head/chicken @@ -233,7 +217,7 @@ desc = "Bkaw!" icon_state = "chickenhead" item_state = "chickensuit" - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR siemens_coefficient = 0.7 body_parts_covered = HEAD|FACE|EYES @@ -242,7 +226,7 @@ desc = "Fuzzy." icon_state = "bearpelt" item_state = "bearpelt" - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR siemens_coefficient = 0.7 /obj/item/clothing/head/xenos @@ -250,7 +234,7 @@ icon_state = "xenos" item_state = "xenos_helm" desc = "A helmet made out of chitinous alien hide." - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE siemens_coefficient = 2.0 body_parts_covered = HEAD|FACE|EYES @@ -260,7 +244,7 @@ desc = "A stylish monstrosity unearthed from Earth's Renaissance period. With this most distinguish'd wig, you'll be ready for your next soiree!" icon_state = "philosopher_wig" item_state = "philosopher_wig" - flags = FPRINT | TABLEPASS | BLOCKHAIR + flags = BLOCKHAIR siemens_coefficient = 2.0 //why is it so conductive?! body_parts_covered = 0 diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ba72b92754..5eb7e0c65b 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -15,7 +15,7 @@ name = "welding helmet" desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye." icon_state = "welding" - flags = (FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH) + flags = HEADCOVERSEYES | HEADCOVERSMOUTH item_state = "welding" matter = list("metal" = 3000, "glass" = 1000) var/up = 0 @@ -58,7 +58,7 @@ name = "cake-hat" desc = "It's tasty looking!" icon_state = "cake0" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES + flags = HEADCOVERSEYES var/onfire = 0.0 var/status = 0 var/fire_resist = T0C+1300 //this is the max temp it can stand before you start to cook. although it might not burn away, you take damage @@ -123,7 +123,7 @@ icon_state = "hardhat0_pumpkin"//Could stand to be renamed item_state = "hardhat0_pumpkin" item_color = "pumpkin" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = HEAD|EYES brightness_on = 2 @@ -137,7 +137,6 @@ name = "kitty ears" desc = "A pair of kitty ears. Meow!" icon_state = "kitty" - flags = FPRINT | TABLEPASS body_parts_covered = 0 var/icon/mob var/icon/mob2 @@ -153,4 +152,11 @@ var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") mob.Blend(earbit, ICON_OVERLAY) - mob2.Blend(earbit2, ICON_OVERLAY) \ No newline at end of file + mob2.Blend(earbit2, ICON_OVERLAY) + +/obj/item/clothing/head/richard + name = "chicken mask" + desc = "You can hear the distant sounds of rhythmic electronica." + icon_state = "richard" + body_parts_covered = HEAD|FACE + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index dcf2eb1e48..1deff69402 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -2,7 +2,7 @@ name = "cargo cap" desc = "It's a baseball hat in a tasteless yellow color." icon_state = "cargosoft" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES + flags = HEADCOVERSEYES item_state = "helmet" item_color = "cargo" var/flipped = 0 diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index eeaf55c557..dfa7e120f7 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -3,7 +3,7 @@ desc = "LOADSAMONEY" icon_state = "balaclava" item_state = "balaclava" - flags = FPRINT|TABLEPASS|BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEFACE body_parts_covered = FACE w_class = 2 @@ -17,7 +17,7 @@ desc = "Designed to both hide identities and keep your face comfy and warm." icon_state = "swatclava" item_state = "balaclava" - flags = FPRINT|TABLEPASS|BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEFACE w_class = 2 sprite_sheets = list( @@ -30,7 +30,7 @@ desc = "Worn by robust fighters, flying high to defeat their foes!" icon_state = "luchag" item_state = "luchag" - flags = FPRINT|TABLEPASS|BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEFACE body_parts_covered = HEAD|FACE w_class = 2 diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 2780ff4be5..a2ed54b1d4 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -3,7 +3,7 @@ name = "breath mask" icon_state = "breath" item_state = "breath" - flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | AIRTIGHT + flags = MASKCOVERSMOUTH | AIRTIGHT body_parts_covered = 0 w_class = 2 gas_transfer_coefficient = 0.10 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index d7a20b73d0..1982409d6f 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -2,7 +2,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. Filters harmful gases from the air." icon_state = "gas_alt" - flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT + flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = FACE|EYES w_class = 3.0 @@ -12,6 +12,7 @@ siemens_coefficient = 0.9 var/gas_filter_strength = 1 //For gas mask filters var/list/filtered_gases = list("phoron", "sleeping_agent") + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 75, rad = 0) /obj/item/clothing/mask/gas/filter_air(datum/gas_mixture/air) var/datum/gas_mixture/filtered = new @@ -32,7 +33,7 @@ desc = "A modernised version of the classic design, this mask will not only filter out phoron but it can also be connected to an air supply." icon_state = "plaguedoctor" item_state = "gas_mask" - armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 90, rad = 0) body_parts_covered = HEAD|FACE /obj/item/clothing/mask/gas/swat diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 3f3094c794..412f69bda6 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -3,7 +3,7 @@ desc = "To stop that awful noise." icon_state = "muzzle" item_state = "muzzle" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH body_parts_covered = 0 w_class = 2 gas_transfer_coefficient = 0.90 @@ -20,17 +20,16 @@ icon_state = "sterile" item_state = "sterile" w_class = 2 - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH body_parts_covered = 0 gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 0) /obj/item/clothing/mask/fakemoustache name = "fake moustache" desc = "Warning: moustache is fake." icon_state = "fake-moustache" - flags = FPRINT|TABLEPASS flags_inv = HIDEFACE body_parts_covered = 0 @@ -38,7 +37,6 @@ name = "Snorkel" desc = "For the Swimming Savant." icon_state = "snorkel" - flags = FPRINT|TABLEPASS flags_inv = HIDEFACE body_parts_covered = 0 @@ -49,7 +47,7 @@ desc = "A blue neck scarf." icon_state = "blueneckscarf" item_state = "blueneckscarf" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH w_class = 2 gas_transfer_coefficient = 0.90 @@ -58,7 +56,7 @@ desc = "A red and white checkered neck scarf." icon_state = "redwhite_scarf" item_state = "redwhite_scarf" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH w_class = 2 gas_transfer_coefficient = 0.90 @@ -67,7 +65,7 @@ desc = "A green neck scarf." icon_state = "green_scarf" item_state = "green_scarf" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH w_class = 2 gas_transfer_coefficient = 0.90 @@ -76,7 +74,7 @@ desc = "A stealthy, dark scarf." icon_state = "ninja_scarf" item_state = "ninja_scarf" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH w_class = 2 gas_transfer_coefficient = 0.90 siemens_coefficient = 0 @@ -86,7 +84,7 @@ desc = "A rubber pig mask." icon_state = "pig" item_state = "pig" - flags = FPRINT|TABLEPASS|BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEFACE w_class = 2 siemens_coefficient = 0.9 @@ -97,7 +95,7 @@ desc = "A mask made of soft vinyl and latex, representing the head of a horse." icon_state = "horsehead" item_state = "horsehead" - flags = FPRINT|TABLEPASS|BLOCKHAIR + flags = BLOCKHAIR flags_inv = HIDEFACE body_parts_covered = HEAD|FACE|EYES w_class = 2 diff --git a/code/modules/clothing/spacesuits/captain.dm b/code/modules/clothing/spacesuits/captain.dm index 81d4ef028c..5ca604b2c0 100644 --- a/code/modules/clothing/spacesuits/captain.dm +++ b/code/modules/clothing/spacesuits/captain.dm @@ -4,7 +4,7 @@ icon_state = "capspace" item_state = "capspacehelmet" desc = "A special helmet designed for work in a hazardous, low-pressure environment. Only for the most fashionable of military figureheads." - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE + flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE flags_inv = HIDEFACE permeability_coefficient = 0.01 armor = list(melee = 65, bullet = 50, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 50) @@ -18,7 +18,7 @@ w_class = 4 gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) slowdown = 1.5 diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index cc6cbd622b..e22a6044ce 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -17,7 +17,7 @@ w_class = 4 gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) slowdown = 1.5 @@ -34,7 +34,7 @@ icon_state = "deathsquad" item_state = "deathsquad" armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 100, rad = 60) - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL siemens_coefficient = 0.6 /obj/item/clothing/head/helmet/space/deathsquad/beret @@ -42,7 +42,7 @@ desc = "An armored beret commonly used by special operations officers." icon_state = "beret_badge" armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30) - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE + flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE siemens_coefficient = 0.9 //Space santa outfit suit @@ -50,7 +50,7 @@ name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon_state = "santahat" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE + flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE body_parts_covered = HEAD /obj/item/clothing/suit/space/santa @@ -59,7 +59,7 @@ icon_state = "santa" item_state = "santa" slowdown = 0 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL | STOPSPRESSUREDMAGE + flags = ONESIZEFITSALL | STOPSPRESSUREDMAGE allowed = list(/obj/item) //for stuffing exta special presents @@ -70,7 +70,7 @@ icon_state = "pirate" item_state = "pirate" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE + flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE body_parts_covered = 0 siemens_coefficient = 0.9 diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index f8457375cc..605bff6be8 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -111,6 +111,16 @@ gun.Fire(target,holder.wearer) return 1 +/obj/item/rig_module/mounted/egun + + name = "mounted energy gun" + desc = "A forearm-mounted energy projector." + + interface_name = "mounted energy gun" + interface_desc = "A forearm-mounted suit-powered energy gun." + + gun_type = /obj/item/weapon/gun/energy/gun/mounted + /obj/item/rig_module/mounted/taser name = "mounted taser" @@ -124,7 +134,7 @@ interface_name = "mounted energy gun" interface_desc = "A shoulder-mounted cell-powered energy gun." - gun_type = /obj/item/weapon/gun/energy/gun/mounted + gun_type = /obj/item/weapon/gun/energy/taser/mounted /obj/item/rig_module/mounted/energy_blade diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 1b2befa59a..3d66c64602 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -334,6 +334,7 @@ var/atom/interfaced_with // Currently draining power from this device. var/total_power_drained = 0 + var/drain_loc /obj/item/rig_module/power_sink/deactivate() @@ -373,6 +374,7 @@ H << "You begin draining power from [target]!" interfaced_with = target + drain_loc = interfaced_with.loc holder.spark_system.start() playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) @@ -406,7 +408,7 @@ drain_complete(H) return - if(!interfaced_with || !interfaced_with.Adjacent(H)) + if(!interfaced_with || !interfaced_with.Adjacent(H) || !(interfaced_with.loc == drain_loc)) H << "Your power sink retracts into its casing." drain_complete(H) return @@ -427,8 +429,6 @@ holder.cell.give(target_drained * CELLRATE) total_power_drained += target_drained - - return 1 /obj/item/rig_module/power_sink/proc/drain_complete(var/mob/living/M) @@ -439,5 +439,6 @@ if(M) M << "Total power drained from [interfaced_with]: [round(total_power_drained/1000)]kJ." interfaced_with.drain_power(0,1,0) // Damage the victim. + drain_loc = null interfaced_with = null total_power_drained = 0 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index b0ba99016e..830e0d784c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -147,6 +147,14 @@ usr << "The suit is not initialized." return 0 + if(usr.lying || usr.stat || usr.stunned || usr.paralysis) + usr << "You cannot use the suit in this state." + return 0 + + if(holder.wearer && holder.wearer.lying) + usr << "The suit cannot function while the wearer is prone." + return 0 + if(holder.security_check_enabled && !holder.check_suit_access(usr)) usr << "Access denied." return diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 12ea8e7fb2..6d572cdcb3 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -19,6 +19,7 @@ use_power_cost = 5 active_power_cost = 1 passive_power_cost = 0 + module_cooldown = 30 activate_string = "Enable Cloak" deactivate_string = "Disable Cloak" diff --git a/code/modules/clothing/spacesuits/rig/modules/rig_weapons.dm b/code/modules/clothing/spacesuits/rig/modules/rig_weapons.dm new file mode 100644 index 0000000000..d8373e8bbe --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/rig_weapons.dm @@ -0,0 +1,51 @@ +//Weapon types intended to be used with rig modules + +/obj/item/weapon/gun/energy/lasercannon/mounted/load_into_chamber() + if(in_chamber) + return 1 + var/obj/item/rig_module/module = loc + if(!istype(module)) + return 0 + if(module.holder && module.holder.wearer) + var/mob/living/carbon/human/H = module.holder.wearer + if(istype(H) && H.back) + var/obj/item/weapon/rig/suit = H.back + if(istype(suit) && suit.cell && suit.cell.charge >= 250) + suit.cell.use(250) + in_chamber = new /obj/item/projectile/beam/heavylaser(src) + return 1 + return 0 + +/obj/item/weapon/gun/energy/gun/mounted/load_into_chamber() + if(in_chamber) + return 1 + var/obj/item/rig_module/module = loc + if(!istype(module)) + return 0 + if(module.holder && module.holder.wearer) + var/mob/living/carbon/human/H = module.holder.wearer + if(istype(H) && H.back) + var/obj/item/weapon/rig/suit = H.back + if(istype(suit) && suit.cell && suit.cell.charge >= 250) + suit.cell.use(250) + var/prog_path = text2path(projectile_type) + in_chamber = new prog_path(src) + return 1 + return 0 + +/obj/item/weapon/gun/energy/taser/mounted/load_into_chamber() + if(in_chamber) + return 1 + var/obj/item/rig_module/module = loc + if(!istype(module)) + return 0 + if(module.holder && module.holder.wearer) + var/mob/living/carbon/human/H = module.holder.wearer + if(istype(H) && H.back) + var/obj/item/weapon/rig/suit = H.back + if(istype(suit) && suit.cell && suit.cell.charge >= 250) + suit.cell.use(250) + var/prog_path = text2path(projectile_type) + in_chamber = new prog_path(src) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index ca17213bbb..4c7735974c 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -138,7 +138,7 @@ piece.name = "[suit_type] [initial(piece.name)]" piece.desc = "It seems to be part of a [src.name]." piece.icon_state = "[initial(icon_state)]" - piece.armor = armor + piece.armor = armor.Copy() piece.min_cold_protection_temperature = min_cold_protection_temperature piece.max_heat_protection_temperature = max_heat_protection_temperature piece.siemens_coefficient = siemens_coefficient @@ -169,6 +169,16 @@ return 0 return 1 +/obj/item/weapon/rig/proc/reset() + offline = 2 + canremove = 1 + for(var/obj/item/piece in list(helmet,boots,gloves,chest)) + if(!piece) continue + piece.icon_state = "[initial(icon_state)]" + piece.flags &= ~STOPSPRESSUREDMAGE + piece.flags &= ~AIRTIGHT + update_icon(1) + /obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant) if(sealing) return @@ -217,7 +227,7 @@ if(!failed_to_seal && M.back == src && piece == compare_piece) if(!instant) - if(!do_after(M,SEAL_DELAY)) + if(!do_after(M,SEAL_DELAY,needhand=0)) failed_to_seal = 1 piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" @@ -241,6 +251,13 @@ else helmet.flags &= ~AIRTIGHT helmet.update_light(wearer) + + //sealed pieces become airtight, protecting against diseases + if (!seal_target) + piece.armor["bio"] = 100 + else + piece.armor["bio"] = src.armor["bio"] + else failed_to_seal = 1 @@ -281,10 +298,6 @@ piece.flags |= AIRTIGHT update_icon(1) - if(instant && air_supply) - wearer.internals = air_supply - wearer.internals.icon_state = "internal1" - /obj/item/weapon/rig/process() // If we've lost any parts, grab them back. @@ -502,6 +515,8 @@ return if(href_list["toggle_piece"]) + if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying)) + return 0 toggle_piece(href_list["toggle_piece"], usr) else if(href_list["toggle_seals"]) toggle_seals(usr) @@ -530,7 +545,7 @@ usr.set_machine(src) src.add_fingerprint(usr) - return + return 1 /obj/item/weapon/rig/proc/notify_ai(var/message) if(!message || !installed_modules || !installed_modules.len) @@ -566,6 +581,9 @@ if(!istype(wearer) || !wearer.back == src) return + if(usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the usr isn't wearing the suit it's probably an AI. + return + var/obj/item/check_slot var/equip_to var/obj/item/use_obj diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 061973c137..c0d119b0b4 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -180,7 +180,7 @@ installed_modules -= removed update_icon() - return + return // If we've gotten this far, all we have left to do before we pass off to root procs // is check if any of the loaded modules want to use the item we've been given. diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 314af42e07..de18d5e020 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -4,7 +4,7 @@ /obj/item/clothing/head/helmet/space/rig name = "helmet" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL flags_inv = HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = HEAD|FACE|EYES heat_protection = HEAD|FACE|EYES @@ -14,7 +14,7 @@ /obj/item/clothing/gloves/rig name = "gauntlets" - flags = FPRINT | TABLEPASS | THICKMATERIAL + flags = THICKMATERIAL body_parts_covered = HANDS heat_protection = HANDS cold_protection = HANDS @@ -36,7 +36,7 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT|HIDETAIL - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT + flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT slowdown = 0 breach_threshold = 35 can_breach = 1 diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index 9ec6f03df7..ce20244734 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -120,8 +120,8 @@ /obj/item/weapon/rig/verb/toggle_seals_verb() - set name = "Toggle Seals" - set desc = "Activates or deactivates your rig seals." + set name = "Toggle Hardsuit" + set desc = "Activates or deactivates your rig." set category = "Hardsuit" set src = usr.contents @@ -208,6 +208,8 @@ var/obj/item/rig_module/module = input("Which module do you wish to select?") as null|anything in selectable if(!istype(module)) + selected_module = null + usr << "Primary system is now: deselected." return selected_module = module diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 4935d793cf..d3db4baf84 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -23,7 +23,6 @@ /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/datajack, - /obj/item/rig_module/mounted ) /obj/item/weapon/rig/ert/engineer @@ -62,5 +61,5 @@ /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/grenade_launcher, - /obj/item/rig_module/mounted + /obj/item/rig_module/mounted/egun, ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 3568a4b64d..c20371071b 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -7,7 +7,7 @@ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell) armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) slowdown = 0 - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL + flags = STOPSPRESSUREDMAGE | THICKMATERIAL offline_slowdown = 0 offline_vision_restriction = 0 @@ -46,7 +46,7 @@ /obj/item/clothing/head/helmet/space/rig/mask name = "mask" - flags = FPRINT | TABLEPASS | THICKMATERIAL + flags = THICKMATERIAL /obj/item/weapon/rig/light/ninja name = "ominous suit control module" diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 2ffe521d19..605a40a1b6 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -6,7 +6,7 @@ name = "Space helmet" icon_state = "space" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT item_state = "space" permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) @@ -53,7 +53,7 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL + flags = STOPSPRESSUREDMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index a1e6ab2714..1cab4a659c 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -55,6 +55,13 @@ var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any. var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any. +/obj/item/clothing/suit/space/void/refit_for_species(var/target_species) + ..() + if(istype(helmet)) + helmet.refit_for_species(target_species) + if(istype(boots)) + boots.refit_for_species(target_species) + /obj/item/clothing/suit/space/void/equipped(mob/M) ..() @@ -68,20 +75,15 @@ if(helmet) if(H.head) M << "You are unable to deploy your suit's helmet as \the [H.head] is in the way." - else + else if (H.equip_to_slot_if_possible(helmet, slot_head)) M << "Your suit's helmet deploys with a hiss." - //TODO: Species check, skull damage for forcing an unfitting helmet on? - helmet.loc = H - H.equip_to_slot(helmet, slot_head) helmet.canremove = 0 if(boots) if(H.shoes) M << "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way." - else + else if (H.equip_to_slot_if_possible(boots, slot_shoes)) M << "Your suit's boots deploy with a hiss." - boots.loc = H - H.equip_to_slot(boots, slot_shoes) boots.canremove = 0 /obj/item/clothing/suit/space/void/dropped() @@ -132,12 +134,10 @@ if(H.head) H << "You cannot deploy your helmet while wearing another helmet." return - //TODO: Species check, skull damage for forcing an unfitting helmet on? - helmet.loc = H - helmet.pickup(H) - H.equip_to_slot(helmet, slot_head) - helmet.canremove = 0 - H << "You deploy your suit helmet, sealing you off from the world." + if(H.equip_to_slot_if_possible(helmet, slot_head)) + helmet.pickup(H) + helmet.canremove = 0 + H << "You deploy your suit helmet, sealing you off from the world." helmet.update_light(H) /obj/item/clothing/suit/space/void/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index f5c9f4501e..9be723a72f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -2,7 +2,7 @@ /obj/item/clothing/suit/armor allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) body_parts_covered = UPPER_TORSO|LOWER_TORSO - flags = FPRINT | TABLEPASS | THICKMATERIAL + flags = THICKMATERIAL cold_protection = UPPER_TORSO|LOWER_TORSO min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE @@ -17,7 +17,7 @@ icon_state = "armor" item_state = "armor" blood_overlay_type = "armor" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = ONESIZEFITSALL armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/vest/security @@ -71,7 +71,7 @@ item_state = "swat_suit" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL + flags = STOPSPRESSUREDMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1 @@ -98,7 +98,7 @@ icon_state = "detective-armor" item_state = "armor" blood_overlay_type = "armor" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = ONESIZEFITSALL body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) @@ -113,7 +113,6 @@ item_state = "reactiveoff" blood_overlay_type = "armor" slowdown = 1 - flags = FPRINT | TABLEPASS armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/armor/reactive/IsShield() diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index b3911d8d68..037eb6833e 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -4,7 +4,7 @@ icon_state = "bio" desc = "A hood that protects the head and face from biological comtaminants." permeability_coefficient = 0.01 - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES body_parts_covered = HEAD|FACE|EYES @@ -18,7 +18,6 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 1.0 allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index aa530f7567..a861930f73 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -36,7 +36,6 @@ desc = "Yarr." icon_state = "pirate" item_state = "pirate" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|ARMS @@ -45,7 +44,6 @@ desc = "Yarr." icon_state = "hgpirate" item_state = "hgpirate" - flags = FPRINT | TABLEPASS flags_inv = HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS @@ -55,7 +53,7 @@ desc = "Suit for a cyborg costume." icon_state = "death" item_state = "death" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT fire_resist = T0C+5200 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -65,7 +63,6 @@ desc = "A heavy great coat" icon_state = "nazi" item_state = "nazi" - flags = FPRINT | TABLEPASS /obj/item/clothing/suit/johnny_coat @@ -73,7 +70,6 @@ desc = "Johnny~~" icon_state = "johnny" item_state = "johnny" - flags = FPRINT | TABLEPASS /obj/item/clothing/suit/justice @@ -81,7 +77,6 @@ desc = "This pretty much looks ridiculous." icon_state = "justice" item_state = "justice" - flags = FPRINT | TABLEPASS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET @@ -91,7 +86,6 @@ desc = "This robe commands authority." icon_state = "judge" item_state = "judge" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash) flags_inv = HIDEJUMPSUIT @@ -120,7 +114,6 @@ item_state = "space_suit_syndicate" desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" w_class = 3 - flags = FPRINT | TABLEPASS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET @@ -223,21 +216,18 @@ desc = "A long, thick black leather coat." icon_state = "leathercoat" item_state = "leathercoat" - flags = FPRINT | TABLEPASS /obj/item/clothing/suit/browncoat name = "brown leather coat" desc = "A long, brown leather coat." icon_state = "browncoat" item_state = "browncoat" - flags = FPRINT | TABLEPASS /obj/item/clothing/suit/neocoat name = "black coat" desc = "A flowing, black coat." icon_state = "neocoat" item_state = "neocoat" - flags = FPRINT | TABLEPASS //stripper /obj/item/clothing/under/stripper @@ -361,7 +351,6 @@ desc = "A thick, well-worn WW2 leather bomber jacket." icon_state = "bomber" item_state = "bomber" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|ARMS cold_protection = UPPER_TORSO|ARMS min_cold_protection_temperature = T0C - 20 diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index e75b312690..d0138b283b 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -21,7 +21,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) slowdown = 1.0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -47,7 +47,7 @@ name = "bomb hood" desc = "Use in case of bomb." icon_state = "bombsuit" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES body_parts_covered = HEAD|FACE|EYES @@ -62,7 +62,6 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = FPRINT | TABLEPASS slowdown = 2 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0) flags_inv = HIDEJUMPSUIT|HIDETAIL @@ -89,7 +88,7 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 1b4617afc6..483974f7a2 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -3,7 +3,6 @@ icon_state = "black" item_state = "bl_suit" item_color = "black" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/blackf name = "feminine black jumpsuit" @@ -17,21 +16,18 @@ icon_state = "blue" item_state = "b_suit" item_color = "blue" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/green name = "green jumpsuit" icon_state = "green" item_state = "g_suit" item_color = "green" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/grey name = "grey jumpsuit" icon_state = "grey" item_state = "gy_suit" item_color = "grey" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/orange name = "orange jumpsuit" @@ -41,35 +37,30 @@ item_color = "orange" has_sensor = 2 sensor_mode = 3 - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/pink name = "pink jumpsuit" icon_state = "pink" item_state = "p_suit" item_color = "pink" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/red name = "red jumpsuit" icon_state = "red" item_state = "r_suit" item_color = "red" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/white name = "white jumpsuit" icon_state = "white" item_state = "w_suit" item_color = "white" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" icon_state = "yellow" item_state = "y_suit" item_color = "yellow" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/psyche name = "psychedelic jumpsuit" @@ -88,7 +79,6 @@ desc = "aqua" icon_state = "aqua" item_color = "aqua" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/purple name = "purple jumpsuit" @@ -120,14 +110,12 @@ desc = "lightbrown" icon_state = "lightbrown" item_color = "lightbrown" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/brown name = "brown jumpsuit" desc = "brown" icon_state = "brown" item_color = "brown" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/yellowgreen name = "yellowgreen jumpsuit" @@ -140,7 +128,6 @@ desc = "darkblue" icon_state = "darkblue" item_color = "darkblue" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/lightred name = "lightred jumpsuit" @@ -153,4 +140,3 @@ desc = "darkred" icon_state = "darkred" item_color = "darkred" - flags = FPRINT | TABLEPASS diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index dc6149562d..9ac511b4f7 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -6,7 +6,6 @@ icon_state = "ba_suit" item_state = "ba_suit" item_color = "ba_suit" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. @@ -15,7 +14,6 @@ icon_state = "captain" item_state = "caparmor" item_color = "captain" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/cargo @@ -32,7 +30,6 @@ icon_state = "cargotech" item_state = "lb_suit" item_color = "cargo" - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -42,7 +39,6 @@ icon_state = "chaplain" item_state = "bl_suit" item_color = "chapblack" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/chef @@ -50,7 +46,6 @@ name = "chef's uniform" icon_state = "chef" item_color = "chef" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/clown @@ -59,7 +54,6 @@ icon_state = "clown" item_state = "clown" item_color = "clown" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/head_of_personnel @@ -68,7 +62,6 @@ icon_state = "hop" item_state = "b_suit" item_color = "hop" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/head_of_personnel_whimsy desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does." @@ -76,7 +69,6 @@ icon_state = "hopwhimsy" item_state = "hopwhimsy" item_color = "hopwhimsy" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/hydroponics @@ -86,7 +78,6 @@ item_state = "g_suit" item_color = "hydroponics" permeability_coefficient = 0.50 - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/internalaffairs @@ -95,7 +86,6 @@ icon_state = "internalaffairs" item_state = "internalaffairs" item_color = "internalaffairs" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/janitor @@ -104,13 +94,11 @@ icon_state = "janitor" item_color = "janitor" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/lawyer desc = "Slick threads." name = "Lawyer suit" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/lawyer/black @@ -176,7 +164,6 @@ icon_state = "mime" item_state = "mime" item_color = "mime" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/miner desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index f348b801a5..0b8cebe57a 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -6,7 +6,6 @@ item_state = "g_suit" item_color = "chief" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." @@ -14,7 +13,6 @@ icon_state = "atmos" item_state = "atmos_suit" item_color = "atmos" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." @@ -23,7 +21,6 @@ item_state = "engi_suit" item_color = "engine" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 8a09e0ce57..40bc087429 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -8,7 +8,6 @@ item_state = "g_suit" item_color = "director" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/research_director/rdalt desc = "A dress suit and slacks stained with hard work and dedication to science. Perhaps other things as well, but mostly hard work and dedication." @@ -17,7 +16,6 @@ item_state = "rdalt" item_color = "rdalt" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/research_director/dress_rd name = "research director dress uniform" @@ -25,7 +23,6 @@ icon_state = "dress_rd" item_color = "dress_rd" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/rank/scientist @@ -36,7 +33,6 @@ item_color = "sciencewhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/chemist @@ -68,7 +64,6 @@ item_color = "geneticswhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/virologist desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." @@ -116,28 +111,24 @@ item_color = "medical" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/medical/blue name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" item_color = "scrubsblue" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/medical/green name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." icon_state = "scrubsgreen" item_color = "scrubsgreen" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/medical/purple name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." icon_state = "scrubspurple" item_color = "scrubspurple" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/psych desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." @@ -145,7 +136,6 @@ icon_state = "psych" item_state = "w_suit" item_color = "psych" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/psych/turtleneck desc = "A turqouise turtleneck and a pair of dark blue slacks, belonging to a psychologist." @@ -153,7 +143,6 @@ icon_state = "psychturtle" item_state = "b_suit" item_color = "psychturtle" - flags = FPRINT | TABLEPASS /* diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index f17832d7be..51464410a8 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -15,7 +15,6 @@ item_state = "r_suit" item_color = "warden" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 /obj/item/clothing/under/rank/security @@ -25,7 +24,6 @@ item_state = "r_suit" item_color = "secred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 /obj/item/clothing/under/rank/dispatch @@ -35,7 +33,6 @@ item_state = "dispatch" item_color = "dispatch" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS siemens_coefficient = 0.9 @@ -46,7 +43,6 @@ item_state = "r_suit" item_color = "redshirt2" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 /obj/item/clothing/under/rank/security/corp @@ -66,7 +62,6 @@ item_state = "swatunder" item_color = "swatunder" armor = list(melee = 10, bullet = 5, laser = 5,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 /* @@ -79,7 +74,6 @@ item_state = "det" item_color = "detective" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.9 /obj/item/clothing/under/det/black @@ -122,7 +116,6 @@ item_state = "r_suit" item_color = "hosred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS siemens_coefficient = 0.8 /obj/item/clothing/under/rank/head_of_security/corp @@ -134,7 +127,7 @@ name = "Head of Security Hat" desc = "The hat of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES + flags = HEADCOVERSEYES armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEEARS body_parts_covered = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6daa904453..390ec7f541 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -31,7 +31,6 @@ name = "amish suit" icon_state = "sl_suit" item_color = "sl_suit" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/waiter name = "waiter's outfit" @@ -39,7 +38,6 @@ icon_state = "waiter" item_state = "waiter" item_color = "waiter" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/mailman name = "mailman's jumpsuit" @@ -63,19 +61,30 @@ item_state = "gy_suit" item_color = "vice" -/obj/item/clothing/under/rank/centcom_officer - desc = "It's a jumpsuit worn by CentCom Officers." - name = "\improper CentCom officer's jumpsuit" + +/obj/item/clothing/under/rank/centcom + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign.\"" + name = "\improper NanoTrasen Navy Uniform" icon_state = "officer" item_state = "g_suit" item_color = "officer" + displays_id = 0 -/obj/item/clothing/under/rank/centcom_commander - desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders." - name = "\improper CentCom officer's jumpsuit" +/obj/item/clothing/under/rank/centcom_officer + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant Commander.\"" + name = "\improper NanoTrasen Officers Uniform" + icon_state = "officer" + item_state = "g_suit" + item_color = "officer" + displays_id = 0 + +/obj/item/clothing/under/rank/centcom_captain + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" + name = "\improper NanoTrasen Captains Uniform" icon_state = "centcom" item_state = "dg_suit" item_color = "centcom" + displays_id = 0 /obj/item/clothing/under/ert name = "ERT tactical uniform" @@ -93,7 +102,6 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | ARMS //Needs gloves and shoes with cold protection to be fully protected. min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE @@ -106,7 +114,6 @@ desc = "it's a cybernetically enhanced jumpsuit used for administrative duties." gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -118,7 +125,6 @@ desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" icon_state = "owl" item_color = "owl" - flags = FPRINT | TABLEPASS /obj/item/clothing/under/johnny name = "johnny~~ jumpsuit" @@ -400,6 +406,13 @@ item_color = "sundress_white" body_parts_covered = UPPER_TORSO|LOWER_TORSO +/obj/item/clothing/under/blackjumpskirt + name = "black jumpskirt" + desc = "A black jumpskirt, Sol size 0." + icon_state = "blackjumpskirt" + item_state = "blackjumpskirt" + item_color = "blackjumpskirt" + /obj/item/clothing/under/captainformal name = "captain's formal uniform" desc = "A captain's formal-wear, for special occasions." diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 0644af853d..494cb5e72a 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -2,7 +2,6 @@ name = "athletic shorts" desc = "95% Polyester, 5% Spandex!" gender = PLURAL - flags = FPRINT | TABLEPASS body_parts_covered = LOWER_TORSO /obj/item/clothing/under/shorts/red diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index b70df2c84b..050a2716e0 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -5,7 +5,6 @@ icon_state = "bluetie" item_state = "" //no inhands item_color = "bluetie" - flags = FPRINT | TABLEPASS slot_flags = SLOT_TIE w_class = 2.0 var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 4d91497636..510417c0fb 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -407,7 +407,6 @@ item_state = "ciglit" w_class = 1 body_parts_covered = null - flags = FPRINT|TABLEPASS //Strange penlight, Nerezza: Asher Spock @@ -787,7 +786,6 @@ name = "colonial marine beret" desc = "A well-worn navy blue beret. The insignia of the Martian Colonial Marine Corps is affixed to the front." icon_state = "officerberet" - flags = FPRINT | TABLEPASS ////////////////////////////// Serithi - Adapted Security Helmet ////////////////////////////// @@ -841,7 +839,6 @@ /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle icon = 'icons/obj/chemical.dmi' - flags = FPRINT | TABLEPASS //Starting them with lids on them. Safety first! New(loc, var/color, var/labeled) ..() name = "[labeled] bottle" @@ -1073,7 +1070,6 @@ item_color = "jane_sid_suit" has_sensor = 2 sensor_mode = 3 - flags = FPRINT | TABLEPASS //Suit roll-down toggle. /obj/item/clothing/under/fluff/jane_sidsuit/verb/toggle_zipper() @@ -1137,7 +1133,6 @@ icon_state = "radi_pendant" item_state = "radi_pendant" item_color = "radi_pendant" - flags = FPRINT|TABLEPASS w_class = 2.0 //////////// Masks //////////// @@ -1149,7 +1144,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "flagmask" item_state = "flagmask" - flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH + flags = MASKCOVERSMOUTH w_class = 2 gas_transfer_coefficient = 0.90 */ @@ -1159,7 +1154,6 @@ desc = "A silver and emerald shamrock pendant. It has the initials \"M.K.\" engraved on the back." icon = 'icons/obj/custom_items.dmi' icon_state = "mara_kilpatrick_1" - flags = FPRINT|TABLEPASS w_class = 2 /////////////// Oen'g Issek Medical Mask ////////////////////////// @@ -1182,7 +1176,6 @@ item_state = "altair_locket" item_color = "altair_locket" slot_flags = 0 - flags = FPRINT|TABLEPASS w_class = 2 slot_flags = SLOT_MASK | SLOT_TIE @@ -1196,7 +1189,6 @@ item_state = "konaahirano" item_color = "konaahirano" slot_flags = 0 - flags = FPRINT|TABLEPASS w_class = 2 slot_flags = SLOT_MASK | SLOT_TIE var/obj/item/held //Item inside locket. @@ -1226,7 +1218,6 @@ desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran." icon = 'icons/obj/custom_items.dmi' icon_state = "nasir_khayyam_1" - flags = FPRINT|TABLEPASS w_class = 2 slot_flags = SLOT_MASK | SLOT_TIE @@ -1237,7 +1228,6 @@ desc = "A brass necklace with a green emerald placed at the end. It has a small inscription on the top of the chain, saying \'Foster\'" icon = 'icons/obj/custom_items.dmi' icon_state = "ty_foster" - flags = FPRINT|TABLEPASS w_class = 2 ////// Apollon Pendant - Michael Guess - Dragor23 @@ -1246,7 +1236,6 @@ desc = "A pendant with the form of a sacrificial tripod, used in acient greece. It's a symbol of the Olympian Apollon, a god associated with oracles, poetry, the sun and healing." icon = 'icons/obj/custom_items.dmi' icon_state = "michael_guess_1" - flags = FPRINT|TABLEPASS w_class = 2 slot_flags = SLOT_MASK body_parts_covered = 0 diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index db66c42521..f115d9f9a9 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -122,6 +122,18 @@ throw_speed = 3 throw_range = 5 +/obj/item/weapon/f_card/add_fingerprint(mob/living/M as mob, ignoregloves = 0) + if(..()) + var/mob/living/carbon/human/H = M + var/full_print = md5(H.dna.uni_identity) + fingerprints[full_print] = full_print + +/obj/item/weapon/f_card/examine(mob/user) + ..() + if(fingerprints.len) + user << "Fingerprints on this card:" + for(var/print in fingerprints) + user << "\t[fingerprints[print]]" /obj/item/weapon/fcardholder name = "fingerprint card case" diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 70c4dbca45..59b97ebb7c 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -23,7 +23,7 @@ possible_transfer_amounts = list(5) volume = 5 can_be_placed_into = null - flags = FPRINT | TABLEPASS | OPENCONTAINER | NOBLUDGEON + flags = OPENCONTAINER | NOBLUDGEON /obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob) return diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 2610a5c24a..bca3090c3f 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -70,4 +70,12 @@ atom/proc/add_fibers(mob/living/carbon/human/M) fields["blood"] = blood fields["area"] = other.fields["area"] - fields["time"] = other.fields["time"] \ No newline at end of file + fields["time"] = other.fields["time"] + +/datum/data/record/forensic/proc/update_prints(var/list/o_prints) + var/list/prints = fields["fprints"] + for(var/print in o_prints) + if(prints[print]) + prints[print] = stringmerge(prints[print], o_prints[print]) + .=1 + fields["fprints"] = prints diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 3916c799c8..878a54fd60 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -5,7 +5,7 @@ var/list/stored = list() w_class = 3.0 item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON + flags = CONDUCT | NOBLUDGEON slot_flags = SLOT_BELT /obj/item/device/detective_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob) @@ -104,4 +104,12 @@ if(old) fresh.merge(old) . = 1 - stored["\ref [A]"] = fresh \ No newline at end of file + stored["\ref [A]"] = fresh + +/obj/item/device/detective_scanner/verb/wipe() + set name = "Wipe Forensic Data" + set category = "Object" + set src in view(1) + if (alert("Are you sure you want to wipe all data from [src]?",,"Yes","No") == "Yes") + stored = list() + usr << "Forensic data erase complete." diff --git a/code/modules/detectivework/scanning_console.dm b/code/modules/detectivework/scanning_console.dm index 9e32c58390..5ff719548c 100644 --- a/code/modules/detectivework/scanning_console.dm +++ b/code/modules/detectivework/scanning_console.dm @@ -59,17 +59,23 @@ fresh.fields["label"] = old.fields["label"] files[fresh.uid] = fresh + //updating partial prints on other things + var/list/fprints = fresh.fields["fprints"] + if(fprints.len) + for(var/id in files) + var/datum/data/record/forensic/rec = files[id] + if(rec.update_prints(fprints)) + files[id] = rec + /obj/machinery/computer/forensic_scanning/proc/process_card(var/obj/item/weapon/f_card/card) if(card.fingerprints) usr << "\The [src] sucks in \the [card] and whirrs, scanning it." var/found = 0 for(var/id in files) var/datum/data/record/forensic/rec = files[id] - var/list/prints = rec.fields["fprints"] - for(var/master_print in card.fingerprints) - if(prints[master_print]) - prints[master_print] = master_print - found = 1 + found = rec.update_prints(card.fingerprints) + if (found) + files[id] = rec if(found) usr << "Complete match found." else @@ -189,7 +195,7 @@ dat += "
    NO RECORD SELECTED" else dat += get_printable_data(current) - dat += "Labels: " + dat += "
    Labels: " dat += "[current.fields["label"] ? current.fields["label"] : "None"]
    " dat += "Print record
    " @@ -302,4 +308,4 @@ ping("Scan complete.") var/datum/data/record/forensic/fresh = new(scanning) add_record(fresh) - updateUsrDialog() \ No newline at end of file + updateUsrDialog() diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index 002f53d114..3872b326bc 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -31,30 +31,11 @@ bundle = W bundle.worth += src.worth bundle.update_icon() - if (!istype(src.loc, /turf) && istype(user, /mob/living/carbon/human)) + if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/h_user = user - if(h_user.r_hand == src) - h_user.drop_from_inventory(src) - h_user.put_in_r_hand(bundle) - else if(h_user.l_hand == src) - h_user.drop_from_inventory(src) - h_user.put_in_l_hand(bundle) - else if (h_user.l_store == src) - h_user.drop_from_inventory(src) - bundle.loc = h_user - bundle.layer = 20 - h_user.l_store = bundle - h_user.update_inv_pockets() - else if (h_user.r_store == src) - h_user.drop_from_inventory(src) - bundle.loc = h_user - bundle.layer = 20 - h_user.r_store = bundle - h_user.update_inv_pockets() - else - src.loc = get_turf(h_user) - if(h_user.client) h_user.client.screen -= src - h_user.put_in_hands(bundle) + h_user.drop_from_inventory(src) + h_user.drop_from_inventory(bundle) + h_user.put_in_hands(bundle) user << "You add [src.worth] Thalers worth of money to the bundles.
    It holds [bundle.worth] Thalers now.
    " del(src) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index e7c9f5a402..16d623d3da 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -18,19 +18,27 @@ /datum/event/carp_migration/start() if(severity == EVENT_LEVEL_MAJOR) - for(var/i = 1 to rand(3,5)) - spawn_fish(landmarks_list.len) - else if(severity == EVENT_LEVEL_MODERATE) spawn_fish(landmarks_list.len) + else if(severity == EVENT_LEVEL_MODERATE) + spawn_fish(rand(4, 6)) //12 to 30 carp, in small groups else - spawn_fish(rand(1, 5)) + spawn_fish(rand(1, 3), 1, 2) //1 to 6 carp, alone or in pairs + +/datum/event/carp_migration/proc/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) + var/list/spawn_locations = list() -/datum/event/carp_migration/proc/spawn_fish(var/limit) for(var/obj/effect/landmark/C in landmarks_list) if(C.name == "carpspawn") - spawned_carp.Add(new /mob/living/simple_animal/hostile/carp(C.loc)) - if(spawned_carp.len >= limit) - return + spawn_locations.Add(C.loc) + spawn_locations = shuffle(spawn_locations) + num_groups = min(num_groups, spawn_locations.len) + + var/i = 1 + while (i <= num_groups) + var/group_size = rand(group_size_min, group_size_max) + for (var/j = 1, j <= group_size, j++) + spawned_carp.Add(new /mob/living/simple_animal/hostile/carp(spawn_locations[i])) + i++ /datum/event/carp_migration/end() for(var/mob/living/simple_animal/hostile/carp/C in spawned_carp) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 5470f1ba7a..758d50ebdd 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -25,7 +25,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT if(!next_event_time) set_event_delay() - if(delayed) + if(delayed || !config.allow_random_events) next_event_time += (world.time - last_world_time) else if(world.time > next_event_time) start_event() @@ -139,32 +139,32 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT /datum/event_container/moderate severity = EVENT_LEVEL_MODERATE available_events = list( - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 10), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 5, list(ASSIGNMENT_ENGINEER = 25, ASSIGNMENT_SECURITY = 25)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space vines", /datum/event/spacevine, 10, list(ASSIGNMENT_ENGINEER = 5)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_shower, 0, list(ASSIGNMENT_ENGINEER = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 25, ASSIGNMENT_SECURITY = 25)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 50)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 25, list(ASSIGNMENT_ENGINEER = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 15, list(ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_JANITOR = 15)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 5, list(ASSIGNMENT_SECURITY = 5), 1), - new /datum/event_meta/alien(EVENT_LEVEL_MODERATE, "Alien Infestation", /datum/event/alien_infestation, 2.5,list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), - new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 25, ASSIGNMENT_CYBORG = 25, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SCIENTIST = 5)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1230), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 20), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 20)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space vines", /datum/event/spacevine, 200, list(ASSIGNMENT_ENGINEER = 10)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_shower, 0, list(ASSIGNMENT_ENGINEER = 20)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 150)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)), + new /datum/event_meta/alien(EVENT_LEVEL_MODERATE, "Alien Infestation", /datum/event/alien_infestation, 2.5, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), + new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), ) /datum/event_container/major severity = EVENT_LEVEL_MAJOR available_events = list( - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 50), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 60), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), ) diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 1ef4d22e91..070598b333 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -45,6 +45,10 @@ log_debug("Event '[EM.name]' has completed at [worldtime2text()].") +/datum/event_manager/proc/delay_events(var/severity, var/delay) + var/list/datum/event_container/EC = event_containers[severity] + EC.next_event_time += delay + /datum/event_manager/proc/Interact(var/mob/living/user) var/html = GetInteractWindow() @@ -75,6 +79,7 @@ /datum/event_manager/proc/GetInteractWindow() var/html = "Refresh" + html += "Pause All - [config.allow_random_events ? "Pause" : "Resume"]" if(selected_event_container) var/event_time = max(0, selected_event_container.next_event_time - world.time) @@ -92,7 +97,7 @@ html += "[EM.max_weight]" html += "[EM.one_shot]" html += "[EM.enabled]" - html += "[EM.get_weight()]" + html += "[EM.get_weight(number_active_with_role())]" html += "Remove" html += "" html += "" @@ -190,12 +195,12 @@ admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") else if(href_list["dec_timer"]) var/datum/event_container/EC = locate(href_list["event"]) - var/decrease = (60 * RaiseToPower(10, text2num(href_list["dec_timer"]))) + var/decrease = (60 * 10 ** text2num(href_list["dec_timer"])) EC.next_event_time -= decrease admin_log_and_message_admins("decreased timer for [severity_to_string[EC.severity]] events by [decrease/600] minute(s).") else if(href_list["inc_timer"]) var/datum/event_container/EC = locate(href_list["event"]) - var/increase = (60 * RaiseToPower(10, text2num(href_list["inc_timer"]))) + var/increase = (60 * 10 ** text2num(href_list["inc_timer"])) EC.next_event_time += increase admin_log_and_message_admins("increased timer for [severity_to_string[EC.severity]] events by [increase/600] minute(s).") else if(href_list["select_event"]) @@ -207,6 +212,9 @@ var/datum/event_container/EC = locate(href_list["pause"]) EC.delayed = !EC.delayed admin_log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [severity_to_string[EC.severity]] events.") + else if(href_list["pause_all"]) + config.allow_random_events = text2num(href_list["pause_all"]) + admin_log_and_message_admins("has [config.allow_random_events ? "resumed" : "paused"] countdown for all events.") else if(href_list["interval"]) var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null if(delay && delay > 0) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index c485827efb..40a38e2383 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -8,7 +8,8 @@ power_failure(0) /datum/event/grid_check/announce() - command_announcement.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.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') + if (prob(30)) + command_announcement.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.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') /datum/event/grid_check/end() power_restore() diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 791f44ab34..33bee714ff 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -13,7 +13,7 @@ /datum/event/meteor_wave/tick() if(IsMultiple(activeFor, 3)) - spawn_meteors(rand(2,5)) + meteor_wave(rand(2,5)) /datum/event/meteor_wave/end() command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert") @@ -34,7 +34,7 @@ //meteor showers are lighter and more common, /datum/event/meteor_shower/tick() if(activeFor >= next_meteor) - spawn_meteors(rand(1,4)) + meteor_wave(rand(1,4)) next_meteor += rand(20,100) waves-- if(waves <= 0) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index a5b6c6be55..a288752ff7 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -30,12 +30,12 @@ /datum/event/radiation_storm/proc/radiate() for(var/mob/living/carbon/C in living_mob_list) - var/turf/T = get_turf(C) - if(!T) + var/area/A = get_area(C) + if(!A) continue - if(!(T.z in config.station_levels)) + if(!(A.z in config.station_levels)) continue - if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters)) + if(A.rad_shielded) continue if(istype(C,/mob/living/carbon/human)) diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 6e40d38d33..55dbe2b823 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -1,11 +1,36 @@ +datum/event/viral_infection + var/list/viruses = list() + datum/event/viral_infection/setup() announceWhen = rand(0, 3000) endWhen = announceWhen + 1 + + //generate 1-3 viruses. This way there's an upper limit on how many individual diseases need to be cured if many people are initially infected + var/num_diseases = rand(1,3) + for (var/i=0, i < num_diseases, i++) + var/datum/disease2/disease/D = new /datum/disease2/disease + + var/strength = 1 //whether the disease is of the greater or lesser variety + if (severity >= EVENT_LEVEL_MAJOR && prob(75)) + strength = 2 + D.makerandom(strength) + viruses += D datum/event/viral_infection/announce() - command_announcement.Announce("Confirmed outbreak of level five biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') + var/level + if (severity == EVENT_LEVEL_MUNDANE) + return + else if (severity == EVENT_LEVEL_MODERATE) + level = pick("one", "two", "three", "four") + else + level = "five" + + if (severity == EVENT_LEVEL_MAJOR || prob(60)) + command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') datum/event/viral_infection/start() + if(!viruses.len) return + var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) if(G.client && G.stat != DEAD) @@ -13,9 +38,10 @@ datum/event/viral_infection/start() if(!candidates.len) return candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - severity = severity == 1 ? 1 : severity - 1 + severity = max(EVENT_LEVEL_MUNDANE, severity - 1) var/actual_severity = severity * rand(1, 3) while(actual_severity > 0 && candidates.len) - infect_mob_random_lesser(candidates[1]) + var/datum/disease2/disease/D = pick(viruses) + infect_mob(candidates[1], D.getcopy()) candidates.Remove(candidates[1]) actual_severity-- diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index d82807f738..717d3ea8a8 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -40,7 +40,6 @@ icon = 'icons/obj/harvest.dmi' icon_state = "logs" force = 5 - flags = TABLEPASS throwforce = 5 w_class = 3.0 throw_speed = 3 @@ -71,7 +70,6 @@ icon_state = "sunflower" damtype = "fire" force = 0 - flags = TABLEPASS throwforce = 1 w_class = 1.0 throw_speed = 1 @@ -89,7 +87,6 @@ icon_state = "nettle" damtype = "fire" force = 15 - flags = TABLEPASS throwforce = 1 w_class = 2.0 throw_speed = 1 diff --git a/code/modules/hydroponics/hydro_tools.dm b/code/modules/hydroponics/hydro_tools.dm index 328e1a020e..957ef5173f 100644 --- a/code/modules/hydroponics/hydro_tools.dm +++ b/code/modules/hydroponics/hydro_tools.dm @@ -168,7 +168,7 @@ /obj/item/weapon/plantspray icon = 'icons/obj/hydroponics.dmi' item_state = "spray" - flags = TABLEPASS | FPRINT | NOBLUDGEON + flags = NOBLUDGEON slot_flags = SLOT_BELT throwforce = 4 w_class = 2.0 @@ -220,7 +220,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "hoe" item_state = "hoe" - flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON + flags = CONDUCT | NOBLUDGEON force = 5.0 throwforce = 7.0 w_class = 2.0 @@ -236,7 +236,6 @@ name = "bottle of weedkiller" icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" - flags = FPRINT | TABLEPASS var/toxicity = 0 var/weed_kill_str = 0 @@ -244,7 +243,6 @@ name = "bottle of glyphosate" icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" - flags = FPRINT | TABLEPASS toxicity = 4 weed_kill_str = 2 @@ -252,7 +250,6 @@ name = "bottle of triclopyr" icon = 'icons/obj/chemical.dmi' icon_state = "bottle18" - flags = FPRINT | TABLEPASS toxicity = 6 weed_kill_str = 4 @@ -260,7 +257,6 @@ name = "bottle of 2,4-D" icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" - flags = FPRINT | TABLEPASS toxicity = 8 weed_kill_str = 7 @@ -274,7 +270,7 @@ desc = "A small glass bottle. Can hold up to 10 units." icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER possible_transfer_amounts = null w_class = 2.0 @@ -314,7 +310,7 @@ desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood." icon = 'icons/obj/weapons.dmi' icon_state = "hatchet" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT force = 12.0 w_class = 2.0 throwforce = 15.0 @@ -347,7 +343,7 @@ throw_speed = 1 throw_range = 3 w_class = 4.0 - flags = FPRINT | TABLEPASS | NOSHIELD + flags = NOSHIELD slot_flags = SLOT_BACK origin_tech = "materials=2;combat=2" attack_verb = list("chopped", "sliced", "cut", "reaped") diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 509d069754..33e6f47c57 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -217,8 +217,8 @@ proc/populate_seed_list() "water", "potassium", "plasticide", - "slimetoxin", - "aslimetoxin", + "mutationtoxin", + "amutationtoxin", "inaprovaline", "space_drugs", "paroxetine", diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm new file mode 100644 index 0000000000..17cab40d8a --- /dev/null +++ b/code/modules/hydroponics/seed_storage.dm @@ -0,0 +1,256 @@ +/datum/seed_pile + var/name + var/amount + var/datum/seed/seed_type // Keeps track of what our seed is + var/list/obj/item/seeds/seeds = list() // Tracks actual objects contained in the pile + var/ID + +/datum/seed_pile/New(var/obj/item/seeds/O, var/ID) + name = O.name + amount = 1 + seed_type = O.seed + seeds += O + src.ID = ID + +/datum/seed_pile/proc/matches(var/obj/item/seeds/O) + if (O.seed == seed_type) + return 1 + return 0 + +/obj/machinery/seed_storage + name = "Seed storage" + desc = "It stores, sorts, and dispenses seeds." + icon = 'icons/obj/vending.dmi' + icon_state = "seeds" + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 100 + + var/initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction + var/list/datum/seed_pile/piles = list() + var/list/starting_seeds = list() + var/list/scanner = list() // What properties we can view + +/obj/machinery/seed_storage/random // This is mostly for testing, but I guess admins could spawn it + name = "Random seed storage" + scanner = list("stats", "produce", "soil", "temperature", "light", "mutants") + starting_seeds = list(/obj/item/seeds/random = 50) + +/obj/machinery/seed_storage/garden + name = "Garden seed storage" + scanner = list("stats") + starting_seeds = list(/obj/item/seeds/appleseed = 3, /obj/item/seeds/bananaseed = 3, /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/lemonseed = 3, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, /obj/item/seeds/orangeseed = 3, /obj/item/seeds/peanutseed = 3, /obj/item/seeds/plumpmycelium = 3, /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/riceseed = 3, /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3) + +/obj/machinery/seed_storage/xenobotany + name = "Xenobotany seed storage" + scanner = list("stats", "produce", "soil", "temperature", "light", "mutants") + starting_seeds = list(/obj/item/seeds/ambrosiavulgarisseed = 3, /obj/item/seeds/appleseed = 3, /obj/item/seeds/amanitamycelium = 2, /obj/item/seeds/bananaseed = 3, /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/lemonseed = 3, /obj/item/seeds/libertymycelium = 2, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, /obj/item/seeds/nettleseed = 2, /obj/item/seeds/orangeseed = 3, /obj/item/seeds/peanutseed = 3, /obj/item/seeds/plastiseed = 3, /obj/item/seeds/plumpmycelium = 3, /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/reishimycelium = 2, /obj/item/seeds/riceseed = 3, /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3) + +/obj/machinery/seed_storage/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/obj/machinery/seed_storage/interact(mob/user as mob) + if (..()) + return + + if (!initialized) + for(var/typepath in starting_seeds) + var/amount = starting_seeds[typepath] + if(isnull(amount)) amount = 1 + + for (var/i = 1 to amount) + var/O = new typepath + add(O) + initialized = 1 + + var/dat = "

    Seed storage contents

    " + if (piles.len == 0) + dat += "No seeds" + else + dat += "" + dat += "" + if ("stats" in scanner) + dat += "" + if ("produce" in scanner) + dat += "" + if ("temperature" in scanner) + dat += "" + if ("light" in scanner) + dat += "" + if ("soil" in scanner) + dat += "" + dat += "" + for (var/datum/seed_pile/S in piles) + var/datum/seed/seed = S.seed_type + dat += "" + dat += "" + dat += "" + if ("stats" in scanner) + dat += "" + if(seed.harvest_repeat) + dat += "" + else + dat += "" + if ("produce" in scanner) + if (seed.products && seed.products.len) + dat += "" + else + dat += "" + if ("temperature" in scanner) + dat += "" + if ("light" in scanner) + dat += "" + if ("soil" in scanner) + if(seed.requires_nutrients) + if(seed.nutrient_consumption < 0.05) + dat += "" + else if(seed.nutrient_consumption > 0.2) + dat += "" + else + dat += "" + else + dat += "" + if(seed.requires_water) + if(seed.water_consumption < 1) + dat += "" + else if(seed.water_consumption > 5) + dat += "" + else + dat += "" + else + dat += "" + + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
    NameVarietyEYLMPrPtHarvestProduceTempLightNutriWaterNotesAmount
    [S.name]#[seed.uid][seed.endurance][seed.yield][seed.lifespan][seed.maturation][seed.production][seed.potency]MultipleSingleFruit: [seed.products.len]N/A[seed.ideal_heat] K[seed.ideal_light] LLowHighNormNoLowHighNormNo" + if ("mutants" in scanner) + if(seed.mutants && seed.mutants.len) + dat += "SUBSP " + if(seed.immutable == -1) + dat += "MUT " + else if(seed.immutable > 0) + dat += "NOMUT " + switch(seed.carnivorous) + if(1) + dat += "CARN " + if(2) + dat += "CARN " + switch(seed.spread) + if(1) + dat += "VINE " + if(2) + dat += "VINE " + if ("pressure" in scanner) + if(seed.lowkpa_tolerance < 20) + dat += "LP " + if(seed.highkpa_tolerance > 220) + dat += "HP " + if ("temperature" in scanner) + if(seed.heat_tolerance > 30) + dat += "TEMRES " + else if(seed.heat_tolerance < 10) + dat += "TEMSEN " + if ("light" in scanner) + if(seed.light_tolerance > 10) + dat += "LIGRES " + else if(seed.light_tolerance < 3) + dat += "LIGSEN " + if(seed.toxins_tolerance < 3) + dat += "TOXSEN " + else if(seed.toxins_tolerance > 6) + dat += "TOXRES " + if(seed.pest_tolerance < 3) + dat += "PESTSEN " + else if(seed.pest_tolerance > 6) + dat += "PESTRES " + if(seed.weed_tolerance < 3) + dat += "WEEDSEN " + else if(seed.weed_tolerance > 6) + dat += "WEEDRES " + if(seed.parasite) + dat += "PAR " + if ("temperature" in scanner) + if(seed.alter_temp > 0) + dat += "TEMP+ " + if(seed.alter_temp < 0) + dat += "TEMP- " + if(seed.biolum) + dat += "LUM " + if(seed.flowers) + dat += "
    [seed.flower_colour ? "FLOW" : "FLOW"]." + dat += "
    [S.amount]Vend Purge
    " + + user << browse(dat, "window=seedstorage") + onclose(user, "seedstorage") + +/obj/machinery/seed_storage/Topic(var/href, var/list/href_list) + if (..()) + return + var/task = href_list["task"] + var/ID = text2num(href_list["id"]) + + for (var/datum/seed_pile/N in piles) + if (N.ID == ID) + if (task == "vend") + var/obj/O = pick(N.seeds) + if (O) + --N.amount + N.seeds -= O + if (N.amount <= 0 || N.seeds.len <= 0) + piles -= N + del(N) + O.loc = src.loc + else + piles -= N + del(N) + else if (task == "purge") + for (var/obj/O in N.seeds) + del(O) + piles -= N + del(N) + break + updateUsrDialog() + +/obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob) + if (istype(O, /obj/item/seeds)) + add(O) + user.visible_message("[user] puts \the [O.name] into \the [src].", "You put \the [O] into \the [src].") + return + else if (istype(O, /obj/item/weapon/storage/bag/plants)) + var/obj/item/weapon/storage/P = O + var/loaded = 0 + for(var/obj/item/seeds/G in P.contents) + ++loaded + add(G) + if (loaded) + user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].") + else + user << "There are no seeds in \the [O.name]." + return + else if(istype(O, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + anchored = !anchored + user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + +/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj) + if (istype(O.loc, /mob)) + var/mob/user = O.loc + user.drop_item(O) + else if(istype(O.loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = O.loc + S.remove_from_storage(O, src) + + O.loc = src + + for (var/datum/seed_pile/N in piles) + if (N.matches(O)) + ++N.amount + N.seeds += (O) + return + + piles += new /datum/seed_pile(O, piles.len) + return diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 390e3568cd..6f1b732849 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -3,7 +3,6 @@ name = "packet of seeds" icon = 'icons/obj/seeds.dmi' icon_state = "seed" - flags = FPRINT | TABLEPASS w_class = 2.0 var/seed_type diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm index b25c03080e..24e7502669 100644 --- a/code/modules/hydroponics/vines.dm +++ b/code/modules/hydroponics/vines.dm @@ -20,7 +20,6 @@ // Life vars/ var/energy = 0 var/obj/effect/plant_controller/master = null - var/mob/living/buckled_mob var/datum/seed/seed /obj/effect/plantsegment/New() @@ -56,7 +55,7 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) del src else - manual_unbuckle(user) + user_unbuckle_mob(user) return // Plant-b-gone damage is handled in its entry in chemistry-reagents.dm ..() @@ -71,39 +70,7 @@ update() return - manual_unbuckle(user) - -/obj/effect/plantsegment/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() - buckled_mob = null - return - -/obj/effect/plantsegment/proc/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(prob(seed ? min(max(0,100 - seed.potency),100) : 50)) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] frees [buckled_mob.name] from [src].",\ - "[user.name] frees you from [src].",\ - "You hear shredding and ripping.") - else - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles free of [src].",\ - "You untangle [src] from around yourself.",\ - "You hear shredding and ripping.") - unbuckle() - else - var/text = pick("rips","tears","pulls") - user.visible_message(\ - "[user.name] [text] at [src].",\ - "You [text] at [src].",\ - "You hear shredding and ripping.") - return + user_unbuckle_mob(user) /obj/effect/plantsegment/proc/grow() @@ -362,6 +329,8 @@ SV.life() + if(!SV) continue + if(SV.energy < 2) //If tile isn't fully grown var/chance if(seed) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index e8374d5652..cd172b41ee 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -126,7 +126,6 @@ throw_speed = 1 throw_range = 5 w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) - flags = FPRINT | TABLEPASS attack_verb = list("bashed", "whacked", "educated") var/dat // Actual page content var/due_date = 0 // Game time in 1/10th seconds @@ -254,7 +253,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = FPRINT | TABLEPASS var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this var/obj/item/weapon/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index d1561da59d..8544543531 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -300,9 +300,9 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if(checkoutperiod < 1) checkoutperiod = 1 if(href_list["editbook"]) - buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN) + buffer_book = sanitize(copytext(input("Enter the book's title:") as text|null,1,MAX_MESSAGE_LEN)) if(href_list["editmob"]) - buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN) + buffer_mob = sanitize(copytext(input("Enter the recipient's name:") as text|null,1,MAX_NAME_LEN)) if(href_list["checkout"]) var/datum/borrowbook/b = new /datum/borrowbook b.bookname = sanitize(buffer_book) @@ -317,7 +317,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/obj/item/weapon/book/b = locate(href_list["delbook"]) inventory.Remove(b) if(href_list["setauthor"]) - var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN) + var/newauthor = sanitize(copytext(input("Enter the author's name: ") as text|null,1,MAX_MESSAGE_LEN)) if(newauthor) scanner.cache.author = newauthor if(href_list["setcategory"]) diff --git a/code/modules/maps/reader.dm b/code/modules/maps/reader.dm index 66ebb13c72..daf34508f5 100644 --- a/code/modules/maps/reader.dm +++ b/code/modules/maps/reader.dm @@ -2,6 +2,9 @@ //SS13 Optimized Map loader ////////////////////////////////////////////////////////////// +//global datum that will preload variables on atoms instanciation +var/global/dmm_suite/preloader/_preloader = null + /** * Construct the model map and control the loading process @@ -163,7 +166,7 @@ //first instance the /area and remove it from the members list index = members.len var/atom/instance - var/dmm_suite/preloader/_preloader = new(members_attributes[index])//preloader for assigning set variables on atom creation + _preloader = new(members_attributes[index])//preloader for assigning set variables on atom creation instance = locate(members[index]) instance.contents.Add(locate(xcrd,ycrd,zcrd)) @@ -191,34 +194,6 @@ T = UT index++ - - //Replace the previous part of the code with this if it's unsafe to assume tiles have ALWAYS an /area AND a /turf - /*while(members.len > 0) - var/length = members.len - var/member = members[length] - - if(ispath(member,/area)) - var/atom/instance - var/dmm_suite/preloader/_preloader = new(members_attributes[length]) - - instance = locate(member) - instance.contents.Add(locate(xcrd,ycrd,zcrd)) - - if(_preloader && instance) - _preloader.load(instance) - - members.Remove(member) - continue - - else if(ispath(member,/turf)) - instance_atom(member,members_attributes[length],xcrd,ycrd,zcrd) - members.Remove(member) - continue - - else - break - */ - //finally instance all remainings objects/mobs for(index=1,index < first_turf_index,index++) instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd) @@ -230,11 +205,11 @@ //Instance an atom at (x,y,z) and gives it the variables in attributes /dmm_suite/proc/instance_atom(var/path,var/list/attributes, var/x, var/y, var/z) var/atom/instance - var/dmm_suite/preloader/_preloader = new(attributes) + _preloader = new(attributes, path) - instance = new path (locate(x,y,z), _preloader)//first preloader pass + instance = new path (locate(x,y,z))//first preloader pass - if(_preloader && instance)//second preloader pass, as some variables may have been reset/changed by New() + if(_preloader && instance)//second preloader pass, for those atoms that don't ..() in New() _preloader.load(instance) return instance @@ -242,9 +217,9 @@ //text trimming (both directions) helper proc //optionally removes quotes before and after the text (for variable name) /dmm_suite/proc/trim_text(var/what as text,var/trim_quotes=0) - while(length(what) && (findtext(what," ",1,2)))// || findtext(what,quote,1,2))) + while(length(what) && (findtext(what," ",1,2))) what=copytext(what,2,0) - while(length(what) && (findtext(what," ",length(what),0)))// || findtext(what,quote,length(what),0))) + while(length(what) && (findtext(what," ",length(what),0))) what=copytext(what,1,length(what)) if(trim_quotes) while(length(what) && (findtext(what,quote,1,2))) @@ -298,14 +273,18 @@ else if(isnum(text2num(trim_right))) trim_right = text2num(trim_right) - //Check for file - else if(copytext(trim_right,1,2) == "'") - trim_right = file(copytext(trim_right,2,length(trim_right))) + //Check for null + else if(trim_right == "null") + trim_right = null //Check for list else if(copytext(trim_right,1,5) == "list") trim_right = text2list(copytext(trim_right,6,length(trim_right))) + //Check for file + else if(copytext(trim_right,1,2) == "'") + trim_right = file(copytext(trim_right,2,length(trim_right))) + to_return[trim_left] = trim_right else//simple var @@ -323,10 +302,11 @@ placed.opacity = 1 placed.underlays += turfs_underlays -//atom creation method that preloads variables before creation -/atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader) - if(istype(_dmm_preloader, /dmm_suite/preloader)) - _dmm_preloader.load(src) +//atom creation method that preloads variables at creation +/atom/New() + if(_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() + _preloader.load(src) + . = ..() ////////////////// @@ -336,14 +316,17 @@ /dmm_suite/preloader parent_type = /datum var/list/attributes + var/target_path -/dmm_suite/preloader/New(list/the_attributes) +/dmm_suite/preloader/New(var/list/the_attributes, var/path) .=..() if(!the_attributes.len) Del() + return attributes = the_attributes + target_path = path /dmm_suite/preloader/proc/load(atom/what) for(var/attribute in attributes) what.vars[attribute] = attributes[attribute] - Del() + Del() \ No newline at end of file diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index f71b7f9d35..c5f4c2d2dd 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -6,74 +6,155 @@ icon_closed = "securecrate" var/code = null var/lastattempt = null - var/attempts = 3 + var/attempts = 10 + var/codelen = 4 locked = 1 - var/min = 1 - var/max = 10 /obj/structure/closet/crate/secure/loot/New() ..() - code = rand(min,max) - var/loot = rand(1,30) + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") + + code = "" + for(var/i = 0, i < codelen, i++) + var/dig = pick(digits) + code += dig + digits -= dig // Player can enter codes with matching digits, but there are never matching digits in the answer + + var/loot = rand(1, 100) switch(loot) - if(1) + if(1 to 5) // Common things go, 5% new/obj/item/weapon/reagent_containers/food/drinks/bottle/rum(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src) new/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src) new/obj/item/weapon/flame/lighter/zippo(src) - if(2) + if(6 to 10) new/obj/item/weapon/pickaxe/drill(src) new/obj/item/device/taperecorder(src) new/obj/item/clothing/suit/space(src) new/obj/item/clothing/head/helmet/space(src) - if(3) - return - if(4) + if(11 to 15) new/obj/item/weapon/reagent_containers/glass/beaker/bluespace(src) - if(5 to 6) + if(16 to 20) for(var/i = 0, i < 10, i++) new/obj/item/weapon/ore/diamond(src) - if(7) - return - if(8) - return - if(9) + if(21 to 25) for(var/i = 0, i < 3, i++) new/obj/machinery/portable_atmospherics/hydroponics(src) - if(10) + if(26 to 30) for(var/i = 0, i < 3, i++) new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src) - if(11 to 13) - new/obj/item/weapon/melee/classic_baton(src) - if(14) - return - if(15) + if(31 to 35) + spawn_money(rand(300,800), src) + if(36 to 40) + new/obj/item/weapon/melee/baton(src) + if(41 to 45) + new/obj/item/clothing/under/shorts/red(src) + new/obj/item/clothing/under/shorts/blue(src) + if(46 to 50) new/obj/item/clothing/under/chameleon(src) for(var/i = 0, i < 7, i++) new/obj/item/clothing/tie/horrible(src) - if(16) - new/obj/item/clothing/under/shorts(src) - new/obj/item/clothing/under/shorts/red(src) - new/obj/item/clothing/under/shorts/blue(src) - //Dummy crates start here. - if(17 to 29) - return - //Dummy crates end here. - if(30) - new/obj/item/weapon/melee/baton(src) + if(51 to 52) // Uncommon, 2% each + new/obj/item/weapon/melee/classic_baton(src) + if(53 to 54) + new/obj/item/latexballon(src) + if(55 to 56) + var/newitem = pick(typesof(/obj/item/toy/prize) - /obj/item/toy/prize) + new newitem(src) + if(57 to 58) + new/obj/item/toy/syndicateballoon(src) + if(59 to 60) + new/obj/item/weapon/rig(src) + if(61 to 62) + for(var/i = 0, i < 12, ++i) + new/obj/item/clothing/head/kitty(src) + if(63 to 64) + var/t = rand(4,7) + for(var/i = 0, i < t, ++i) + var/newcoin = pick(/obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/diamond, /obj/item/weapon/coin/phoron, /obj/item/weapon/coin/uranium, /obj/item/weapon/coin/platinum) + new newcoin(src) + if(65 to 66) + new/obj/item/clothing/suit/ianshirt(src) + if(67 to 68) + var/t = rand(4,7) + for(var/i = 0, i < t, ++i) + var/newitem = pick(typesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts - /obj/item/weapon/stock_parts/subspace) + new newitem(src) + if(69 to 70) + new/obj/item/weapon/pickaxe/silver(src) + if(71 to 72) + new/obj/item/weapon/pickaxe/drill(src) + if(73 to 74) + new/obj/item/weapon/pickaxe/jackhammer(src) + if(75 to 76) + new/obj/item/weapon/pickaxe/diamond(src) + if(77 to 78) + new/obj/item/weapon/pickaxe/diamonddrill(src) + if(79 to 80) + new/obj/item/weapon/pickaxe/gold(src) + if(81 to 82) + new/obj/item/weapon/pickaxe/plasmacutter(src) + if(83 to 84) + new/obj/item/toy/katana(src) + if(85 to 86) + new/obj/item/seeds/random(src) + if(87) // Rarest things, some are unobtainble otherwise, some are just robust, 1% each + new/obj/item/weed_extract(src) + if(88) + new/obj/item/xenos_claw(src) + if(89) + new/obj/item/organ/xenos/plasmavessel(src) + if(90) + new/obj/item/organ/heart(src) + if(91) + new/obj/item/device/soulstone(src) + if(92) + new/obj/item/weapon/katana(src) + if(93) + new/obj/item/weapon/dnainjector/xraymut(src) // Probably the least OP + if(94) // Why the hell not + new/obj/item/weapon/storage/backpack/clown(src) + new/obj/item/clothing/under/rank/clown(src) + new/obj/item/clothing/shoes/clown_shoes(src) + new/obj/item/device/pda/clown(src) + new/obj/item/clothing/mask/gas/clown_hat(src) + new/obj/item/weapon/bikehorn(src) + //new/obj/item/weapon/stamp/clown(src) I'd add it, but only clowns can use it + new/obj/item/toy/crayon/rainbow(src) + new/obj/item/toy/waterflower(src) + if(95) + new/obj/item/clothing/under/mime(src) + new/obj/item/clothing/shoes/black(src) + new/obj/item/device/pda/mime(src) + new/obj/item/clothing/gloves/white(src) + new/obj/item/clothing/mask/gas/mime(src) + new/obj/item/clothing/head/beret(src) + new/obj/item/clothing/suit/suspenders(src) + new/obj/item/toy/crayon/mime(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(src) + if(96) + new/obj/item/weapon/vampiric(src) + if(97) + new/obj/item/weapon/archaeological_find(src) + if(98) + new/obj/item/weapon/melee/energy/sword(src) + if(99) + new/obj/item/weapon/storage/belt/champion(src) + new/obj/item/clothing/mask/luchador(src) + if(100) + new/obj/item/clothing/head/bearpelt(src) /obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob) if(locked) user << "The crate is locked with a Deca-code lock." - var/input = input(usr, "Enter digit from [min] to [max].", "Deca-Code Lock", "") as num + var/input = input(usr, "Enter [codelen] digits.", "Deca-Code Lock", "") as text if(in_range(src, user)) - input = Clamp(input, 0, 10) if (input == code) user << "The crate unlocks!" locked = 0 overlays.Cut() overlays += greenlight - else if (input == null || input > max || input < min) + else if (input == null || length(input) != codelen) user << "You leave the crate alone." else user << "A red light flashes." @@ -96,19 +177,26 @@ if (istype(W, /obj/item/weapon/card/emag)) user << "The crate unlocks!" locked = 0 - if (istype(W, /obj/item/device/multitool)) + if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls? user << "DECA-CODE LOCK REPORT:" if (attempts == 1) user << "* Anti-Tamper Bomb will activate on next failed access attempt." else user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." - if (lastattempt == null) - user << " has been made to open the crate thus far." - return - // hot and cold - if (code > lastattempt) - user << "* Last access attempt lower than expected code." - else - user << "* Last access attempt higher than expected code." + if (lastattempt != null) + var/list/guess = list() + var/bulls = 0 + var/cows = 0 + for(var/i = 1, i < codelen + 1, i++) + var/a = copytext(lastattempt, i, i+1) // Stuff the code into the list + guess += a + guess[a] = i + for(var/i in guess) // Go through list and count matches + var/a = findtext(code, i) + if(a == guess[i]) + ++bulls + else if(a) + ++cows + user << "Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." else ..() else ..() diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index 6a0d7c5c3c..6ddf02609a 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items.dmi' name = "Coin" icon_state = "coin" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 0.0 throwforce = 0.0 w_class = 1.0 diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ff159ff122..be76b4c126 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -52,7 +52,7 @@ name = "pickaxe" icon = 'icons/obj/items.dmi' icon_state = "pickaxe" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 15.0 throwforce = 4.0 @@ -150,7 +150,7 @@ desc = "A large tool for digging and moving dirt." icon = 'icons/obj/items.dmi' icon_state = "shovel" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT force = 8.0 throwforce = 4.0 diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 05d2caa9a2..d49ccc222f 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/storage.dmi' name = "Money bag" icon_state = "moneybag" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 10.0 throwforce = 2.0 w_class = 4.0 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 362d3827ba..f34e328d17 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -26,7 +26,7 @@ /mob/dead/observer/New(mob/body) sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER + see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE see_in_dark = 100 verbs += /mob/dead/observer/proc/dead_tele @@ -143,7 +143,7 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.timeofdeath //BS12 EDIT ghost.key = key - if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost @@ -409,7 +409,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set category = "Ghost" if (see_invisible == SEE_INVISIBLE_OBSERVER_NOLIGHTING) - see_invisible = SEE_INVISIBLE_OBSERVER + see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE else see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING @@ -557,8 +557,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(src.invisibility != 0) user.visible_message( \ - "[user] drags ghost, [src], to our plan of reality!", \ - "You drag [src] to our plan of reality!" \ + "[user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ ) toggle_visibility(1) else diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 3d96e3d9c0..a97d616dee 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -52,6 +52,8 @@ if(stat == DEAD) return 0 + facing_dir = null + if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it. src.visible_message("\The [src.name] [deathmessage]") diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 8c16691dc6..8862479b2a 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -12,7 +12,7 @@ var/input if(!message) - input = copytext(sanitize(input(src,"Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN) + input = sanitize(copytext(input(src,"Choose an emote to display.") as text|null,1,MAX_MESSAGE_LEN)) else input = message if(input) @@ -108,7 +108,7 @@ var/input if(!message) - input = copytext(sanitize(input(src, "Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) + input = sanitize(copytext(input(src, "Choose an emote to display.") as text|null, 1, MAX_MESSAGE_LEN)) else input = message diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c238aef026..dd9e2dd3c6 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -124,18 +124,28 @@ var/changed_voice if(istype(src, /mob/living/silicon/ai) && !hard_to_hear) + part_a = "\[[worldtime2text()]\]" + part_a var/jobname // the mob's "job" - var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any. + var/mob/living/carbon/human/impersonating //The crew member being impersonated, if any. if (ishuman(speaker)) var/mob/living/carbon/human/H = speaker - if((H.wear_id && istype(H.wear_id,/obj/item/weapon/card/id/syndicate)) && (H.wear_mask && istype(H.wear_mask,/obj/item/clothing/mask/gas/voice))) - + if(H.wear_mask && istype(H.wear_mask,/obj/item/clothing/mask/gas/voice)) changed_voice = 1 - var/mob/living/carbon/human/I = locate(speaker_name) + var/list/impersonated = new() + var/mob/living/carbon/human/I = impersonated[speaker_name] - if(I) + if(!I) + for(var/mob/living/carbon/human/M in mob_list) + if(M.real_name == speaker_name) + I = M + impersonated[speaker_name] = I + break + + // If I's display name is currently different from the voice name and using an agent ID then don't impersonate + // as this would allow the AI to track I and realize the mismatch. + if(I && !(I.name != speaker_name && I.wear_id && istype(I.wear_id,/obj/item/weapon/card/id/syndicate))) impersonating = I jobname = impersonating.get_assignment() else diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 81e8137f04..96eb6f11a3 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -40,8 +40,9 @@ /mob/living/var/holder_type /mob/living/proc/get_scooped(var/mob/living/carbon/grabber) - if(!holder_type) + if(!holder_type || buckled || pinned.len) return + var/obj/item/weapon/holder/H = new holder_type(loc) src.loc = H H.name = loc.name diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 4f4b8a0e6f..4191a8d140 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -144,7 +144,7 @@ syllables = list("rr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", \ "mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", \ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \ - "hal","ket","jurl","mah","tul","cresh","azu","ragh") + "hal","ket","jurl","mah","tul","cresh","azu","ragh", "mro", "mra") /datum/language/tajaran/get_random_name(var/gender) @@ -223,7 +223,8 @@ colour = "solcom" key = "1" flags = RESTRICTED - syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e") + + //syllables are at the bottom of the file /datum/language/human/get_spoken_verb(var/msg_end) switch(msg_end) @@ -233,6 +234,15 @@ return ask_verb return speech_verb +/datum/language/human/get_random_name(var/gender) + if (prob(80)) + if(gender==FEMALE) + return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + else + return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + return ..() + // Galactic common languages (systemwide accepted standards). /datum/language/trader name = "Tradeband" @@ -424,4 +434,66 @@ dat += "[L.name] (:[L.key])
    [L.desc]

    " src << browse(dat, "window=checklanguage") - return \ No newline at end of file + return + +//Syllable Lists + +/* + This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, + and the english syllables had to be duplicated so that there is roughly a 50-50 weighting. + + Sources: + http://www.sttmedia.com/syllablefrequency-english + http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm +*/ +/datum/language/human/syllables = list( +"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", +"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai", +"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", +"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei", +"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", +"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", +"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", +"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan", +"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", +"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", +"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", +"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang", +"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", +"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", +"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", +"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", +"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", +"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha", +"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", +"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", +"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", +"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", +"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan", +"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", +"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", +"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 67a134ec9b..c9b3175eb8 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -7,6 +7,7 @@ pass_flags = PASSTABLE health = 100 maxHealth = 100 + mob_size = 4 var/adult_form var/dead_icon diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 4957a2d95f..4285f91c3f 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -31,6 +31,7 @@ M.put_in_active_hand(G) grabbed_by += G + G.affecting = src G.synch() LAssailant = M diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index fd5a80de66..5faeadbdcc 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -14,4 +14,21 @@ ..() species = all_species["Diona"] - verbs += /mob/living/carbon/alien/diona/proc/merge \ No newline at end of file + verbs += /mob/living/carbon/alien/diona/proc/merge + +/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) + //TODO: Collapse these checks into one proc (see pai and drone) + if(istype(AM,/obj/item)) + var/obj/item/O = AM + if(O.w_class > 2) + src << "You are too small to pull that." + return + else + ..() + else + src << "You are too small to pull that." + return + +/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. + W.loc = get_turf(src) + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index f36de5ded9..6ec6b4fce4 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -3,7 +3,6 @@ health = 400 //They need to live awhile longer than other organs. desc = "A piece of juicy meat found in a person's head." icon_state = "brain2" - flags = TABLEPASS force = 1.0 w_class = 2.0 throwforce = 1.0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b1170468d8..4431ccdf80 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -354,6 +354,8 @@ else if (W == handcuffed) handcuffed = null update_inv_handcuffed() + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() else if (W == legcuffed) legcuffed = null diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 47e4282424..107e660d39 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,18 +1,14 @@ -/mob/living/carbon/verb/give() +mob/living/carbon/verb/give(var/mob/living/carbon/target in view(1)-usr) set category = "IC" set name = "Give" - set src in view(1) - if(src.stat == 2 || usr.stat == 2 || src.client == null) - return - if(src == usr) - usr << "\red I feel stupider, suddenly." + if(target.stat == 2 || usr.stat == 2|| target.client == null) return var/obj/item/I if(!usr.hand && usr.r_hand == null) - usr << "\red You don't have anything in your right hand to give to [src.name]" + usr << "You don't have anything in your right hand to give to [target.name]" return if(usr.hand && usr.l_hand == null) - usr << "\red You don't have anything in your left hand to give to [src.name]" + usr << "You don't have anything in your left hand to give to [target.name]" return if(usr.hand) I = usr.l_hand @@ -20,38 +16,38 @@ I = usr.r_hand if(!I) return - if(src.r_hand == null || src.l_hand == null) - switch(alert(src,"[usr] wants to give you \a [I]?",,"Yes","No")) + if(target.r_hand == null || target.l_hand == null) + switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) if("Yes") if(!I) return if(!Adjacent(usr)) - usr << "\red You need to stay in reaching distance while giving an object." - src << "\red [usr.name] moved too far away." + usr << "You need to stay in reaching distance while giving an object." + target << "[usr.name] moved too far away." return if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) - usr << "\red You need to keep the item in your active hand." - src << "\red [usr.name] seem to have given up on giving \the [I.name] to you." + usr << "You need to keep the item in your active hand." + target << "[usr.name] seem to have given up on giving \the [I.name] to you." return - if(src.r_hand != null && src.l_hand != null) - src << "\red Your hands are full." - usr << "\red Their hands are full." + if(target.r_hand != null && target.l_hand != null) + target << "Your hands are full." + usr << "Their hands are full." return else usr.drop_item() - if(src.r_hand == null) - src.r_hand = I + if(target.r_hand == null) + target.r_hand = I else - src.l_hand = I - I.loc = src + target.l_hand = I + I.loc = target I.layer = 20 - I.add_fingerprint(src) - src.update_inv_l_hand() - src.update_inv_r_hand() + I.add_fingerprint(target) + target.update_inv_l_hand() + target.update_inv_r_hand() usr.update_inv_l_hand() usr.update_inv_r_hand() - src.visible_message("\blue [usr.name] handed \the [I.name] to [src.name].") + target.visible_message("[usr.name] handed \the [I.name] to [target.name].") if("No") - src.visible_message("\red [usr.name] tried to hand [I.name] to [src.name] but [src.name] didn't want it.") + target.visible_message("[usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") else - usr << "\red [src.name]'s hands are full." + usr << "[target.name]'s hands are full." diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm similarity index 100% rename from code/WorkInProgress/Cib/MedicalSideEffects.dm rename to code/modules/mob/living/carbon/human/MedicalSideEffects.dm diff --git a/code/modules/mob/living/carbon/human/chem_side_effects.dm b/code/modules/mob/living/carbon/human/chem_side_effects.dm new file mode 100644 index 0000000000..62f9cf75f8 --- /dev/null +++ b/code/modules/mob/living/carbon/human/chem_side_effects.dm @@ -0,0 +1,149 @@ +// MEDICAL SIDE EFFECT BASE +// ======================== +/datum/medical_effect + var/name = "None" + var/strength = 0 + var/start = 0 + var/list/triggers + var/list/cures + var/cure_message + +/datum/medical_effect/proc/manifest(mob/living/carbon/human/H) + for(var/R in cures) + if(H.reagents.has_reagent(R)) + return 0 + for(var/R in triggers) + if(H.reagents.get_reagent_amount(R) >= triggers[R]) + return 1 + return 0 + +/datum/medical_effect/proc/on_life(mob/living/carbon/human/H, strength) + return + +/datum/medical_effect/proc/cure(mob/living/carbon/human/H) + for(var/R in cures) + if(H.reagents.has_reagent(R)) + if (cure_message) + H <<"\blue [cure_message]" + return 1 + return 0 + + +// MOB HELPERS +// =========== +/mob/living/carbon/human/var/list/datum/medical_effect/side_effects = list() +/mob/proc/add_side_effect(name, strength = 0) +/mob/living/carbon/human/add_side_effect(name, strength = 0) + for(var/datum/medical_effect/M in src.side_effects) + if(M.name == name) + M.strength = max(M.strength, 10) + M.start = life_tick + return + + + var/T = side_effects[name] + if (!T) + return + + var/datum/medical_effect/M = new T + if(M.name == name) + M.strength = strength + M.start = life_tick + side_effects += M + +/mob/living/carbon/human/proc/handle_medical_side_effects() + //Going to handle those things only every few ticks. + if(life_tick % 15 != 0) + return 0 + + var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect + for(var/T in L) + var/datum/medical_effect/M = new T + if (M.manifest(src)) + src.add_side_effect(M.name) + + // One full cycle(in terms of strength) every 10 minutes + for (var/datum/medical_effect/M in side_effects) + if (!M) continue + var/strength_percent = sin((life_tick - M.start) / 2) + + // Only do anything if the effect is currently strong enough + if(strength_percent >= 0.4) + if (M.cure(src) || M.strength > 50) + side_effects -= M + M = null + else + if(life_tick % 45 == 0) + M.on_life(src, strength_percent*M.strength) + // Effect slowly growing stronger + M.strength+=0.08 + +// HEADACHE +// ======== +/datum/medical_effect/headache + name = "Headache" + triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15) + cures = list("alkysine", "tramadol", "paracetamol", "oxycodone") + cure_message = "Your head stops throbbing..." + +/datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength) + switch(strength) + if(1 to 10) + H.custom_pain("You feel a light pain in your head.",0) + if(11 to 30) + H.custom_pain("You feel a throbbing pain in your head!",1) + if(31 to INFINITY) + H.custom_pain("You feel an excrutiating pain in your head!",1) + +// BAD STOMACH +// =========== +/datum/medical_effect/bad_stomach + name = "Bad Stomach" + triggers = list("kelotane" = 30, "dermaline" = 15) + cures = list("anti_toxin") + cure_message = "Your stomach feels a little better now..." + +/datum/medical_effect/bad_stomach/on_life(mob/living/carbon/human/H, strength) + switch(strength) + if(1 to 10) + H.custom_pain("You feel a bit light around the stomach.",0) + if(11 to 30) + H.custom_pain("Your stomach hurts.",0) + if(31 to INFINITY) + H.custom_pain("You feel sick.",1) + +// CRAMPS +// ====== +/datum/medical_effect/cramps + name = "Cramps" + triggers = list("anti_toxin" = 30, "tramadol" = 15) + cures = list("inaprovaline") + cure_message = "The cramps let up..." + +/datum/medical_effect/cramps/on_life(mob/living/carbon/human/H, strength) + switch(strength) + if(1 to 10) + H.custom_pain("The muscles in your body hurt a little.",0) + if(11 to 30) + H.custom_pain("The muscles in your body cramp up painfully.",0) + if(31 to INFINITY) + H.emote("me",1,"flinches as all the muscles in their body cramp up.") + H.custom_pain("There's pain all over your body.",1) + +// ITCH +// ==== +/datum/medical_effect/itch + name = "Itch" + triggers = list("space_drugs" = 10) + cures = list("inaprovaline") + cure_message = "The itching stops..." + +/datum/medical_effect/itch/on_life(mob/living/carbon/human/H, strength) + switch(strength) + if(1 to 10) + H.custom_pain("You feel a slight itch.",0) + if(11 to 30) + H.custom_pain("You want to scratch your itch badly.",0) + if(31 to INFINITY) + H.emote("me",1,"shivers slightly.") + H.custom_pain("This itch makes it really hard to concentrate.",1) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index ec1e1539bb..2140fe22b3 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -50,7 +50,7 @@ m_type = 1 if ("custom") - var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN) + var/input = sanitize(copytext(input("Choose an emote to display.") as text|null,1,MAX_MESSAGE_LEN)) if (!input) return var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") @@ -577,7 +577,7 @@ set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = copytext(sanitize(input(usr, "This is [src]. \He is...", "Pose", null) as text), 1, MAX_MESSAGE_LEN) + pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN)) /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index cac59fc767..0f06e979ad 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -120,7 +120,7 @@ else msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n" else if(blood_DNA) - msg += "[t_He] [t_has] blood-stained hands!\n" + msg += "[t_He] [t_has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!\n" //handcuffed? @@ -131,6 +131,10 @@ else msg += "[t_He] [t_is] \icon[handcuffed] handcuffed!\n" + //buckled + if(buckled) + msg += "[t_He] [t_is] \icon[buckled] buckled to [buckled]!\n" + //belt if(belt) if(belt.blood_DNA) @@ -145,7 +149,7 @@ else msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n" else if(feet_blood_DNA) - msg += "[t_He] [t_has] blood-stained feet!\n" + msg += "[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!\n" //mask if(wear_mask && !skipmask) @@ -219,7 +223,10 @@ usr << "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]..." else usr << "[t_He] has a pulse!" - + if(fire_stacks) + msg += "[t_He] [t_is] covered in some liquid.\n" + if(on_fire) + msg += "[t_He] [t_is] on fire!.\n" msg += "" if(nutrition < 100) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a37933f57f..2e194ca7cd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -499,7 +499,7 @@ for (var/datum/data/record/R in data_core.security) if (R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"security")) - var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN)) if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) ) return var/counter = 1 @@ -628,7 +628,7 @@ for (var/datum/data/record/R in data_core.medical) if (R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"medical")) - var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN) + var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN)) if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) ) return var/counter = 1 @@ -871,6 +871,7 @@ else target.show_message("\blue You hear a voice that seems to echo around the room: [say]") usr.show_message("\blue You project your mind into [target.real_name]: [say]") + log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]") for(var/mob/dead/observer/G in world) G.show_message("Telepathic message from [src] to [target]: [say]") @@ -946,12 +947,13 @@ // This will ignore any prosthetics in the prefs currently. species.create_organs(src) - for (var/obj/item/organ/brain/H in world) - if(H.brainmob) - if(H.brainmob.real_name == src.real_name) - if(H.brainmob.mind) - H.brainmob.mind.transfer_to(src) - del(H) + if(!client || !key) //Don't boot out anyone already in the mob. + for (var/obj/item/organ/brain/H in world) + if(H.brainmob) + if(H.brainmob.real_name == src.real_name) + if(H.brainmob.mind) + H.brainmob.mind.transfer_to(src) + del(H) for(var/datum/organ/internal/I in internal_organs) I.damage = 0 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 34774530ca..414f7e2bfb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -120,7 +120,7 @@ emp_act /mob/living/carbon/human/proc/getarmor_organ(var/datum/organ/external/def_zone, var/type) if(!type) return 0 var/protection = 0 - var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform) + var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) for(var/gear in protective_gear) if(gear && istype(gear ,/obj/item/clothing)) var/obj/item/clothing/C = gear @@ -297,11 +297,11 @@ emp_act return 1 //this proc handles being hit by a thrown atom -/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5) +/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR) if(istype(AM,/obj/)) var/obj/O = AM - if(in_throw_mode && !get_active_hand() && speed <= 5) //empty active hand and we're in throw mode + if(in_throw_mode && !get_active_hand() && speed <= THROWFORCE_SPEED_DIVISOR) //empty active hand and we're in throw mode if(canmove && !restrained()) if(isturf(O.loc)) put_in_active_hand(O) @@ -313,7 +313,7 @@ emp_act if(istype(O,/obj/item/weapon)) var/obj/item/weapon/W = O dtype = W.damtype - var/throw_damage = O.throwforce*(speed/5) + var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR) var/zone if (istype(O.thrower, /mob/living)) @@ -375,9 +375,9 @@ emp_act affecting.embed(I) // Begin BS12 momentum-transfer code. - if(O.throw_source && speed >= 15) + if(O.throw_source && speed >= THROWNOBJ_KNOCKBACK_SPEED) var/obj/item/weapon/W = O - var/momentum = speed/2 + var/momentum = speed/THROWNOBJ_KNOCKBACK_DIVISOR var/dir = get_dir(O.throw_source, src) visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 546ec3ba83..d8b0a66c8c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -47,7 +47,7 @@ tally += 0.5 else if(E.status & ORGAN_BROKEN) tally += 1.5 - + if(shock_stage >= 10) tally += 3 if(FAT in src.mutations) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 13dd13413e..1150a52e71 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -175,7 +175,7 @@ text = input("What would you like to say?", "Speak to creature", null, null) - text = trim(copytext(sanitize(text), 1, MAX_MESSAGE_LEN)) + text = trim(sanitize(copytext(text, 1, MAX_MESSAGE_LEN))) if(!text) return @@ -213,7 +213,7 @@ set desc = "Whisper silently to someone over a distance." set category = "Abilities" - var/msg = sanitize(input("Message:", "Psychic Whisper") as text|null) + var/msg = sanitize(copytext(input("Message:", "Psychic Whisper") as text|null, 1, MAX_MESSAGE_LEN)) if(msg) log_say("PsychicWhisper: [key_name(src)]->[M.key] : [msg]") M << "\green You hear a strange, alien voice in your head... \italic [msg]" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index f9bc6ee4ff..8516b11a7f 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -167,6 +167,8 @@ update_inv_back() else if (W == handcuffed) handcuffed = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() success = 1 update_inv_handcuffed() else if (W == legcuffed) @@ -417,8 +419,55 @@ for(var/mob/O in viewers(target, null)) O.show_message("\red [source] is trying to put \a [item] on [target]", 1) else - var/message=null + + var/target_part = null + var/obj/item/target_item = null + var/message = null + switch(place) + if("mask") + target_part = "head" + target_item = target.wear_mask + if("l_hand") + target_part = "left hand" + target_item = target.l_hand + if("r_hand") + target_part = "right hand" + target_item = target.r_hand + if("gloves") + target_part = "hands" + target_item = target.gloves + if("eyes") + target_part = "eyes" + target_item = target.glasses + if("l_ear") + target_part = "left ear" + target_item = target.l_ear + if("r_ear") + target_part = "right ear" + target_item = target.r_ear + if("head") + target_part = "head" + target_item = target.head + if("shoes") + target_part = "feet" + target_item = target.shoes + if("belt") + target_part = "waist" + target_item = target.belt + if("suit") + target_part = "body" + target_item = target.wear_suit + if("back") + target_part = "back" + target_item = target.back + if("s_store") + target_part = "suit" + target_item = target.s_store + if("id") + target_part = "uniform" + target_item = target.wear_id + if("syringe") message = "\red [source] is trying to inject [target]!" if("pill") @@ -427,86 +476,17 @@ message = "\red [source] is trying to force [target] to swallow a gulp of [item]!" if("dnainjector") message = "\red [source] is trying to inject [target] with the [item]!" - if("mask") - target.attack_log += text("\[[time_stamp()]\] Had their mask removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) mask") - if(target.wear_mask && !target.wear_mask.canremove) - message = "\red [source] fails to take off \a [target.wear_mask] from [target]'s head!" + if("uniform") + target.attack_log += text("\[[time_stamp()]\] Has had their uniform ([target.w_uniform]) removed by [source.name] ([source.ckey])") + source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) uniform ([target.w_uniform])") + if(target.w_uniform && !target.w_uniform.canremove) + message = "\red [source] fails to take off \a [target.w_uniform] from [target]'s body!" return else - message = "\red [source] is trying to take off \a [target.wear_mask] from [target]'s head!" - if("l_hand") - target.attack_log += text("\[[time_stamp()]\] Has had their left hand item ([target.l_hand]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) left hand item ([target.l_hand])") - message = "\red [source] is trying to take off \a [target.l_hand] from [target]'s left hand!" - if("r_hand") - target.attack_log += text("\[[time_stamp()]\] Has had their right hand item ([target.r_hand]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) right hand item ([target.r_hand])") - message = "\red [source] is trying to take off \a [target.r_hand] from [target]'s right hand!" - if("gloves") - target.attack_log += text("\[[time_stamp()]\] Has had their gloves ([target.gloves]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) gloves ([target.gloves])") - if(target.gloves && !target.gloves.canremove) - message = "\red [source] fails to take off \a [target.gloves] from [target]'s hands!" - return - else - message = "\red [source] is trying to take off the [target.gloves] from [target]'s hands!" - if("eyes") - target.attack_log += text("\[[time_stamp()]\] Has had their eyewear ([target.glasses]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) eyewear ([target.glasses])") - if(target.glasses && !target.glasses.canremove) - message = "\red [source] fails to take off \a [target.glasses] from [target]'s eyes!" - return - else - message = "\red [source] is trying to take off the [target.glasses] from [target]'s eyes!" - if("l_ear") - target.attack_log += text("\[[time_stamp()]\] Has had their left ear item ([target.l_ear]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) left ear item ([target.l_ear])") - if(target.l_ear && !target.l_ear.canremove) - message = "\red [source] fails to take off \a [target.l_ear] from [target]'s left ear!" - return - else - message = "\red [source] is trying to take off the [target.l_ear] from [target]'s left ear!" - if("r_ear") - target.attack_log += text("\[[time_stamp()]\] Has had their right ear item ([target.r_ear]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) right ear item ([target.r_ear])") - if(target.r_ear && !target.r_ear.canremove) - message = "\red [source] fails to take off \a [target.r_ear] from [target]'s right ear!" - return - else - message = "\red [source] is trying to take off the [target.r_ear] from [target]'s right ear!" - if("head") - target.attack_log += text("\[[time_stamp()]\] Has had their hat ([target.head]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) hat ([target.head])") - if(target.head && !target.head.canremove) - message = "\red [source] fails to take off \a [target.head] from [target]'s head!" - return - else - message = "\red [source] is trying to take off the [target.head] from [target]'s head!" - if("shoes") - target.attack_log += text("\[[time_stamp()]\] Has had their shoes ([target.shoes]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) shoes ([target.shoes])") - if(target.shoes && !target.shoes.canremove) - message = "\red [source] fails to take off \a [target.shoes] from [target]'s feet!" - return - else - message = "\red [source] is trying to take off the [target.shoes] from [target]'s feet!" - if("belt") - target.attack_log += text("\[[time_stamp()]\] Has had their belt item ([target.belt]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) belt item ([target.belt])") - message = "\red [source] is trying to take off the [target.belt] from [target]'s belt!" - if("suit") - target.attack_log += text("\[[time_stamp()]\] Has had their suit ([target.wear_suit]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit ([target.wear_suit])") - if(target.wear_suit && !target.wear_suit.canremove) - message = "\red [source] fails to take off \a [target.wear_suit] from [target]'s body!" - return - else - message = "\red [source] is trying to take off \a [target.wear_suit] from [target]'s body!" - if("back") - target.attack_log += text("\[[time_stamp()]\] Has had their back item ([target.back]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) back item ([target.back])") - message = "\red [source] is trying to take off \a [target.back] from [target]'s back!" + message = "\red [source] is trying to take off \a [target.w_uniform] from [target]'s body!" + for(var/obj/item/I in list(target.l_store, target.r_store)) + if(I.on_found(source)) + return if("handcuff") target.attack_log += text("\[[time_stamp()]\] Was unhandcuffed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to unhandcuff [target.name]'s ([target.ckey])") @@ -515,17 +495,6 @@ target.attack_log += text("\[[time_stamp()]\] Was unlegcuffed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to unlegcuff [target.name]'s ([target.ckey])") message = "\red [source] is trying to unlegcuff [target]!" - if("uniform") - target.attack_log += text("\[[time_stamp()]\] Has had their uniform ([target.w_uniform]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) uniform ([target.w_uniform])") - for(var/obj/item/I in list(target.l_store, target.r_store)) - if(I.on_found(source)) - return - if(target.w_uniform && !target.w_uniform.canremove) - message = "\red [source] fails to take off \a [target.w_uniform] from [target]'s body!" - return - else - message = "\red [source] is trying to take off \a [target.w_uniform] from [target]'s body!" if("tie") var/obj/item/clothing/under/suit = target.w_uniform target.attack_log += text("\[[time_stamp()]\] Has had their accessory ([suit.hastie]) removed by [source.name] ([source.ckey])") @@ -537,10 +506,6 @@ return else message = "\red [source] is trying to take off \a [suit.hastie] from [target]'s suit!" - if("s_store") - target.attack_log += text("\[[time_stamp()]\] Has had their suit storage item ([target.s_store]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit storage item ([target.s_store])") - message = "\red [source] is trying to take off \a [target.s_store] from [target]'s suit!" if("pockets") target.attack_log += text("\[[time_stamp()]\] Has had their pockets emptied by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to empty [target.name]'s ([target.ckey]) pockets") @@ -553,10 +518,6 @@ del(src) target.cpr_time = 0 message = "\red [source] is trying perform CPR on [target]!" - if("id") - target.attack_log += text("\[[time_stamp()]\] Has had their ID ([target.wear_id]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) ID ([target.wear_id])") - message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!" if("internal") target.attack_log += text("\[[time_stamp()]\] Has had their internals toggled by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to toggle [target.name]'s ([target.ckey]) internals") @@ -575,8 +536,18 @@ return message = "\red [source] is trying to set [target]'s suit sensors!" - for(var/mob/M in viewers(target, null)) - M.show_message(message, 1) + if(target_item) + target.attack_log += text("\[[time_stamp()]\] Had their [target_item] removed by [source.name] ([source.ckey])") + source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) [target_item]") + + if(target_item.canremove) + message = "[source] is trying to take off \a [target_item] from [target]'s [target_part]!" + else + source.visible_message("[source] fails to take off \a [target_item] from [target]'s [target_part]!") + return + + source.visible_message(message) + spawn( HUMAN_STRIP_DELAY ) done() return @@ -671,9 +642,10 @@ It can still be worn/put on as normal. W.hold.close(usr) usr.put_in_hands(tie) suit.hastie = null*/ - suit.hastie.on_removed(usr) - suit.hastie = null - target.update_inv_w_uniform() + if(suit && suit.hastie) + suit.hastie.on_removed(usr) + suit.hastie = null + target.update_inv_w_uniform() if("id") slot_to_process = slot_wear_id if (target.wear_id) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0f13a6dbfd..ce3a5401ae 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -112,6 +112,9 @@ //Handle temperature/pressure differences between body and environment handle_environment(environment) //Optimized a good bit. + //Check if we're on fire + handle_fire() + //Status updates, death etc. handle_regular_status_updates() //Optimized a bit update_canmove() @@ -407,11 +410,10 @@ loc.assume_air(breath) //spread some viruses while we are at it - if (virus2.len > 0) - if (prob(10) && get_infection_chance(src)) -// log_debug("[src] : Exhaling some viruses") - for(var/mob/living/carbon/M in view(1,src)) - src.spread_disease_to(M) + if (virus2.len > 0 && prob(10)) +// log_debug("[src] : Exhaling some viruses") + for(var/mob/living/carbon/M in view(1,src)) + src.spread_disease_to(M) proc/get_breath_from_internal(volume_needed) @@ -599,8 +601,9 @@ failed_last_breath = 0 adjustOxyLoss(-5) + // Hot air hurts :( - if( (breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) + if((breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) if(breath.temperature < species.cold_level_1) if(prob(20)) @@ -644,6 +647,10 @@ //world << "Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]" bodytemperature += temp_adj + else if(breath.temperature >= species.heat_discomfort_level) + species.get_environment_discomfort(src,"heat") + else if(breath.temperature <= species.cold_discomfort_level) + species.get_environment_discomfort(src,"cold") breath.update_values() return 1 @@ -784,6 +791,8 @@ if (abs(body_temperature_difference) < 0.5) return //fuck this precision + if (on_fire) + return //too busy for pesky convection if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. @@ -1040,8 +1049,7 @@ if(halloss > 100) src << "You're in too much pain to keep going..." - for(var/mob/O in oviewers(src, null)) - O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1) + src.visible_message("[src] slumps to the ground, too weak to continue fighting.") Paralyse(10) setHalLoss(99) @@ -1426,21 +1434,19 @@ client.screen |= G.overlay if(G.vision_flags) sight |= G.vision_flags - if(!druggy) + if(!druggy && !seer) see_invisible = SEE_INVISIBLE_MINIMUM - if(istype(G,/obj/item/clothing/glasses/night)) + if(istype(G,/obj/item/clothing/glasses/night) && !seer) see_invisible = SEE_INVISIBLE_MINIMUM /* HUD shit goes here, as long as it doesn't modify sight flags */ // The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl + var/obj/item/clothing/glasses/hud/O = G if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud)) - var/obj/item/clothing/glasses/sunglasses/sechud/O = G - if(O.hud) O.hud.process_hud(src) - if(!druggy) see_invisible = SEE_INVISIBLE_LIVING - else if(istype(G, /obj/item/clothing/glasses/hud)) - var/obj/item/clothing/glasses/hud/O = G + var/obj/item/clothing/glasses/sunglasses/sechud/S = G + O = S.hud + if(istype(O)) O.process_hud(src) - if(!druggy) - see_invisible = SEE_INVISIBLE_LIVING + if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING proc/handle_random_events() // Puke if toxloss is too high @@ -1774,5 +1780,15 @@ speech_problem_flag = 1 return stuttering +/mob/living/carbon/human/handle_fire() + if(..()) + return + + var/burn_temperature = fire_burn_temperature() + var/thermal_protection = get_heat_protection(burn_temperature) + + if (thermal_protection < 1 && bodytemperature < burn_temperature) + bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7201cfc8e4..cf49b82364 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -12,13 +12,20 @@ message = trim_strip_html_properly(message) - if(stat == 2) - return say_dead(message) + if(stat) + if(stat == 2) + return say_dead(message) + return + + if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + src << "You're muzzled and cannot speak!" + return var/message_mode = parse_message_mode(message, "headset") - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) + switch(copytext(message,1,2)) + if("*") return emote(copytext(message,2)) + if("^") return custom_emote(1, copytext(message,2)) if(name != GetVoice()) alt_name = "(as [get_id_name("Unknown")])" @@ -52,9 +59,6 @@ if(ending=="?") verb="asks" - if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - message = trim(message) if(speech_problem_flag) @@ -63,7 +67,7 @@ verb = handle_r[2] speech_problem_flag = handle_r[3] - if(!message || stat) + if(!message || message == "") return var/list/obj/item/used_radios = new @@ -265,45 +269,46 @@ return verb /mob/living/carbon/human/proc/handle_speech_problems(var/message) + var/list/returns[3] var/verb = "says" var/handled = 0 - if(silent) + if(silent || (sdisabilities & MUTE)) message = "" handled = 1 - if(sdisabilities & MUTE) - message = "" - handled = 1 - if(wear_mask) - if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/hoers = wear_mask - if(hoers.voicechange) - if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling") - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") - verb = pick("whinnies","neighs", "says") - handled = 1 + if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) + var/obj/item/clothing/mask/horsehead/hoers = wear_mask + if(hoers.voicechange) + if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling") + message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + verb = pick("whinnies","neighs", "says") + handled = 1 - if((HULK in mutations) && health >= 25 && length(message)) - message = "[uppertext(message)]!!!" - verb = pick("yells","roars","hollers") - handled = 1 - if(slurring) - message = slur(message) - verb = pick("stammers","stutters") - handled = 1 - - var/braindam = getBrainLoss() - if(braindam >= 60) - handled = 1 - if(prob(braindam/4)) + if(message != "") + if((HULK in mutations) && health >= 25 && length(message)) + message = "[uppertext(message)]!!!" + verb = pick("yells","roars","hollers") + handled = 1 + if(slurring) + message = slur(message) + verb = pick("slobbers","slurs") + handled = 1 + if(stuttering) message = stutter(message) - verb = pick("stammers", "stutters") - if(prob(braindam)) - message = uppertext(message) - verb = pick("yells like an idiot","says rather loudly") + verb = pick("stammers","stutters") + handled = 1 + + var/braindam = getBrainLoss() + if(braindam >= 60) + handled = 1 + if(prob(braindam/4)) + message = stutter(message) + verb = pick("stammers", "stutters") + if(prob(braindam)) + message = uppertext(message) + verb = "yells loudly" returns[1] = message returns[2] = verb returns[3] = handled - return returns diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8bdfa8a59d..943f90bcca 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -56,7 +56,7 @@ var/cold_level_3 = 120 // Cold damage level 3 below this point. var/heat_level_1 = 360 // Heat damage level 1 above this point. var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 1000 // Heat damage level 2 above this point. + var/heat_level_3 = 1000 // Heat damage level 3 above this point. var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. @@ -65,6 +65,20 @@ var/light_dam // If set, mob will be damaged in light over this value and heal in light below its negative. var/body_temperature = 310.15 // Non-IS_SYNTHETIC species will try to stabilize at this temperature. // (also affects temperature processing) + + var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm. + var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly. + var/list/heat_discomfort_strings = list( + "You feel sweat drip down your neck.", + "You feel uncomfortably warm.", + "Your skin prickles in the heat." + ) + var/list/cold_discomfort_strings = list( + "You feel chilly.", + "You shiver suddely.", + "Your chilly flesh stands out in goosebumps." + ) + // HUD data vars. var/datum/hud_data/hud var/hud_type @@ -100,6 +114,27 @@ for(var/u_type in unarmed_types) unarmed_attacks += new u_type() +/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type) + + if(!prob(5)) + return + + var/covered = 0 // Basic coverage can help. + for(var/obj/item/clothing/clothes in H) + if(H.l_hand == clothes|| H.r_hand == clothes) + continue + if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO)) + covered = 1 + break + + switch(msg_type) + if("cold") + if(!covered) + H << "[pick(cold_discomfort_strings)]" + if("heat") + if(covered) + H << "[pick(heat_discomfort_strings)]" + /datum/species/proc/get_random_name(var/gender) var/datum/language/species_language = all_languages[language] return species_language.get_random_name(gender) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index fe5eac0f07..bb922b905b 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -35,23 +35,29 @@ if("head", "mouth", "eyes") // ----- HEAD ----- // switch(attack_damage) - if(1 to 2) user.visible_message("[user] scratched [target] across \his cheek!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target]'s [pick("head", "neck")] [pick("", "", "", "with spread [pick(attack_noun)]")]!") - if(5) user.visible_message("[pick("[user] [pick(attack_verb)] [target] across \his face!", "[user] rakes \his [pick(attack_noun)] across [target]'s face!")]") - if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_leg", "l_foot", "r_foot") + if(1 to 2) + user.visible_message("[user] scratched [target] across \his cheek!") + if(3 to 4) + user.visible_message("[user] [pick(attack_verb)] [target]'s [pick("head", "neck")]!") //'with spread claws' sounds a little bit odd, just enough that conciseness is better here I think + if(5) + user.visible_message(pick( + "[user] rakes \his [pick(attack_noun)] across [target]'s face!", + "[user] tears \his [pick(attack_noun)] into [target]'s face!", + )) + else // ----- BODY ----- // switch(attack_damage) if(1 to 2) user.visible_message("[user] scratched [target]'s [affecting.display_name]!") if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.display_name]!") - if(5) user.visible_message("[user] tears \his [pick(attack_noun)] deep into [target]'s [affecting.display_name]!") + if(5) user.visible_message("[user] tears \his [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.display_name]!") /datum/unarmed_attack/claws/strong - attack_verb = list("slash") + attack_verb = list("slashed") damage = 10 shredding = 1 /datum/unarmed_attack/bite/strong - attack_verb = list("maul") + attack_verb = list("mauled") damage = 15 shredding = 1 diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index b7b66d2fd4..bc46cf9c45 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -45,6 +45,20 @@ reagent_tag = IS_UNATHI base_color = "#066000" + heat_discomfort_level = 295 + heat_discomfort_strings = list( + "You feel soothingly warm.", + "You feel the heat sink into your bones.", + "You feel warm enough to take a nap." + ) + + cold_discomfort_level = 292 + cold_discomfort_strings = list( + "You feel chilly.", + "You feel sluggish and cold.", + "Your scales bristle against the cold." + ) + /datum/species/tajaran name = "Tajara" name_plural = "Tajaran" @@ -54,6 +68,9 @@ tail = "tajtail" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) darksight = 8 + slowdown = -1 + brute_mod = 1.2 + blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \ @@ -75,6 +92,14 @@ flesh_color = "#AFA59E" base_color = "#333333" + heat_discomfort_level = 292 + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + cold_discomfort_level = 275 + /datum/species/skrell name = "Skrell" name_plural = "Skrell" diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index 6079a3c044..c7c7fcc903 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -15,7 +15,7 @@ var/const/MAX_ACTIVE_TIME = 400 icon_state = "facehugger" item_state = "facehugger" w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4 - flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT + flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT body_parts_covered = FACE|EYES throw_range = 5 diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index ba738e81ef..c98e3788c0 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -35,17 +35,18 @@ switch(zone) // strong punches can have effects depending on where they hit if("head", "mouth", "eyes") // Induce blurriness - target.visible_message("[target] looks dazed.", "You see stars.") + target.visible_message("[target] looks momentarily disoriented.", "You see stars.") target.apply_effect(attack_damage*2, EYE_BLUR, armour) if("l_arm", "l_hand") if (target.l_hand) // Disarm left hand - target.visible_message("[src] [pick("dropped", "let go off")] \the [target.l_hand][pick("", " with a scream")]!") + //Urist McAssistant dropped the macguffin with a scream just sounds odd. Plus it doesn't work with NO_PAIN + target.visible_message("\The [target.l_hand] was knocked right out of [src]'s grasp!") target.drop_l_hand() if("r_arm", "r_hand") if (target.r_hand) // Disarm right hand - target.visible_message("[src] [pick("dropped", "let go off")] \the [target.r_hand][pick("", " with a scream")]!") + target.visible_message("\The [target.r_hand] was knocked right out of [src]'s grasp!") target.drop_r_hand() if("chest") if(!target.lying) @@ -113,21 +114,30 @@ if("head", "mouth", "eyes") // ----- HEAD ----- // switch(attack_damage) - if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!") - if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!") - if(5) user.visible_message("[user] gave [target] a resounding slap to the face!") - if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot") + if(1 to 2) + user.visible_message("[user] slapped [target] across \his cheek!") + if(3 to 4) + user.visible_message(pick( + 80; "[user] [pick(attack_verb)] [target] in the head!", //striking someone with a 'closed fist' is called punching them. + 20; "[user] struck [target] in the head[pick("", " with a closed fist")]!" + )) + if(5) + user.visible_message(pick( + 10; "[user] gave [target] a resounding slap to the face!", + 90; "[user] smashed \his [pick(attack_noun)] into [target]'s [organ]!" + )) + else // ----- BODY ----- // switch(attack_damage) if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") - if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!") + if(5) user.visible_message("[user] smashed \his [pick(attack_noun)] into [target]'s [organ]!") else - user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!") + user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "slammed their [pick(attack_noun)] into")] [target]'s [organ]!") //why do we have a separate set of verbs for lying targets? /datum/unarmed_attack/kick - attack_verb = list("kicked", "kneed") - attack_noun = list("kick", "knee strike") + attack_verb = list("kicked", "kicked", "kicked", "kneed") + attack_noun = list("kick", "kick", "kick", "knee strike") attack_sound = "swing_hit" damage = 0 @@ -161,7 +171,7 @@ attack_damage = Clamp(attack_damage, 1, 5) switch(attack_damage) - if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!") + if(1 to 2) user.visible_message("[user] threw [target] a glancing [pick(attack_noun)] to the [organ]!") //it's not that they're kicking lightly, it's that the kick didn't quite connect if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!") @@ -204,6 +214,6 @@ attack_damage = Clamp(attack_damage, 1, 5) switch(attack_damage) - if(1 to 2) user.visible_message("[user] [pick("clomped on", "treaded on")] [target]'s [organ]!") - if(3 to 4) user.visible_message("[pick("[user] stomped down on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") - if(5) user.visible_message("[pick("[user] landed a devastating stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") \ No newline at end of file + if(1 to 2) user.visible_message("[user] [pick("stepped on", "treaded on")] [target]'s [organ]!") //stepped on conveys the same meaning and is more recognizable as an actual word than "clomped" + if(3 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") + if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cc053f219d..19736bad3f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -126,8 +126,9 @@ Please contact me on #coderbus IRC. ~Carn x #define LEGCUFF_LAYER 19 #define L_HAND_LAYER 20 #define R_HAND_LAYER 21 -#define TARGETED_LAYER 22 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 22 +#define FIRE_LAYER 22 //If you're on fire +#define TARGETED_LAYER 23 //BS12: Layer for the target overlay from weapon targeting system +#define TOTAL_LAYERS 23 ////////////////////////////////// /mob/living/carbon/human @@ -508,6 +509,7 @@ proc/get_damage_icon_part(damage_state, body_part) update_inv_handcuffed(0) update_inv_legcuffed(0) update_inv_pockets(0) + update_fire(0) UpdateDamageIcon() update_icons() //Hud Stuff @@ -911,6 +913,13 @@ proc/get_damage_icon_part(damage_state, body_part) if(update_icons) update_icons() +/mob/living/carbon/human/update_fire(var/update_icons=1) + overlays_standing[FIRE_LAYER] = null + if(on_fire) + overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"=-FIRE_LAYER) + + if(update_icons) update_icons() + // Used mostly for creating head items /mob/living/carbon/human/proc/generate_head_icon() //gender no longer matters for the mouth, although there should probably be seperate base head icons. @@ -969,4 +978,5 @@ proc/get_damage_icon_part(damage_state, body_part) #undef L_HAND_LAYER #undef R_HAND_LAYER #undef TARGETED_LAYER +#undef FIRE_LAYER #undef TOTAL_LAYERS diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 0c6b9e147f..0c9882b215 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -5,7 +5,7 @@ if(say_disabled) //This is here to try to identify lag problems usr << "\red Speech is currently admin-disabled." return - + message = trim_strip_html_properly(message) log_whisper("[src.name]/[src.key] : [message]") @@ -36,6 +36,11 @@ //This is used by both the whisper verb and human/say() to handle whispering /mob/living/carbon/human/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") + + if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + src << "You're muzzled and cannot speak!" + return + var/message_range = 1 var/eavesdropping_range = 2 var/watching_range = 5 @@ -55,17 +60,19 @@ message = capitalize(trim(message)) - //TODO: handle_speech_problems for silent - if (!message || silent || miming) - return + if(speech_problem_flag) + var/list/handle_r = handle_speech_problems(message) + message = handle_r[1] + verb = handle_r[2] + if(verb == "yells loudly") + verb = "slurs emphatically" + else + var/adverb = pick("quietly", "softly") + verb = "[verb] [adverb]" - // Mute disability - //TODO: handle_speech_problems - if (src.sdisabilities & MUTE) - return + speech_problem_flag = handle_r[3] - //TODO: handle_speech_problems - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + if(!message || message=="") return //looks like this only appears in whisper. Should it be elsewhere as well? Maybe handle_speech_problems? @@ -102,10 +109,6 @@ message = replacetext(message, "u", "µ") message = replacetext(message, "b", "ß") - //TODO: handle_speech_problems - if (src.stuttering) - message = stutter(message) - var/list/listening = hearers(message_range, src) listening |= src diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index c5e7366218..d83e713e34 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -423,4 +423,372 @@ /mob/living/carbon/slime/can_use_vents() if(Victim) return "You cannot ventcrawl while feeding." + ..() + +/obj/item/slime_extract + name = "slime extract" + desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." + icon = 'icons/mob/slimes.dmi' + icon_state = "grey slime extract" + force = 1.0 + w_class = 1.0 + throwforce = 0 + throw_speed = 3 + throw_range = 6 + origin_tech = "biotech=4" + var/Uses = 1 // uses before it goes inert + var/enhanced = 0 //has it been enhanced before? + + attackby(obj/item/O as obj, mob/user as mob) + if(istype(O, /obj/item/weapon/slimesteroid2)) + if(enhanced == 1) + user << " This extract has already been enhanced!" + return ..() + if(Uses == 0) + user << " You can't enhance a used extract!" + return ..() + user <<"You apply the enhancer. It now has triple the amount of uses." + Uses = 3 + enhanced = 1 + del(O) + +/obj/item/slime_extract/New() + ..() + create_reagents(100) + +/obj/item/slime_extract/grey + name = "grey slime extract" + icon_state = "grey slime extract" + +/obj/item/slime_extract/gold + name = "gold slime extract" + icon_state = "gold slime extract" + +/obj/item/slime_extract/silver + name = "silver slime extract" + icon_state = "silver slime extract" + +/obj/item/slime_extract/metal + name = "metal slime extract" + icon_state = "metal slime extract" + +/obj/item/slime_extract/purple + name = "purple slime extract" + icon_state = "purple slime extract" + +/obj/item/slime_extract/darkpurple + name = "dark purple slime extract" + icon_state = "dark purple slime extract" + +/obj/item/slime_extract/orange + name = "orange slime extract" + icon_state = "orange slime extract" + +/obj/item/slime_extract/yellow + name = "yellow slime extract" + icon_state = "yellow slime extract" + +/obj/item/slime_extract/red + name = "red slime extract" + icon_state = "red slime extract" + +/obj/item/slime_extract/blue + name = "blue slime extract" + icon_state = "blue slime extract" + +/obj/item/slime_extract/darkblue + name = "dark blue slime extract" + icon_state = "dark blue slime extract" + +/obj/item/slime_extract/pink + name = "pink slime extract" + icon_state = "pink slime extract" + +/obj/item/slime_extract/green + name = "green slime extract" + icon_state = "green slime extract" + +/obj/item/slime_extract/lightpink + name = "light pink slime extract" + icon_state = "light pink slime extract" + +/obj/item/slime_extract/black + name = "black slime extract" + icon_state = "black slime extract" + +/obj/item/slime_extract/oil + name = "oil slime extract" + icon_state = "oil slime extract" + +/obj/item/slime_extract/adamantine + name = "adamantine slime extract" + icon_state = "adamantine slime extract" + +/obj/item/slime_extract/bluespace + name = "bluespace slime extract" + icon_state = "bluespace slime extract" + +/obj/item/slime_extract/pyrite + name = "pyrite slime extract" + icon_state = "pyrite slime extract" + +/obj/item/slime_extract/cerulean + name = "cerulean slime extract" + icon_state = "cerulean slime extract" + +/obj/item/slime_extract/sepia + name = "sepia slime extract" + icon_state = "sepia slime extract" + +/obj/item/slime_extract/rainbow + name = "rainbow slime extract" + icon_state = "rainbow slime extract" + +////Pet Slime Creation/// + +/obj/item/weapon/slimepotion + name = "docility potion" + desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The potion only works on baby slimes!" + return ..() + if(M.is_adult) //Can't tame adults + user << " Only baby slimes can be tamed!" + return..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.mind) + user << " The slime resists!" + return ..() + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + user <<"You feed the slime the potion, removing it's powers and calming it." + del(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + del(src) + +/obj/item/weapon/slimepotion2 + name = "advanced docility potion" + desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame. This one is meant for adult slimes" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime. + user << " The potion only works on slimes!" + return ..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.mind) + user << " The slime resists!" + return ..() + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + user <<"You feed the slime the potion, removing it's powers and calming it." + del(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + del(src) + + +/obj/item/weapon/slimesteroid + name = "slime steroid" + desc = "A potent chemical mix that will cause a slime to generate more extract." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The steroid only works on baby slimes!" + return ..() + if(M.is_adult) //Can't tame adults + user << " Only baby slimes can use the steroid!" + return..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.cores == 3) + user <<" The slime already has the maximum amount of extract!" + return..() + + user <<"You feed the slime the steroid. It now has triple the amount of extract." + M.cores = 3 + del(src) + +/obj/item/weapon/slimesteroid2 + name = "extract enhancer" + desc = "A potent chemical mix that will give a slime extract three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + + /*afterattack(obj/target, mob/user , flag) + if(istype(target, /obj/item/slime_extract)) + if(target.enhanced == 1) + user << " This extract has already been enhanced!" + return ..() + if(target.Uses == 0) + user << " You can't enhance a used extract!" + return ..() + user <<"You apply the enhancer. It now has triple the amount of uses." + target.Uses = 3 + target.enahnced = 1 + del(src)*/ + +/obj/effect/golemrune + anchored = 1 + desc = "a strange rune used to create golems. It glows when spirits are nearby." + name = "rune" + icon = 'icons/obj/rune.dmi' + icon_state = "golem" + unacidable = 1 + layer = TURF_LAYER + + New() + ..() + processing_objects.Add(src) + + process() + var/mob/dead/observer/ghost + for(var/mob/dead/observer/O in src.loc) + if(!O.client) continue + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue + ghost = O + break + if(ghost) + icon_state = "golem2" + else + icon_state = "golem" + + attack_hand(mob/living/user as mob) + var/mob/dead/observer/ghost + for(var/mob/dead/observer/O in src.loc) + if(!O.client) continue + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue + ghost = O + break + if(!ghost) + user << "The rune fizzles uselessly. There is no spirit nearby." + return + var/mob/living/carbon/human/G = new(src.loc) + G.set_species("Golem") + G.key = ghost.key + G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." + del (src) + + + proc/announce_to_ghosts() + for(var/mob/dead/observer/G in player_list) + if(G.client) + var/area/A = get_area(src) + if(A) + G << "Golem rune created in [A.name]." + +/mob/living/carbon/slime/has_eyes() + return 0 + +//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them//////////////////////// + +/* +// Basically this slime Core catalyzes reactions that normally wouldn't happen anywhere +/obj/item/slime_core + name = "slime extract" + desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." + icon = 'icons/mob/slimes.dmi' + icon_state = "slime extract" + force = 1.0 + w_class = 1.0 + throwforce = 1.0 + throw_speed = 2 + throw_range = 6 + origin_tech = "biotech=4" + var/POWERFLAG = 0 // sshhhhhhh + var/Flush = 30 + var/Uses = 5 // uses before it goes inert + +/obj/item/slime_core/New() + ..() + create_reagents(100) + POWERFLAG = rand(1,10) + Uses = rand(7, 25) + //flags |= NOREACT +/* + spawn() + Life() + + proc/Life() + while(src) + sleep(25) + Flush-- + if(Flush <= 0) + reagents.clear_reagents() + Flush = 30 +*/ + + + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime + name = "slime egg" + desc = "A small, gelatinous egg." + icon = 'icons/mob/mob.dmi' + icon_state = "slime egg-growing" + bitesize = 12 + origin_tech = "biotech=4" + var/grown = 0 + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New() ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("slimejelly", 1) + spawn(rand(1200,1500))//the egg takes a while to "ripen" + Grow() + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow() + grown = 1 + icon_state = "slime egg-grown" + processing_objects.Add(src) + return + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch() + processing_objects.Remove(src) + var/turf/T = get_turf(src) + src.visible_message(" The [name] pulsates and quivers!") + spawn(rand(50,100)) + src.visible_message(" The [name] bursts open!") + new/mob/living/carbon/slime(T) + del(src) + + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime/process() + var/turf/location = get_turf(src) + var/datum/gas_mixture/environment = location.return_air() + if (environment.phoron > MOLES_PHORON_VISIBLE)//phoron exposure causes the egg to hatch + src.Hatch() + +/obj/item/weapon/reagent_containers/food/snacks/egg/slime/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype( W, /obj/item/toy/crayon )) + return + else + ..() +*/ +>>>>>>> dev diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 20b80c9c89..016f57f18f 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -57,6 +57,9 @@ if(environment) // More error checking -- TLE handle_environment(environment) + //Check if we're on fire + handle_fire() + //Status updates, death etc. handle_regular_status_updates() update_canmove() @@ -629,3 +632,9 @@ proc/handle_changeling() if(mind && mind.changeling) mind.changeling.regenerate() + +/mob/living/carbon/monkey/handle_fire() + if(..()) + return + adjustFireLoss(6) + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 284f9e288f..ec69d454f6 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -5,7 +5,8 @@ #define M_L_HAND_LAYER 4 #define M_R_HAND_LAYER 5 #define TARGETED_LAYER 6 -#define M_TOTAL_LAYERS 6 +#define M_FIRE_LAYER 6 +#define M_TOTAL_LAYERS 7 ///////////////////////////////// /mob/living/carbon/monkey @@ -19,6 +20,7 @@ update_inv_r_hand(0) update_inv_l_hand(0) update_inv_handcuffed(0) + update_fire(0) update_icons() //Hud Stuff update_hud() @@ -109,6 +111,12 @@ overlays_standing[TARGETED_LAYER] = null if(update_icons) update_icons() +/mob/living/carbon/monkey/update_fire(var/update_icons=1) + if(on_fire) + overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) + else + overlays_standing[M_FIRE_LAYER] = null + if(update_icons) update_icons() //Monkey Overlays Indexes//////// #undef M_MASK_LAYER #undef M_BACK_LAYER @@ -116,5 +124,6 @@ #undef M_L_HAND_LAYER #undef M_R_HAND_LAYER #undef TARGETED_LAYER +#undef M_FIRE_LAYER #undef M_TOTAL_LAYERS diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 98512d92fc..6eb23964aa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -281,6 +281,8 @@ C.legcuffed = initial(C.legcuffed) hud_updateflag |= 1 << HEALTH_HUD hud_updateflag |= 1 << STATUS_HUD + ExtinguishMob() + fire_stacks = 0 /mob/living/proc/rejuvenate() @@ -490,17 +492,17 @@ var/mob/living/simple_animal/borer/B = src.loc var/mob/living/captive_brain/H = src - H << "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "\red You feel the captive mind of [src] begin to resist your control." + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." - spawn(rand(400,500)+B.host.brainloss) + spawn(rand(200,250)+B.host.brainloss) if(!B || !B.controlling) return B.host.adjustBrainLoss(rand(5,10)) - H << "\red With an immense exertion of will, you regain control of your body!" - B.host << "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." B.detatch() @@ -555,9 +557,9 @@ for(var/mob/O in viewers(C)) O.show_message("\red [usr] manages to unbuckle themself!", 1) C << "\blue You successfully unbuckle yourself." - C.buckled.manual_unbuckle(C) + C.buckled.user_unbuckle_mob(C) else - L.buckled.manual_unbuckle(L) + L.buckled.user_unbuckle_mob(L) //Breaking out of a locker? else if( src.loc && (istype(src.loc, /obj/structure/closet)) ) @@ -628,9 +630,21 @@ BD.attack_hand(usr) C.open() - //breaking out of handcuffs + //drop && roll or breaking out of handcuffs else if(iscarbon(L)) var/mob/living/carbon/CM = L + if(CM.on_fire && CM.canmove) + CM.fire_stacks -= 5 + CM.Weaken(3) + CM.spin(32,2) + CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ + "You stop, drop, and roll!") + sleep(30) + if(fire_stacks <= 0) + CM.visible_message("[CM] has successfully extinguished themselves!", \ + "You extinguish yourself.") + ExtinguishMob() + return if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) CM.next_move = world.time + 100 CM.last_special = world.time + 100 @@ -657,6 +671,8 @@ CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) del(CM.handcuffed) CM.handcuffed = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() CM.update_inv_handcuffed() else var/obj/item/weapon/handcuffs/HC = CM.handcuffed @@ -841,4 +857,22 @@ return 1 /mob/living/proc/slip(var/slipped_on,stun_duration=8) - return 0 \ No newline at end of file + return 0 + +/mob/living/carbon/proc/spin(spintime, speed) + spawn() + var/D = dir + while(spintime >= speed) + sleep(speed) + switch(D) + if(NORTH) + D = EAST + if(SOUTH) + D = WEST + if(EAST) + D = SOUTH + if(WEST) + D = NORTH + set_dir(D) + spintime -= speed + return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4ac03cdf5f..1be8ea4ac9 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -100,14 +100,14 @@ ..() //this proc handles being hit by a thrown atom -/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve +/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve if(istype(AM,/obj/)) var/obj/O = AM var/dtype = BRUTE if(istype(O,/obj/item/weapon)) var/obj/item/weapon/W = O dtype = W.damtype - var/throw_damage = O.throwforce*(speed/5) + var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR) var/miss_chance = 15 if (O.throw_source) @@ -136,9 +136,9 @@ msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") // Begin BS12 momentum-transfer code. - if(O.throw_source && speed >= 15) + if(O.throw_source && speed >= THROWNOBJ_KNOCKBACK_SPEED) var/obj/item/weapon/W = O - var/momentum = speed/2 + var/momentum = speed/THROWNOBJ_KNOCKBACK_DIVISOR var/dir = get_dir(O.throw_source, src) visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") @@ -191,3 +191,52 @@ src.visible_message("[user] has [attack_message] [src]!") spawn(1) updatehealth() return 1 + +/mob/living/proc/IgniteMob() + if(fire_stacks > 0 && !on_fire) + on_fire = 1 + src.AddLuminosity(3) + update_fire() + +/mob/living/proc/ExtinguishMob() + if(on_fire) + on_fire = 0 + fire_stacks = 0 + src.AddLuminosity(-3) + update_fire() + +/mob/living/proc/update_fire() + return + +/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person + fire_stacks = Clamp(fire_stacks + add_fire_stacks, min = FIRE_MIN_STACKS, max = FIRE_MAX_STACKS) + +/mob/living/proc/handle_fire() + if(fire_stacks < 0) + fire_stacks = max(0, fire_stacks++) //If we've doused ourselves in water to avoid fire, dry off slowly + + if(!on_fire) + return 1 + else if(fire_stacks <= 0) + ExtinguishMob() //Fire's been put out. + return 1 + + var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment + if(G.gas["oxygen"] < 1) + ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire + return 1 + + var/turf/location = get_turf(src) + location.hotspot_expose(fire_burn_temperature(), 50, 1) + +/mob/living/fire_act() + adjust_fire_stacks(0.5) + IgniteMob() + +//Finds the effective temperature that the mob is burning at. +/mob/living/proc/fire_burn_temperature() + if (fire_stacks <= 0) + return 0 + + //Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot. + return round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 3c1c8a935c..a9cbcbe0dd 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -37,4 +37,7 @@ var/tod = null // Time of death var/update_slimes = 1 - var/silent = null //Can't talk. Value goes down every life proc. \ No newline at end of file + var/silent = null // Can't talk. Value goes down every life proc. + var/mob_size // Used by lockers. + var/on_fire = 0 //The "Are we on fire?" var + var/fire_stacks diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ff948d2387..c25e833c08 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -141,7 +141,7 @@ var/list/ai_verbs_default = list( if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. - new/obj/structure/AIcore/deactivated(loc)//New empty terminal. + empty_playable_ai_cores += new/obj/structure/AIcore/deactivated(loc)//New empty terminal. del(src)//Delete AI. return else diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 34281e8c0c..4b408193b7 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -54,4 +54,4 @@ var/obj/item/device/aicard/card = loc card.update_icon() - return ..(gibbed) + return ..(gibbed,"gives one shrill beep before falling lifeless.") diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 87dc0ec87e..d94f705320 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -7,10 +7,16 @@ var/datum/cameranet/cameranet = new() /datum/cameranet // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). var/list/cameras = list() + var/cameras_unsorted = 1 // The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 +/datum/cameranet/proc/process_sort() + if(cameras_unsorted) + cameras = dd_sortedObjectList(cameras) + cameras_unsorted = 0 + // Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) x &= ~0xf diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 17293f2b67..d86d71607f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -1,17 +1,19 @@ // AI EYE // -// An invisible (no icon) mob that the AI controls to look around the station with. +// A mob that the AI controls to look around the station with. // It streams chunks as it moves around, which will show it what the AI can and cannot see. /mob/aiEye name = "Inactive AI Eye" - icon = 'icons/obj/status_display.dmi' // For AI friend secret shh :o + icon = 'icons/mob/AI.dmi' + icon_state = "eye" + alpha = 127 var/list/visibleCameraChunks = list() var/mob/living/silicon/ai/ai = null density = 0 status_flags = GODMODE // You can't damage it. - mouse_opacity = 0 see_in_dark = 7 + invisibility = INVISIBILITY_AI_EYE // Movement code. Returns 0 to stop air movement from moving it. /mob/aiEye/Move() diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm index 813d4f2471..e6311e7a00 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm @@ -92,7 +92,13 @@ /obj/machinery/camera/New() ..() - cameranet.cameras += src //Camera must be added to global list of all cameras no matter what... + //Camera must be added to global list of all cameras no matter what... + if(cameranet.cameras_unsorted || !ticker) + cameranet.cameras += src + cameranet.cameras_unsorted = 1 + else + dd_insertObjectList(cameranet.cameras, src) + var/list/open_networks = difflist(network,restricted_camera_networks) //...but if all of camera's networks are restricted, it only works for specific camera consoles. if(open_networks.len) //If there is at least one open network, chunk is available for AI usage. cameranet.addCamera(src) diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm new file mode 100644 index 0000000000..8aca00a711 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -0,0 +1,44 @@ +var/global/list/empty_playable_ai_cores = list() + +/hook/roundstart/proc/spawn_empty_ai() + for(var/obj/effect/landmark/start/S in landmarks_list) + if(S.name != "AI") + continue + if(locate(/mob/living) in S.loc) + continue + empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(get_turf(S)) + + return 1 + +/mob/living/silicon/ai/verb/wipe_core() + set name = "Wipe Core" + set category = "OOC" + set desc = "Wipe your core. This is functionally equivalent to cryo or robotic storage, freeing up your job slot." + + if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") + usr << "You cannot use this verb in malfunction. If you need to leave, please adminhelp." + return + + // Guard against misclicks, this isn't the sort of thing we want happening accidentally + if(alert("WARNING: This will immediately wipe your core and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?", + "Wipe Core", "No", "No", "Yes") != "Yes") + return + + // We warned you. + empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(loc) + global_announcer.autosay("[src] has been moved to intelligence storage.", "Artificial Intelligence Oversight") + + //Handle job slot/tater cleanup. + var/job = mind.assigned_role + + job_master.FreeRole(job) + + if(mind.objectives.len) + del(mind.objectives) + mind.special_role = null + else + if(ticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + current_mode.possible_traitors.Remove(src) + + del(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index cf11f2d211..7686cd4344 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -59,7 +59,7 @@ src.sight |= SEE_MOBS src.sight |= SEE_OBJS src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO + src.see_invisible = SEE_INVISIBLE_LIVING //Congratulations! You've found a way for AI's to run without using power! diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 10de649a79..a334809a37 100755 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -390,6 +390,9 @@ ..() else src << "You are too small to pull that." + else + src << "You are too small to pull that." + return // No binary for pAIs. /mob/living/silicon/pai/binarycheck() diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 0300410316..650b20cf7c 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -58,32 +58,32 @@ var/datum/paiController/paiController // Global handler for pAI candidates if("name") t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text if(t) - candidate.name = copytext(sanitize(t),1,MAX_NAME_LEN) + candidate.name = sanitize(copytext(t,1,MAX_NAME_LEN)) if("desc") t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message if(t) - candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.description = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if("role") t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text if(t) - candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.role = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if("ooc") t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message if(t) - candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.comments = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) if("save") candidate.savefile_save(usr) if("load") candidate.savefile_load(usr) //In case people have saved unsanitized stuff. if(candidate.name) - candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN) + candidate.name = sanitize(copytext(candidate.name,1,MAX_NAME_LEN)) if(candidate.description) - candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN) + candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN)) if(candidate.role) - candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN) + candidate.role = sanitize(copytext(candidate.role,1,MAX_MESSAGE_LEN)) if(candidate.comments) - candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) + candidate.comments = sanitize(copytext(candidate.comments,1,MAX_MESSAGE_LEN)) if("submit") if(candidate) diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index eaef5607cb..0f84806a1f 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -6,7 +6,7 @@ icon_state = "robotanalyzer" item_state = "analyzer" desc = "A hand-held scanner able to diagnose robotic injuries." - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 w_class = 2.0 diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 1b132cf27d..794b983f66 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -234,3 +234,7 @@ sight_mode |= module_state_3:sight_mode else src << "You need to disable a module first!" + +/mob/living/silicon/robot/put_in_hands(var/obj/item/W) // No hands. + W.loc = get_turf(src) + return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index aeebc30bb3..b72e822e57 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -23,6 +23,11 @@ var/list/robot_verbs_default = list( var/integrated_light_power = 6 var/datum/wires/robot/wires +//Icon stuff + + var/icontype //Persistent icontype tracking allows for cleaner icon updates + var/module_sprites[0] //Used to store the associations between sprite names and sprite index. + //Hud stuff var/obj/screen/cells = null @@ -106,6 +111,8 @@ var/list/robot_verbs_default = list( robot_modules_background.icon_state = "block" robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. ident = rand(1, 999) + module_sprites["Basic"] = "robot" + icontype = "Default" updatename("Default") updateicon() @@ -227,11 +234,10 @@ var/list/robot_verbs_default = list( modules+="Combat" modtype = input("Please, select a module!", "Robot", null, null) in modules - var/module_sprites[0] //Used to store the associations between sprite names and sprite index. - if(module) return + module_sprites = list() switch(modtype) if("Standard") module = new /obj/item/weapon/robot_module/standard(src) @@ -958,38 +964,25 @@ var/list/robot_verbs_default = list( overlays.Cut() if(stat == 0) - overlays += "eyes" - overlays.Cut() - overlays += "eyes-[icon_state]" - else - overlays -= "eyes" - - if(opened && custom_sprite == 1) //Custom borgs also have custom panels, heh - if(wiresexposed) - overlays += "[src.ckey]-openpanel +w" - else if(cell) - overlays += "[src.ckey]-openpanel +c" - else - overlays += "[src.ckey]-openpanel -c" + overlays += "eyes-[module_sprites[icontype]]" if(opened) + var/panelprefix = custom_sprite ? src.ckey : "ov" if(wiresexposed) - overlays += "ov-openpanel +w" + overlays += "[panelprefix]-openpanel +w" else if(cell) - overlays += "ov-openpanel +c" + overlays += "[panelprefix]-openpanel +c" else - overlays += "ov-openpanel -c" + overlays += "[panelprefix]-openpanel -c" if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - overlays += "[icon_state]-shield" + overlays += "[module_sprites[icontype]]-shield" if(modtype == "Combat") - var/base_icon = "" - base_icon = icon_state if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) - icon_state = "[icon_state]-roll" + icon_state = "[module_sprites[icontype]]-roll" else - icon_state = base_icon + icon_state = module_sprites[icontype] return //Call when target overlay should be added/removed @@ -1222,8 +1215,6 @@ var/list/robot_verbs_default = list( else triesleft-- - var/icontype - if (custom_sprite == 1) icontype = "Custom" triesleft = 0 @@ -1304,4 +1295,5 @@ var/list/robot_verbs_default = list( if(2) //New Module connected_ai << "

    NOTICE - [braintype] module change detected: [name] has loaded the [module.name].
    " if(3) //New Name - connected_ai << "

    NOTICE - [braintype] reclassification detected: [oldname] is now designated as [newname].
    " \ No newline at end of file + if(oldname != newname) + connected_ai << "

    NOTICE - [braintype] reclassification detected: [oldname] is now designated as [newname].
    " diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e8fa3727ce..3458a5bb47 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -4,7 +4,7 @@ icon_state = "std_module" w_class = 100.0 item_state = "electronic" - flags = FPRINT|TABLEPASS | CONDUCT + flags = CONDUCT var/channels = list() var/list/modules = list() var/obj/item/emag = null @@ -34,8 +34,11 @@ if(!stacktypes || !stacktypes.len) return for(var/T in stacktypes) - var/O = locate(T) in src.modules - var/obj/item/stack/S = O + var/obj/item/stack/S + for(var/obj/O in src.modules) + if(O.type == T) + S = O + break if(!S) src.modules -= null @@ -43,6 +46,9 @@ src.modules |= S S.amount = 1 + if(!istype(S)) + continue + if(S && S.amount < stacktypes[T]) S.amount++ diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c20e8e058b..4917c222e4 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -226,14 +226,14 @@ set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = copytext(sanitize(input(usr, "This is [src]. It is...", "Pose", null) as text), 1, MAX_MESSAGE_LEN) + pose = sanitize(copytext(input(usr, "This is [src]. It is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN)) /mob/living/silicon/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1) + flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1)) /mob/living/silicon/binarycheck() return 1 @@ -277,4 +277,4 @@ if (stat != 2) adjustBruteLoss(30) - updatehealth() + updatehealth() diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 5ee2e2b10a..3a5f2f17e5 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "bees1" icon_dead = "bees1" + mob_size = 1 var/strength = 1 var/feral = 0 var/mut = 0 diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index 3591523477..43aa9a9d68 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -174,7 +174,7 @@ //Procs for grabbing players. /mob/living/simple_animal/borer/proc/request_player() for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Syndicate")) + if(jobban_isbanned(O, "Borer")) continue if(O.client) if(O.client.prefs.be_special & BE_ALIEN) @@ -193,15 +193,21 @@ /mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate) - if(!candidate) + if(!candidate || !candidate.mob || !candidate.mob.mind) return src.mind = candidate.mob.mind + candidate.mob.mind.current = src src.ckey = candidate.ckey + if(src.mind) src.mind.assigned_role = "Cortical Borer" src.mind.special_role = "Cortical Borer" - ticker.mode.borers |= src.mind + + src << "You are a cortical borer! You are a brain slug that worms its way \ + into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \ + your host and your eventual spawn safe and warm." + src << "You can speak to your victim with say, to other borers with say :x, and use your Abilities tab to access powers." /mob/living/simple_animal/borer/can_use_vents() return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 39b2cadf1d..59f6aed6f0 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -69,6 +69,10 @@ if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M + var/datum/organ/external/E = H.organs_by_name["head"] + if(!E || (E.status & ORGAN_DESTROYED)) + src << "\The [H] does not have a head!" + if(!H.species.has_organ["brain"]) src << "\The [H] does not seem to have an ear canal to breach." return @@ -124,6 +128,7 @@ src << "They are no longer in range!" return +/* /mob/living/simple_animal/borer/verb/devour_brain() set category = "Abilities" set name = "Devour Brain" @@ -147,6 +152,7 @@ src << "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry..." replace_brain() +*/ // BRAIN WORM ZOMBIES AAAAH. /mob/living/simple_animal/borer/proc/replace_brain() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 79295a9b5b..5e3e91b90f 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -129,6 +129,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 attacktext = "smashed their armoured gauntlet into" + mob_size = 20 speed = 3 wall_smash = 1 attack_sound = 'sound/weapons/punch3.ogg' @@ -259,6 +260,7 @@ speed = 5 wall_smash = 1 attack_sound = 'sound/weapons/punch4.ogg' + mob_size = 20 var/energy = 0 var/max_energy = 1000 diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 642a7df8e4..7913d23d7e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -22,6 +22,7 @@ minbodytemp = 223 //Below -50 Degrees Celcius maxbodytemp = 323 //Above 50 Degrees Celcius holder_type = /obj/item/weapon/holder/cat + mob_size = 5 /mob/living/simple_animal/cat/Life() //MICE! @@ -50,7 +51,7 @@ if(turns_since_scan > 5) walk_to(src,0) turns_since_scan = 0 - + if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) movement_target = null stop_automated_movement = 0 @@ -68,7 +69,7 @@ /mob/living/simple_animal/cat/MouseDrop(atom/over_object) var/mob/living/carbon/H = over_object - if(!istype(H)) return ..() + if(!istype(H) || !Adjacent(H)) return ..() if(H.a_intent == "help") get_scooped(H) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 162038dd07..8cce2342df 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -18,6 +18,8 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 + mob_size = 8 + var/obj/item/inventory_head var/obj/item/inventory_back var/facehugger diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index c85f5bc734..bf59a7e546 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -17,6 +17,7 @@ response_harm = "stomps" stop_automated_movement = 1 friendly = "pinches" + mob_size = 5 var/obj/item/inventory_head var/obj/item/inventory_mask diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index d4677ef5d3..66fb31406a 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -14,4 +14,5 @@ melee_damage_upper = 2 response_help = "pets" response_disarm = "shoos" - response_harm = "stomps on" \ No newline at end of file + response_harm = "stomps on" + mob_size = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c6f3cfb87c..5b207ce2a7 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -28,6 +28,7 @@ maxbodytemp = 323 //Above 50 Degrees Celcius universal_speak = 0 universal_understand = 1 + mob_size = 1 /mob/living/simple_animal/mouse/Life() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 1aff173aa7..89cfe60b65 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -5,6 +5,7 @@ max_co2 = 0 minbodytemp = 0 maxbodytemp = 500 + mob_size = 5 var/obj/item/device/radio/borg/radio = null var/mob/living/silicon/ai/connected_ai = null diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 568998a3c6..03bf90b0f5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -113,7 +113,11 @@ /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7) var/list/L = hearers(src, dist) - L += mechas_list + + for (var/obj/mecha/M in mechas_list) + if (get_dist(src, M) <= dist) + L += M + return L /mob/living/simple_animal/hostile/death() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 491d5cdf74..74f6c85eb9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -372,3 +372,7 @@ message = capitalize(trim_left(message)) ..(message, null, verb) + +/mob/living/simple_animal/put_in_hands(var/obj/item/W) // No hands. + W.loc = get_turf(src) + return 1 \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1d0150ecf6..15347c2580 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -130,14 +130,14 @@ return 1 return 0 -//This is a SAFE proc. Use this instead of equip_to_splot()! +//This is a SAFE proc. Use this instead of equip_to_slot()! //set del_on_fail to have it delete W if it fails to equip //set disable_warning to disable the 'you are unable to equip that' warning. //unset redraw_mob to prevent the mob from being redrawn at the end. /mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1) if(!istype(W)) return 0 - if(!W.mob_can_equip(src, slot, disable_warning)) + if(!W.mob_can_equip(src, slot)) if(del_on_fail) del(W) else @@ -839,12 +839,9 @@ note dizziness decrements automatically in the mob's Life() proc. // facing verbs /mob/proc/canface() if(!canmove) return 0 - if(client.moving) return 0 - if(world.time < client.move_delay) return 0 - if(stat==2) return 0 + if(stat) return 0 if(anchored) return 0 if(monkeyizing) return 0 - if(restrained()) return 0 return 1 //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. @@ -856,21 +853,17 @@ note dizziness decrements automatically in the mob's Life() proc. canmove = 0 pixel_y = V.mob_offset_y - 5 else - lying = 0 + if(buckled.buckle_lying != -1) lying = buckled.buckle_lying canmove = 1 pixel_y = V.mob_offset_y else if(buckled) - if (!buckled.movable) + if(buckled.buckle_lying != -1) lying = buckled.buckle_lying + if (!buckled.buckle_movable) anchored = 1 canmove = 0 - if(istype(buckled,/obj/structure/stool/bed/chair) ) - lying = 0 - else - lying = 1 else anchored = 0 canmove = 1 - lying = 0 else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) lying = 1 canmove = 0 @@ -904,9 +897,10 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/facedir(var/ndir) - if(!canface()) return 0 + if(!canface() || client.moving || world.time < client.move_delay) + return 0 set_dir(ndir) - if(buckled && buckled.movable) + if(buckled && buckled.buckle_movable) buckled.set_dir(ndir) client.move_delay += movement_delay() return 1 @@ -938,6 +932,7 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/Stun(amount) if(status_flags & CANSTUN) + facing_dir = null stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun return @@ -953,6 +948,7 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/Weaken(amount) if(status_flags & CANWEAKEN) + facing_dir = null weakened = max(max(weakened,amount),0) update_canmove() //updates lying, canmove and icons return @@ -971,6 +967,7 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/Paralyse(amount) if(status_flags & CANPARALYSE) + facing_dir = null paralysis = max(max(paralysis,amount),0) return @@ -985,6 +982,7 @@ note dizziness decrements automatically in the mob's Life() proc. return /mob/proc/Sleeping(amount) + facing_dir = null sleeping = max(max(sleeping,amount),0) return @@ -997,6 +995,7 @@ note dizziness decrements automatically in the mob's Life() proc. return /mob/proc/Resting(amount) + facing_dir = null resting = max(max(resting,amount),0) return @@ -1160,3 +1159,55 @@ mob/proc/yank_out_object() /mob/proc/updateicon() return + +/mob/verb/face_direction() + + set name = "Face Direction" + set category = "IC" + set src = usr + + set_face_dir() + + if(!facing_dir) + usr << "You are now not facing anything." + else + usr << "You are now facing [dir2text(facing_dir)]." + +/mob/proc/set_face_dir(var/newdir) + if(newdir) + set_dir(newdir) + facing_dir = newdir + else if(facing_dir) + facing_dir = null + else + set_dir(dir) + facing_dir = dir + +/mob/set_dir() + if(facing_dir) + if(!canface() || lying || buckled || restrained()) + facing_dir = null + else if(dir != facing_dir) + return ..(facing_dir) + else + return ..() + +/mob/verb/northfaceperm() + set hidden = 1 + facing_dir = null + set_face_dir(NORTH) + +/mob/verb/southfaceperm() + set hidden = 1 + facing_dir = null + set_face_dir(SOUTH) + +/mob/verb/eastfaceperm() + set hidden = 1 + facing_dir = null + set_face_dir(EAST) + +/mob/verb/westfaceperm() + set hidden = 1 + facing_dir = null + set_face_dir(WEST) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 296d58d078..1b9f1c1b76 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -90,6 +90,7 @@ var/list/languages = list() // For speaking/listening. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. var/emote_type = 1 // Define emote default type, 1 for seen emotes, 2 for heard emotes + var/facing_dir = null // Used for the ancient art of moonwalking. var/name_archive //For admin things like possession @@ -214,7 +215,7 @@ var/universal_understand = 0 // Set to 1 to enable the mob to understand everyone, not necessarily speak var/stance_damage = 0 //Whether this mob's ability to stand has been affected - + //SSD var, changed it up some so people can have special things happen for different mobs when SSD. var/player_logged = 0 diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index d6e6496f9d..ed11358838 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -193,16 +193,16 @@ return if(M == assailant && state >= GRAB_AGGRESSIVE) - var/can_eat + var/can_eat if((FAT in user.mutations) && ismonkey(affecting)) can_eat = 1 else var/mob/living/carbon/human/H = user - if(istype(H) && iscarbon(affecting) && H.species.gluttonous) + if(istype(H) && H.species.gluttonous) if(H.species.gluttonous == 2) can_eat = 2 - else if(!ishuman(affecting)) + else if(!ishuman(affecting) && !ismonkey(affecting) && (affecting.small || iscarbon(affecting))) can_eat = 1 if(can_eat) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9542cb9689..3c983bcc22 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -305,7 +305,7 @@ proc/slur(phrase) n_letter = text("[n_letter]-[n_letter]") t = text("[t][n_letter]")//since the above is ran through for each letter, the text just adds up back to the original word. p++//for each letter p is increased to find where the next letter will be. - return copytext(sanitize(t),1,MAX_MESSAGE_LEN) + return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added @@ -352,7 +352,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp n_letter = text("[n_letter]") t = text("[t][n_letter]") p=p+n_mod - return copytext(sanitize(t),1,MAX_MESSAGE_LEN) + return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) /proc/shake_camera(mob/M, duration, strength=1) @@ -360,6 +360,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return M.shakecamera = 1 spawn(1) + if(!M.client) + return var/atom/oldeye=M.client.eye var/aiEyeFlag = 0 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a07e538e1e..78817c9ccf 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -284,7 +284,7 @@ proc/IsJobAvailable(rank) var/datum/job/job = job_master.GetJob(rank) if(!job) return 0 - if((job.current_positions >= job.total_positions) && job.total_positions != -1) return 0 + if(!job.is_position_available()) return 0 if(jobban_isbanned(src,rank)) return 0 if(!job.player_old_enough(src.client)) return 0 return 1 @@ -313,6 +313,24 @@ UpdateFactionList(character) EquipCustomItems(character) + // AIs don't need a spawnpoint, they must spawn at an empty core + if(character.mind.assigned_role == "AI") + + character = character.AIize(move=0) // AIize the character, but don't move them yet + + // IsJobAvailable for AI checks that there is an empty core available in this list + var/obj/structure/AIcore/deactivated/C = empty_playable_ai_cores[1] + empty_playable_ai_cores -= C + + character.loc = C.loc + + AnnounceCyborg(character, rank, "has been downloaded to the empty core in \the [character.loc.loc]") + ticker.mode.latespawn(character) + + del(C) + del(src) + return + //Find our spawning point. var/join_message var/datum/spawnpoint/S @@ -356,20 +374,16 @@ proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) if (ticker.current_state == GAME_STATE_PLAYING) - var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI. if(character.mind.role_alt_title) rank = character.mind.role_alt_title - a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") - del(a) + global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) if (ticker.current_state == GAME_STATE_PLAYING) - var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI. if(character.mind.role_alt_title) rank = character.mind.role_alt_title // can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc. - a.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") - del(a) + global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") proc/LateChoices() var/mills = world.time // 1/10 of a second, not real milliseconds but whatever diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 532ffd4f2d..998c241498 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -13,6 +13,7 @@ usr << "\red Speech is currently admin-disabled." return //Let's try to make users fix their errors - we try to detect single, out-of-place letters and 'unintended' words + /* var/first_letter = copytext(message,1,2) if((copytext(message,2,3) == " " && first_letter != "I" && first_letter != "A" && first_letter != ";") || cmptext(copytext(message,1,5), "say ") || cmptext(copytext(message,1,4), "me ") || cmptext(copytext(message,1,6), "looc ") || cmptext(copytext(message,1,5), "ooc ") || cmptext(copytext(message,2,6), "say ")) var/response = alert(usr, "Do you really want to say this using the *say* verb?\n\n[message]\n", "Confirm your message", "Yes", "Edit message", "No") @@ -22,6 +23,7 @@ return else if(response == "No") return + */ set_typing_indicator(0) usr.say(message) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index b4530b0767..d6181f5ec7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -56,13 +56,13 @@ spawning = 1 return ..() -/mob/living/carbon/human/AIize() +/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb if (monkeyizing) return for(var/t in organs) del(t) - return ..() + return ..(move) /mob/living/carbon/AIize() if (monkeyizing) @@ -75,7 +75,7 @@ invisibility = 101 return ..() -/mob/proc/AIize() +/mob/proc/AIize(move=1) if(client) src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs var/mob/living/silicon/ai/O = new (loc, base_law_type,,1)//No MMI but safety is in effect. @@ -88,37 +88,38 @@ else O.key = key - var/obj/loc_landmark - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name != "AI") - continue - if (locate(/mob/living) in sloc.loc) - continue - loc_landmark = sloc - if (!loc_landmark) - for(var/obj/effect/landmark/tripai in landmarks_list) - if (tripai.name == "tripai") - if(locate(/mob/living) in tripai.loc) - continue - loc_landmark = tripai - if (!loc_landmark) - O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." + if(move) + var/obj/loc_landmark for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name == "AI") - loc_landmark = sloc + if (sloc.name != "AI") + continue + if ((locate(/mob/living) in sloc.loc) || (locate(/obj/structure/AIcore) in sloc.loc)) + continue + loc_landmark = sloc + if (!loc_landmark) + for(var/obj/effect/landmark/tripai in landmarks_list) + if (tripai.name == "tripai") + if((locate(/mob/living) in tripai.loc) || (locate(/obj/structure/AIcore) in tripai.loc)) + continue + loc_landmark = tripai + if (!loc_landmark) + O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name == "AI") + loc_landmark = sloc - O.loc = loc_landmark.loc - for (var/obj/item/device/radio/intercom/comm in O.loc) - comm.ai += O + O.loc = loc_landmark.loc + for (var/obj/item/device/radio/intercom/comm in O.loc) + comm.ai += O O.on_mob_init() O.add_ai_verbs() O.rename_self("ai",1) - . = O - del(src) - + spawn(0) + del(src) + return O //human -> robot /mob/living/carbon/human/proc/Robotize() diff --git a/code/modules/nano/JSON Writer.dm b/code/modules/nano/JSON Writer.dm index 3cd3520f17..65b9d99eb0 100644 --- a/code/modules/nano/JSON Writer.dm +++ b/code/modules/nano/JSON Writer.dm @@ -1,7 +1,7 @@ json_writer proc - WriteObject(list/L) + WriteObject(list/L, cached_data = null) . = "{" var/i = 1 for(var/k in L) @@ -9,7 +9,9 @@ json_writer . += {"\"[k]\":[write(val)]"} if(i++ < L.len) . += "," - .+= "}" + if(cached_data) + . = copytext(., 1, lentext(.)) + ",\"cached\":[cached_data]}" + . += "}" write(val) if(isnum(val)) diff --git a/code/modules/nano/_JSON.dm b/code/modules/nano/_JSON.dm index 5692e643ba..4f70e6e664 100644 --- a/code/modules/nano/_JSON.dm +++ b/code/modules/nano/_JSON.dm @@ -7,6 +7,6 @@ proc var/static/json_reader/_jsonr = new() return _jsonr.ReadObject(_jsonr.ScanJson(json)) - list2json(list/L) + list2json(list/L, var/cached_data = null) var/static/json_writer/_jsonw = new() - return _jsonw.WriteObject(L) + return _jsonw.WriteObject(L, cached_data) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 91e97c0cb5..8861d1fabc 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -57,6 +57,8 @@ nanoui is used to open and update nano browser uis // the current status/visibility of the ui var/status = STATUS_INTERACTIVE + var/cached_data = null + // Only allow users with a certain user.stat to get updates. Defaults to 0 (concious) var/allowed_user_stat = 0 // -1 = ignore, 0 = alive, 1 = unconcious or alive, 2 = dead concious or alive @@ -138,7 +140,10 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - if (istype(user, /mob/living/silicon/ai) || (get_dist(get_turf(user),get_turf(src_object)) <= 1)) + if (istype(user, /mob/dead/observer)) + /* Ghosts see updates but can't interact */ + set_status(STATUS_UPDATE, push_update) + else if (istype(user, /mob/living/silicon/ai) || (get_dist(get_turf(user),get_turf(src_object)) <= 1)) set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) else if (istype(user, /mob/living/silicon/robot)) if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles @@ -366,7 +371,7 @@ nanoui is used to open and update nano browser uis template_data_json = list2json(templates) var/list/send_data = get_send_data(initial_data) - var/initial_data_json = list2json(send_data) + var/initial_data_json = list2json(send_data, cached_data) var/url_parameters_json = list2json(list("src" = "\ref[src]")) @@ -442,6 +447,19 @@ nanoui is used to open and update nano browser uis winset(user, window_id, "on-close=\"nanoclose [params]\"") +/** + * Appends already processed json txt to the list2json proc when setting initial-data and data pushes + * Used for data that is fucking huge like manifests and camera lists that doesn't change often. + * And we only want to process them when they change. + * Fuck javascript + * + * @return nothing + */ +/datum/nanoui/proc/load_cached_data(var/data) + cached_data = data + return + + /** * Push data to an already open UI window * @@ -455,7 +473,7 @@ nanoui is used to open and update nano browser uis var/list/send_data = get_send_data(data) //user << list2json(data) // used for debugging - user << output(list2params(list(list2json(send_data))),"[window_id].browser:receiveUpdateData") + user << output(list2params(list(list2json(send_data,cached_data))),"[window_id].browser:receiveUpdateData") /** * This Topic() proc is called whenever a user clicks on a link within a Nano UI diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 8d4144a550..067ef6a42e 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -290,29 +290,24 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) source.data["blood_type"] = donor.dna.b_type // Are we dripping or splattering? - if(!large) - - // Only a certain number of drips can be on a given turf. - var/list/drips = list() - var/list/drip_icons = list("1","2","3","4","5") - - for(var/obj/effect/decal/cleanable/blood/drip/drop in T) - drips += drop - drip_icons.Remove(drop.icon_state) - - // If we have too many drips, remove them and spawn a proper blood splatter. - if(drips.len >= 5) - //TODO: copy all virus data from drips to new splatter? - for(var/obj/effect/decal/cleanable/blood/drip/drop in drips) - del drop - else - decal_type = /obj/effect/decal/cleanable/blood/drip + var/list/drips = list() + // Only a certain number of drips (or one large splatter) can be on a given turf. + for(var/obj/effect/decal/cleanable/blood/drip/drop in T) + drips |= drop.drips + del(drop) + if(!large && drips.len < 3) + decal_type = /obj/effect/decal/cleanable/blood/drip // Find a blood decal or create a new one. B = locate(decal_type) in T if(!B) B = new decal_type(T) + var/obj/effect/decal/cleanable/blood/drip/drop = B + if(istype(drop) && drips && drips.len && !large) + drop.overlays |= drips + drop.drips |= drips + // If there's no data to copy, call it quits here. if(!source) return B @@ -330,11 +325,7 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) else B.blood_DNA[source.data["blood_DNA"]] = "O+" - // Update virus information. //Looks like this is out of date. - //for(var/datum/disease/D in source.data["viruses"]) - // var/datum/disease/new_virus = D.Copy(1) - // source.viruses += new_virus - // new_virus.holder = B + // Update virus information. if(source.data["virus2"]) B.virus2 = virus_copylist(source.data["virus2"]) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index f6d5de69cb..b45d0aafa7 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -562,7 +562,7 @@ Note that amputating the affected organ does in fact remove the infection from t O.setAmputatedTree() //Handles dismemberment -/datum/organ/external/proc/droplimb(var/override = 0,var/no_explode = 0) +/datum/organ/external/proc/droplimb(var/override = 0,var/no_explode = 0,var/amputation=0) if(destspawn) return if(override) status |= ORGAN_DESTROYED @@ -579,9 +579,13 @@ Note that amputating the affected organ does in fact remove the infection from t germ_level = 0 + // If any organs are attached to this, destroy them + for(var/datum/organ/external/O in children) + O.droplimb(1, no_explode, amputation) + //Replace all wounds on that arm with one wound on parent organ. wounds.Cut() - if (parent) + if (parent && !amputation) var/datum/wound/W if(max_damage < 50) W = new/datum/wound/lost_limb/small(max_damage) @@ -591,10 +595,6 @@ Note that amputating the affected organ does in fact remove the infection from t parent.update_damages() update_damages() - // If any organs are attached to this, destroy them - for(var/datum/organ/external/O in children) - O.droplimb(1) - var/obj/organ //Dropped limb object switch(body_part) if(HEAD) @@ -769,7 +769,7 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 //ORGAN_BROKEN doesn't have the same meaning for robot limbs if(brute_dam > min_broken_damage * config.organ_health_multiplier) return 0 //will just immediately fracture again - + status &= ~ORGAN_BROKEN return 1 @@ -1131,7 +1131,9 @@ obj/item/weapon/organ/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/hemostat)) if(contents.len) var/obj/item/removing = pick(contents) - removing.loc = src.loc + removing.loc = get_turf(user.loc) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(removing) if(istype(removing,/obj/item/organ)) var/obj/item/organ/removed_organ = removing organs_internal -= removed_organ.organ_data diff --git a/code/WorkInProgress/Chinsky/overmap/README.dm b/code/modules/overmap/README.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/README.dm rename to code/modules/overmap/README.dm diff --git a/code/WorkInProgress/Chinsky/overmap/_defines.dm b/code/modules/overmap/_defines.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/_defines.dm rename to code/modules/overmap/_defines.dm diff --git a/code/WorkInProgress/Chinsky/overmap/sectors.dm b/code/modules/overmap/sectors.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/sectors.dm rename to code/modules/overmap/sectors.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm rename to code/modules/overmap/ships/computers/engine_control.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm rename to code/modules/overmap/ships/computers/helm.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm rename to code/modules/overmap/ships/computers/shuttle.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm b/code/modules/overmap/ships/engines/engine.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm rename to code/modules/overmap/ships/engines/engine.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm b/code/modules/overmap/ships/engines/thermal.dm similarity index 100% rename from code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm rename to code/modules/overmap/ships/engines/thermal.dm diff --git a/code/WorkInProgress/Chinsky/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm similarity index 97% rename from code/WorkInProgress/Chinsky/overmap/ships/ship.dm rename to code/modules/overmap/ships/ship.dm index b080c41b07..3397fe9a76 100644 --- a/code/WorkInProgress/Chinsky/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -72,6 +72,7 @@ return INFINITY return max(abs(speed[1]),abs(speed[2]))/get_acceleration() +#define SIGN(X) (X == 0 ? 0 : (X > 0 ? 1 : -1)) /obj/effect/map/ship/proc/decelerate() if(!is_still() && can_burn()) if (speed[1]) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ca128c2c10..9598800312 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -9,7 +9,6 @@ throw_range = 10 var/obj/item/weapon/pen/haspen //The stored pen. var/obj/item/weapon/toppaper //The topmost piece of paper. - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT /obj/item/weapon/clipboard/New() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 868fac3053..c004844c50 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -35,7 +35,7 @@ user << "You put the [W] into \the [src]." update_icon() else if(istype(W, /obj/item/weapon/pen)) - var/n_name = copytext(sanitize(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text), 1, MAX_NAME_LEN) + var/n_name = sanitize(copytext(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, 1, MAX_NAME_LEN)) if((loc == usr && usr.stat == 0)) name = "folder[(n_name ? text("- '[n_name]'") : null)]" return diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 940a797add..fe519e01d4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -6,9 +6,13 @@ var/label = null var/labels_left = 30 var/mode = 0 //off or on. + +/obj/item/weapon/hand_labeler/attack() + return /obj/item/weapon/hand_labeler/afterattack(atom/A, mob/user as mob, proximity) - if(!proximity) return + if(!proximity) + return if(!mode) //if it's off, give up. return if(A == loc) // if placing the labeller into something (e.g. backpack) @@ -24,10 +28,13 @@ user << "Label too big." return if(ishuman(A)) - user << "You can't label humans." + user << "The label refuses to stick to [A.name]." return if(issilicon(A)) - user << "You can't label cyborgs." + user << "The label refuses to stick to [A.name]." + return + if(isobserver(A)) + user << "[src] passes through [A.name]." return if(istype(A, /obj/item/weapon/reagent_containers/glass)) user << "The label can't stick to the [A.name]. (Try using a pen)" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 440d48aca1..3608386f9a 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -86,7 +86,7 @@ if((CLUMSY in usr.mutations) && prob(50)) usr << "You cut yourself on the paper." return - var/n_name = copytext(sanitize(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text), 1, MAX_NAME_LEN) + var/n_name = sanitize(copytext(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text, 1, MAX_NAME_LEN)) if((loc == usr && usr.stat == 0)) name = "[(n_name ? text("[n_name]") : initial(name))]" if(name != "paper") diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 7516d1b622..39ad7323ed 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -35,8 +35,9 @@ user.drop_from_inventory(P) P.loc = src if(istype(user,/mob/living/carbon/human)) - user:update_inv_l_hand() - user:update_inv_r_hand() + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() else if(istype(W, /obj/item/weapon/photo)) amount++ if(screen == 2) @@ -57,6 +58,8 @@ user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." del(W) else + if(istype(W, /obj/item/weapon/tape_roll)) + return 0 if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon)) usr << browse("", "window=[name]") //Closes the dialog P = src[page] @@ -189,7 +192,7 @@ set category = "Object" set src in usr - var/n_name = copytext(sanitize(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text), 1, MAX_NAME_LEN) + var/n_name = sanitize(copytext(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text, 1, MAX_NAME_LEN)) if((loc == usr && usr.stat == 0)) name = "[(n_name ? text("[n_name]") : "paper")]" add_fingerprint(usr) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index dd60029382..944fd91410 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -15,7 +15,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 w_class = 1.0 @@ -58,7 +57,7 @@ */ /obj/item/weapon/pen/sleepypen desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\"" - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER slot_flags = SLOT_BELT origin_tech = "materials=2;syndicate=5" @@ -85,7 +84,7 @@ * Parapens */ /obj/item/weapon/pen/paralysis - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER slot_flags = SLOT_BELT origin_tech = "materials=2;syndicate=5" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 1a93e87539..34a974064e 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -43,8 +43,7 @@ var/global/photo_count = 0 /obj/item/weapon/photo/attackby(obj/item/weapon/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) - var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text) - txt = copytext(txt, 1, 128) + var/txt = sanitize(copytext(input(user, "What would you like to write on the back?", "Photo Writing", null) as text, 1, 128)) if(loc == user && user.stat == 0) scribble = txt ..() @@ -57,10 +56,10 @@ var/global/photo_count = 0 user << "It is too far away." /obj/item/weapon/photo/proc/show(mob/user as mob) - user << browse_rsc(img, "tmp_photo.png") + user << browse_rsc(img, "tmp_photo_[id].png") user << browse("[name]" \ + "" \ - + "" \ + + "" \ + "[scribble ? "
    Written on the back:
    [scribble]" : ""]"\ + "", "window=book;size=[64*photo_size]x[scribble ? 400 : 64*photo_size]") onclose(user, "[name]") @@ -71,7 +70,7 @@ var/global/photo_count = 0 set category = "Object" set src in usr - var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN) + var/n_name = sanitize(copytext(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text, 1, MAX_NAME_LEN)) //loc.loc check is for making possible renaming photos in clipboards if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0)) name = "[(n_name ? text("[n_name]") : "photo")]" @@ -123,7 +122,7 @@ var/global/photo_count = 0 icon_state = "camera" item_state = "electropack" w_class = 2.0 - flags = FPRINT | CONDUCT | TABLEPASS + flags = CONDUCT slot_flags = SLOT_BELT matter = list("metal" = 2000) var/pictures_max = 10 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 51ec0002dd..f2767ca0e8 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "stamp-qm" item_state = "stamp" - flags = FPRINT | TABLEPASS throwforce = 0 w_class = 1.0 throw_speed = 7 diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index ea92b1f690..bdaeb0c659 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -206,7 +206,7 @@ proc/cardinalrange(var/center) icon_state = "box" item_state = "electronic" w_class = 4.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT throwforce = 5 throw_speed = 1 throw_range = 2 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index dc019ccaec..7519becdaf 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -724,6 +724,11 @@ // do APC interaction src.interact(user) +/obj/machinery/power/apc/attack_ghost(user as mob) + if(stat & (BROKEN|MAINT)) + return + return ui_interact(user) + /obj/machinery/power/apc/interact(mob/user) if(!user) return diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index feb6f1d38a..869e654e6e 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -11,7 +11,6 @@ //directwired = 0 var/icon_state_on = "bbox_on" var/icon_state_off = "bbox_off" - flags = FPRINT density = 1 anchored = 1 var/on = 0 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index de072d8d5a..12451f9a5e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -477,7 +477,7 @@ obj/structure/cable/proc/cableColor(var/colorC) throw_speed = 2 throw_range = 5 matter = list("metal" = 50, "glass" = 20) - flags = TABLEPASS | FPRINT | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT item_state = "coil" attack_verb = list("whipped", "lashed", "disciplined", "flogged") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8d8c434e25..7c9ae41cf2 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -16,7 +16,7 @@ desc = "Used for building lights." icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-item" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT var/fixture_type = "tube" var/obj/machinery/light/newlight = null var/sheets_refunded = 2 @@ -63,7 +63,7 @@ desc = "Used for building small lights." icon = 'icons/obj/lighting.dmi' icon_state = "bulb-construct-item" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT fixture_type = "bulb" sheets_refunded = 1 @@ -637,7 +637,6 @@ /obj/item/weapon/light icon = 'icons/obj/lighting.dmi' - flags = FPRINT | TABLEPASS force = 2 throwforce = 5 w_class = 2 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 0799900909..2223f2f9f9 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -79,6 +79,9 @@ display round(lastgen) and phorontank amount icon_state = initial(icon_state) handleInactive() +/obj/machinery/power/powered() + return 1 //doesn't require an external power source + /obj/machinery/power/port_gen/attack_hand(mob/user as mob) if(..()) return @@ -102,8 +105,11 @@ display round(lastgen) and phorontank amount var/sheet_path = /obj/item/stack/sheet/mineral/phoron var/board_path = "/obj/item/weapon/circuitboard/pacman" var/sheet_left = 0 // How much is left of the sheet - var/time_per_sheet = 40 var/heat = 0 + + //produces up to 80 kW and lasts for 20 minutes with 50 sheets + var/time_per_sheet = 96 + power_gen = 20000 /obj/machinery/power/port_gen/pacman/initialize() ..() @@ -326,9 +332,12 @@ display round(lastgen) and phorontank amount name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator" icon_state = "portgen1" sheet_path = /obj/item/stack/sheet/mineral/uranium - power_gen = 15000 - time_per_sheet = 65 board_path = "/obj/item/weapon/circuitboard/pacman/super" + + //produces 80 kW like the PACMAN but 50 sheets will last for 2 hours + power_gen = 20000 + time_per_sheet = 576 + overheat() explosion(src.loc, 3, 3, 3, -1) @@ -336,8 +345,11 @@ display round(lastgen) and phorontank amount name = "M.R.S.P.A.C.M.A.N.-type Portable Generator" icon_state = "portgen2" sheet_path = /obj/item/stack/sheet/mineral/tritium - power_gen = 40000 - time_per_sheet = 80 board_path = "/obj/item/weapon/circuitboard/pacman/mrs" + + //produces 200 kW and lasts for 1 hour with 50 sheets + power_gen = 50000 + time_per_sheet = 288 + overheat() explosion(src.loc, 4, 4, 4, -1) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index d1f0c82454..366cd9351d 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -294,6 +294,8 @@ for(var/obj/structure/cable/Cable in net2.cables) //merge cables net1.add_cable(Cable) + if(!net2) return net1 + for(var/obj/machinery/power/Node in net2.nodes) //merge power machines if(!Node.connect_to_network()) Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 401cb41af7..791b69e949 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -16,9 +16,11 @@ /datum/powernet/New() powernets += src + ..() /datum/powernet/Del() powernets -= src + ..() //Returns the amount of excess power (before refunding to SMESs) from last tick. //This is for machines that might adjust their power consumption using this data. @@ -110,8 +112,7 @@ S.restore() // and restore some of the power that was used //updates the viewed load (as seen on power computers) - viewload = 0.8*viewload + 0.2*load - viewload = round(viewload) + viewload = round(load) //reset the powernet load = 0 diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/areas.dm b/code/modules/power/rust/areas.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/areas.dm rename to code/modules/power/rust/areas.dm diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/circuits_and_design.dm b/code/modules/power/rust/circuits_and_design.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/circuits_and_design.dm rename to code/modules/power/rust/circuits_and_design.dm index bf71c4fe9a..4c00673061 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/circuits_and_design.dm +++ b/code/modules/power/rust/circuits_and_design.dm @@ -1,4 +1,4 @@ - +#define IMPRINTER 1 //For circuits. Uses glass/chemicals. ////////////////////////////////////// // RUST Core Control computer diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm b/code/modules/power/rust/core_control.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm rename to code/modules/power/rust/core_control.dm index f20f33a7ac..b4d0bb1de7 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm +++ b/code/modules/power/rust/core_control.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/rust_core_control name = "RUST Core Control" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "core_control" var/list/connected_devices = list() var/id_tag = "allan remember to update this before you leave" diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm b/code/modules/power/rust/core_field.dm similarity index 99% rename from code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm rename to code/modules/power/rust/core_field.dm index cd397e1095..2c5806bef5 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm +++ b/code/modules/power/rust/core_field.dm @@ -9,7 +9,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K /obj/effect/rust_em_field name = "EM Field" desc = "A coruscating, barely visible field of energy. It is shaped like a slightly flattened torus." - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "emfield_s1" // var/major_radius = 0 //longer radius in meters = field_strength * 0.21875, max = 8.75 @@ -265,7 +265,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K switch(newsize) if(1) size = 1 - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "emfield_s1" pixel_x = 0 pixel_y = 0 diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm b/code/modules/power/rust/core_gen.dm similarity index 99% rename from code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm rename to code/modules/power/rust/core_gen.dm index 7697fe17d4..7cf9f9d696 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm +++ b/code/modules/power/rust/core_gen.dm @@ -48,7 +48,7 @@ max volume of phoron storeable by the field = the total volume of a number of ti /obj/machinery/power/rust_core name = "RUST Tokamak core" desc = "Enormous solenoid for generating extremely high power electromagnetic fields" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "core0" density = 1 var/obj/effect/rust_em_field/owned_field diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm b/code/modules/power/rust/core_monitor.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm rename to code/modules/power/rust/core_monitor.dm diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm b/code/modules/power/rust/fuel_assembly.dm similarity index 83% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm rename to code/modules/power/rust/fuel_assembly.dm index d8ca364cb2..bb20996c5f 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm +++ b/code/modules/power/rust/fuel_assembly.dm @@ -1,6 +1,6 @@ /obj/item/weapon/fuel_assembly - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "fuel_assembly" name = "Fuel Rod Assembly" var/list/rod_quantities diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm b/code/modules/power/rust/fuel_assembly_port.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm rename to code/modules/power/rust/fuel_assembly_port.dm index 7c976ac956..05f2ca11ad 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm +++ b/code/modules/power/rust/fuel_assembly_port.dm @@ -2,7 +2,7 @@ /obj/machinery/rust_fuel_assembly_port name = "Fuel Assembly Port" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "port2" density = 0 var/obj/item/weapon/fuel_assembly/cur_assembly diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port_construction.dm b/code/modules/power/rust/fuel_assembly_port_construction.dm similarity index 97% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port_construction.dm rename to code/modules/power/rust/fuel_assembly_port_construction.dm index 0c12ed23a0..092805de78 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port_construction.dm +++ b/code/modules/power/rust/fuel_assembly_port_construction.dm @@ -3,10 +3,10 @@ /obj/item/rust_fuel_assembly_port_frame name = "Fuel Assembly Port frame" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "port2" w_class = 4 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/rust_fuel_assembly_port_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm b/code/modules/power/rust/fuel_compressor.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm rename to code/modules/power/rust/fuel_compressor.dm index 526742aac9..2abd9f17f8 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm +++ b/code/modules/power/rust/fuel_compressor.dm @@ -1,7 +1,7 @@ var/const/max_assembly_amount = 300 /obj/machinery/rust_fuel_compressor - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "fuel_compressor1" name = "Fuel Compressor" var/list/new_assembly_quantities = list("Deuterium" = 150,"Tritium" = 150,"Rodinium-6" = 0,"Stravium-7" = 0, "Pergium" = 0, "Dilithium" = 0) diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor_construction.dm b/code/modules/power/rust/fuel_compressor_construction.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor_construction.dm rename to code/modules/power/rust/fuel_compressor_construction.dm index 3d2e32f971..c9c3895f2b 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor_construction.dm +++ b/code/modules/power/rust/fuel_compressor_construction.dm @@ -3,10 +3,10 @@ /obj/item/rust_fuel_compressor_frame name = "Fuel Compressor frame" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "fuel_compressor0" w_class = 4 - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT /obj/item/rust_fuel_compressor_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm b/code/modules/power/rust/fuel_control.dm similarity index 99% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm rename to code/modules/power/rust/fuel_control.dm index 17c8fccfc7..2cef7bd2a6 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm +++ b/code/modules/power/rust/fuel_control.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/rust_fuel_control name = "RUST Fuel Injection Control" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "fuel" var/list/connected_injectors = list() var/list/active_stages = list() diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm b/code/modules/power/rust/fuel_injector.dm similarity index 99% rename from code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm rename to code/modules/power/rust/fuel_injector.dm index ad7ea622e2..f5467f0f39 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm +++ b/code/modules/power/rust/fuel_injector.dm @@ -1,7 +1,7 @@ /obj/machinery/power/rust_fuel_injector name = "Fuel Injector" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "injector0" density = 1 diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm b/code/modules/power/rust/fusion_reactions.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm rename to code/modules/power/rust/fusion_reactions.dm diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm b/code/modules/power/rust/gyrotron.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm rename to code/modules/power/rust/gyrotron.dm index 0fff75bb50..31e0385391 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm +++ b/code/modules/power/rust/gyrotron.dm @@ -3,7 +3,7 @@ /obj/item/projectile/beam/ehf_beam /obj/machinery/rust/gyrotron - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "emitter-off" name = "Gyrotron" anchored = 1 diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm b/code/modules/power/rust/gyrotron_controller.dm similarity index 98% rename from code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm rename to code/modules/power/rust/gyrotron_controller.dm index a28f67cc39..4542965795 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm +++ b/code/modules/power/rust/gyrotron_controller.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/rust_gyrotron_controller name = "Gyrotron Remote Controller" - icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' + icon = 'icons/rust.dmi' icon_state = "engine" var/updating = 1 diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm b/code/modules/power/rust/radiation.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm rename to code/modules/power/rust/radiation.dm diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm b/code/modules/power/rust/virtual_particle_catcher.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm rename to code/modules/power/rust/virtual_particle_catcher.dm diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 8f90743e46..0825d9a194 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -206,8 +206,6 @@ var/global/list/uneatable = list( /obj/machinery/singularity/proc/eat() set background = 1 - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 // Let's just make this one loop. for(var/atom/X in orange(grav_pull,src)) var/dist = get_dist(X, src) @@ -226,9 +224,6 @@ var/global/list/uneatable = list( // Turf and movable atoms else if(dist <= consume_range && (isturf(X) || istype(X, /atom/movable))) consume(X) - - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 return @@ -567,11 +562,7 @@ var/global/list/uneatable = list( /obj/machinery/singularity/narsie/wizard/eat() set background = 1 - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 for(var/atom/X in orange(consume_range,src)) if(isturf(X) || istype(X, /atom/movable)) consume(X) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 11bcef5881..e1cdb23368 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -218,6 +218,8 @@ add_fingerprint(user) ui_interact(user) +/obj/machinery/power/smes/attack_ghost(mob/user) + ui_interact(user) /obj/machinery/power/smes/attack_hand(mob/user) add_fingerprint(user) @@ -301,6 +303,13 @@ data["outputMax"] = output_level_max data["outputLoad"] = round(output_used) + if(outputting) + data["outputting"] = 2 // smes is outputting + else if(!outputting && output_attempt) + data["outputting"] = 1 // smes is online but not outputting because it's charge level is too low + else + data["outputting"] = 0 // smes is not outputting + // update the ui if it exists, returns null if no ui is passed/found ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -322,11 +331,11 @@ return 1 if( href_list["cmode"] ) - inputting(!inputting) + inputting(!input_attempt) update_icon() else if( href_list["online"] ) - outputting(!outputting) + outputting(!output_attempt) update_icon() else if( href_list["input"] ) switch( href_list["input"] ) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 1e09903a7e..9220f847b9 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -3,7 +3,7 @@ desc = "A bullet casing." icon = 'icons/obj/ammo.dmi' icon_state = "s-casing" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT throwforce = 1 w_class = 1.0 @@ -26,7 +26,7 @@ if(BB) if(initial(BB.name) == "bullet") var/tmp_label = "" - var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label)) + var/label_text = sanitize(copytext(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label), 1, MAX_NAME_LEN)) if(length(label_text) > 20) user << "\red The inscription can be at most 20 characters long." else @@ -52,7 +52,7 @@ desc = "A box of ammo" icon_state = "357" icon = 'icons/obj/ammo.dmi' - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT item_state = "syringe_kit" matter = list("metal" = 50000) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f41ba5967b..fc44ed09fc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/gun.dmi' icon_state = "detective" item_state = "gun" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT matter = list("metal" = 2000) w_class = 3.0 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 394ac3a8f6..40a4b06689 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -77,22 +77,6 @@ obj/item/weapon/gun/energy/laser/retro isHandgun() return 0 -/obj/item/weapon/gun/energy/lasercannon/mounted/load_into_chamber() - if(in_chamber) - return 1 - var/obj/item/rig_module/module = loc - if(!istype(module)) - return 0 - if(module.holder && module.holder.wearer) - var/mob/living/carbon/human/H = module.holder.wearer - if(istype(H) && H.back) - var/obj/item/weapon/rig/suit = H.back - if(istype(suit) && suit.cell && suit.cell.charge >= 250) - suit.cell.use(250) - in_chamber = new /obj/item/projectile/beam/heavylaser(src) - return 1 - return 0 - /obj/item/weapon/gun/energy/lasercannon/cyborg/load_into_chamber() if(in_chamber) return 1 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index a52119c168..e2a55a5ed4 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -35,23 +35,6 @@ else user.update_inv_r_hand() -/obj/item/weapon/gun/energy/gun/mounted/load_into_chamber() - if(in_chamber) - return 1 - var/obj/item/rig_module/module = loc - if(!istype(module)) - return 0 - if(module.holder && module.holder.wearer) - var/mob/living/carbon/human/H = module.holder.wearer - if(istype(H) && H.back) - var/obj/item/weapon/rig/suit = H.back - if(istype(suit) && suit.cell && suit.cell.charge >= 250) - suit.cell.use(250) - var/prog_path = text2path(projectile_type) - in_chamber = new prog_path(src) - return 1 - return 0 - /obj/item/weapon/gun/energy/gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index a87218d12c..d5417496bf 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -5,7 +5,7 @@ fire_sound = 'sound/weapons/Laser.ogg' origin_tech = "combat=2;magnets=4" w_class = 4.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK charge_cost = 100 projectile_type = "/obj/item/projectile/ion" @@ -33,7 +33,7 @@ obj/item/weapon/gun/energy/staff icon_state = "staffofchange" item_state = "staffofchange" fire_sound = 'sound/weapons/emitter.ogg' - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK w_class = 4.0 charge_cost = 200 diff --git a/code/modules/projectiles/guns/projectile/crossbow.dm b/code/modules/projectiles/guns/projectile/crossbow.dm index 0f5cdbb2c8..faa3f8509f 100644 --- a/code/modules/projectiles/guns/projectile/crossbow.dm +++ b/code/modules/projectiles/guns/projectile/crossbow.dm @@ -6,7 +6,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "bolt" item_state = "bolt" - flags = FPRINT | TABLEPASS throwforce = 8 w_class = 3.0 sharp = 1 diff --git a/code/modules/projectiles/guns/projectile/launcher.dm b/code/modules/projectiles/guns/projectile/launcher.dm index ee0da727c7..6626d809cd 100644 --- a/code/modules/projectiles/guns/projectile/launcher.dm +++ b/code/modules/projectiles/guns/projectile/launcher.dm @@ -3,7 +3,7 @@ desc = "A device that launches things." icon = 'icons/obj/weapons.dmi' w_class = 5.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK var/release_force = 0 diff --git a/code/modules/projectiles/guns/projectile/pneumatic.dm b/code/modules/projectiles/guns/projectile/pneumatic.dm index 2a6e519d0d..43a5bc8e9a 100644 --- a/code/modules/projectiles/guns/projectile/pneumatic.dm +++ b/code/modules/projectiles/guns/projectile/pneumatic.dm @@ -5,7 +5,7 @@ icon_state = "pneumatic" item_state = "pneumatic" w_class = 5.0 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT fire_sound_text = "a loud whoosh of moving air" fire_delay = 50 fire_sound = 'sound/weapons/tablehit1.ogg' diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index ea88e7956a..27fb15d571 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -7,7 +7,7 @@ throw_speed = 2 throw_range = 10 force = 5.0 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = CONDUCT | USEDELAY slot_flags = 0 origin_tech = "combat=8;materials=5" var/projectile = /obj/item/missile diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 87d214f067..6db9300375 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -6,7 +6,7 @@ max_shells = 4 w_class = 4.0 force = 10 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" origin_tech = "combat=4;materials=2" @@ -66,7 +66,7 @@ max_shells = 2 w_class = 4.0 force = 10 - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" origin_tech = "combat=3;materials=1" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d8ff676708..3b5ed8bd53 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -16,7 +16,6 @@ density = 1 unacidable = 1 anchored = 1 //There's a reason this is here, Mport. God fucking damn it -Agouri. Find&Fix by Pete. The reason this is here is to stop the curving of emitter shots. - flags = FPRINT | TABLEPASS pass_flags = PASSTABLE mouse_opacity = 0 var/bumped = 0 //Prevents it from hitting more than one guy at once diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm index a59147e85f..aaae973d95 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/Chemistry-Colours.dm @@ -8,7 +8,6 @@ var/list/greencolor = new /list(contents) var/list/bluecolor = new /list(contents) var/i - //fill the list of weights for(i=1; i<=contents; i++) var/datum/reagent/re = reagent_list[i] @@ -17,7 +16,6 @@ reagentweight *= 20 //Paint colours a mixture twenty times as much weight[i] = reagentweight - //fill the lists of colours for(i=1; i<=contents; i++) var/datum/reagent/re = reagent_list[i] diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 78a48cf8e0..6c6c194af5 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -79,9 +79,9 @@ datum if(A.volume > the_volume) the_volume = A.volume the_reagent = A - + return the_reagent - + get_master_reagent_name() var/the_name = null var/the_volume = 0 @@ -353,8 +353,11 @@ datum if(C.result) feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]") multiplier = max(multiplier, 1) //this shouldnt happen ... - add_reagent(C.result, C.result_amount*multiplier) - set_data(C.result, preserved_data) + if(!isnull(C.resultcolor)) //paints + add_reagent(C.result, C.result_amount*multiplier, C.resultcolor) + else + add_reagent(C.result, C.result_amount*multiplier) + set_data(C.result, preserved_data) //add secondary products for(var/S in C.secondary_results) @@ -458,7 +461,7 @@ datum else R.reaction_obj(A, R.volume+volume_modifier) return - add_reagent(var/reagent, var/amount, var/list/data=null, var/safety = 0) + add_reagent(var/reagent, var/amount, var/data=null, var/safety = 0) if(!isnum(amount)) return 1 update_total() if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. @@ -469,7 +472,6 @@ datum if (R.id == reagent) R.volume += amount update_total() - my_atom.on_reagent_change() // mix dem viruses if(R.id == "blood" && reagent == "blood") @@ -495,9 +497,23 @@ datum if(!istype(D, /datum/disease/advance)) preserve += D R.data["viruses"] = preserve - + if(R.id == "paint" && reagent == "paint") + if(R.color && data) + var/list/mix = new /list(2) + //fill the list + var/datum/reagent/paint/P = chemical_reagents_list["paint"] + var/datum/reagent/paint/P1 = new P.type() + P1.color = R.color + P1.volume = R.volume - amount //since we just increased that + var/datum/reagent/paint/P2 = new P.type() + P2.color = data + P2.volume = amount + mix[1] = P1 + mix[2] = P2 + R.color = mix_color_from_reagents(mix) if(!safety) handle_reactions() + my_atom.on_reagent_change() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -507,7 +523,10 @@ datum reagent_list += R R.holder = src R.volume = amount - SetViruses(R, data) // Includes setting data + if(reagent == "paint") + R.color = data + else + SetViruses(R, data) // Includes setting data for blood //debug //world << "Adding data" @@ -611,6 +630,7 @@ datum my_atom.reagents = null copy_data(var/datum/reagent/current_reagent) + if (current_reagent.id == "paint") return current_reagent.color if (!current_reagent || !current_reagent.data) return null if (!istype(current_reagent.data, /list)) return current_reagent.data diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 0e02c10ad4..b2ac133cc5 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -187,20 +187,20 @@ max_energy = 100 dispensable_reagents = list("water","ice","coffee","cream","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","watermelonjuice") - /obj/machinery/chem_dispenser/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) - ..() - if(istype(B, /obj/item/device/multitool)) - if(hackedcheck == 0) - user << "You change the mode from 'McNano' to 'Pizza King'." - dispensable_reagents += list("thirteenloko","grapesoda") - hackedcheck = 1 - return +/obj/machinery/chem_dispenser/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) + ..() + if(istype(B, /obj/item/device/multitool)) + if(hackedcheck == 0) + user << "You change the mode from 'McNano' to 'Pizza King'." + dispensable_reagents += list("thirteenloko","grapesoda") + hackedcheck = 1 + return - else - user << "You change the mode from 'Pizza King' to 'McNano'." - dispensable_reagents -= list("thirteenloko") - hackedcheck = 0 - return + else + user << "You change the mode from 'Pizza King' to 'McNano'." + dispensable_reagents -= list("thirteenloko","grapesoda") + hackedcheck = 0 + return /obj/machinery/chem_dispenser/beer icon_state = "booze_dispenser" @@ -212,21 +212,21 @@ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." dispensable_reagents = list("lemon_lime","sugar","orangejuice","limejuice","sodawater","tonic","beer","kahlua","whiskey","wine","vodka","gin","rum","tequilla","vermouth","cognac","ale","mead") - /obj/machinery/chem_dispenser/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) - ..() +/obj/machinery/chem_dispenser/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) + ..() - if(istype(B, /obj/item/device/multitool)) - if(hackedcheck == 0) - user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." - dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice") - hackedcheck = 1 - return + if(istype(B, /obj/item/device/multitool)) + if(hackedcheck == 0) + user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." + dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice") + hackedcheck = 1 + return - else - user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." - dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice") - hackedcheck = 0 - return + else + user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." + dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice") + hackedcheck = 0 + return /obj/machinery/chem_dispenser/meds name = "chem dispenser magic" @@ -646,7 +646,7 @@ if(type in diseases) // Make sure this is a disease D = new type(0, null) var/list/data = list("viruses"=list(D)) - var/name = sanitize(input(usr,"Name:","Name the culture",D.name)) + var/name = sanitize(copytext(input(usr,"Name:","Name the culture",D.name), 1, MAX_NAME_LEN)) if(!name || name == " ") name = D.name B.name = "[name] culture bottle" B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." @@ -851,7 +851,10 @@ //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.! /obj/item/weapon/reagent_containers/pill = list(), - /obj/item/weapon/reagent_containers/food = list() + /obj/item/weapon/reagent_containers/food = list(), + + //Crayons + /obj/item/toy/crayon = list() ) var/list/juice_items = list ( @@ -1186,6 +1189,21 @@ break remove_object(O) + //crayons + for (var/obj/item/toy/crayon/O in holdingitems) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + var/amount = round(O.uses/3) //full crayon gives 10 juice + var/dustcolour = "red" + if (O.colourName == "mime") + dustcolour = "grey" //black+white + else if (O.colourName == "rainbow") + dustcolour = "brown" //mix of all colours + else if (!isnull(O.colourName)) //all other defined colours + dustcolour = O.colourName + beaker.reagents.add_reagent("crayon_dust_[dustcolour]",amount) + remove_object(O) + //Everything else - Transfers reagents from it into beaker for (var/obj/item/weapon/reagent_containers/O in holdingitems) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 8f853dbe2b..bf94300160 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -88,7 +88,7 @@ datum on_new(var/data) return - // Called when two reagents of the same are mixing. + // Called when two reagents of the same are mixing. <-- Blatant lies on_merge(var/data) return @@ -258,10 +258,15 @@ datum if(!cube.wrapped) cube.Expand() - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if (istype(M, /mob/living/carbon/slime)) - var/mob/living/carbon/slime/S = M + var/mob/living/carbon/slime/S = M S.apply_water(volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(-(volume / 10)) + if(M.fire_stacks <= 0) + M.ExtinguishMob() + return water/holywater name = "Holy Water" @@ -427,7 +432,7 @@ datum holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM) return -/* silicate + silicate name = "Silicate" id = "silicate" description = "A compound that can be used to reinforce glass." @@ -437,31 +442,9 @@ datum reaction_obj(var/obj/O, var/volume) src = null if(istype(O,/obj/structure/window)) - if(O:silicate <= 200) - - O:silicate += volume - O:health += volume * 3 - - if(!O:silicateIcon) - var/icon/I = icon(O.icon,O.icon_state,O.dir) - - var/r = (volume / 100) + 1 - var/g = (volume / 70) + 1 - var/b = (volume / 50) + 1 - I.SetIntensity(r,g,b) - O.icon = I - O:silicateIcon = I - else - var/icon/I = O:silicateIcon - - var/r = (volume / 100) + 1 - var/g = (volume / 70) + 1 - var/b = (volume / 50) + 1 - I.SetIntensity(r,g,b) - O.icon = I - O:silicateIcon = I - - return*/ + var/obj/structure/window/W = O + W.apply_silicate(volume) + return oxygen name = "Oxygen" @@ -933,6 +916,12 @@ datum M.adjustToxLoss(1) ..() return + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return space_cleaner name = "Space cleaner" @@ -1317,9 +1306,9 @@ datum if(ishuman(M)) var/mob/living/carbon/human/H = M - //Peridaxon is hard enough to get, it's probably fair to make this all internal organs + //Peridaxon heals only non-robotic organs for(var/datum/organ/internal/I in H.internal_organs) - if(I.damage > 0) + if((I.damage > 0) && (I.robotic != 2)) I.damage = max(I.damage - 0.20, 0) ..() return @@ -1537,6 +1526,78 @@ datum ..() return +//////////////////////////Ground crayons///////////////////// + + + crayon_dust + name = "Crayon dust" + id = "crayon_dust" + description = "Intensely coloured powder obtained by grinding crayons." + reagent_state = LIQUID + color = "#888888" + overdose = 5 + + red + name = "Red crayon dust" + id = "crayon_dust_red" + color = "#FE191A" + + orange + name = "Orange crayon dust" + id = "crayon_dust_orange" + color = "#FFBE4F" + + yellow + name = "Yellow crayon dust" + id = "crayon_dust_yellow" + color = "#FDFE7D" + + green + name = "Green crayon dust" + id = "crayon_dust_green" + color = "#18A31A" + + blue + name = "Blue crayon dust" + id = "crayon_dust_blue" + color = "#247CFF" + + purple + name = "Purple crayon dust" + id = "crayon_dust_purple" + color = "#CC0099" + + grey //Mime + name = "Grey crayon dust" + id = "crayon_dust_grey" + color = "#808080" + + brown //Rainbow + name = "Brown crayon dust" + id = "crayon_dust_brown" + color = "#846F35" + +//////////////////////////Paint////////////////////////////// + + paint + name = "Paint" + id = "paint" + description = "This paint will stick to almost any object" + reagent_state = LIQUID + color = "#808080" + overdose = 15 + + reaction_turf(var/turf/T, var/volume) + if(!istype(T) || istype(T, /turf/space)) + return + T.color = color + + reaction_obj(var/obj/O, var/volume) + ..() + if(istype(O,/obj/item/weapon/light)) + O.color = color + + //////////////////////////Poison stuff/////////////////////// toxin @@ -1615,6 +1676,12 @@ datum src = null T.assume_gas("volatile_fuel", volume, T20C) return + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + return toxin/lexorin name = "Lexorin" @@ -2040,22 +2107,20 @@ datum if(!M) M = holder.my_atom if(prob(50)) M.heal_organ_damage(1,0) M.nutrition += nutriment_factor // For hunger and fatness -/* - // If overeaten - vomit and fall down - // Makes you feel bad but removes reagents and some effect - // from your body - if (M.nutrition > 650) - M.nutrition = rand (250, 400) - M.weakened += rand(2, 10) - M.jitteriness += rand(0, 5) - M.dizziness = max (0, (M.dizziness - rand(0, 15))) - M.druggy = max (0, (M.druggy - rand(0, 15))) - M.adjustToxLoss(rand(-15, -5))) - M.updatehealth() -*/ ..() return + nutriment/protein // Bad for Skrell! + name = "animal protein" + id = "protein" + color = "#440000" + + on_mob_life(var/mob/living/M, var/alien) + if(alien && alien == IS_SKRELL) + M.adjustToxLoss(0.5) + M.nutrition -= nutriment_factor + ..() + lipozine name = "Lipozine" // The anti-nutriment. id = "lipozine" @@ -3287,6 +3352,12 @@ datum usr << "It wasn't enough..." return + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 15) + return ethanol/beer name = "Beer" id = "beer" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index df9c8a219a..4d6b44fb84 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -4,6 +4,7 @@ datum var/name = null var/id = null var/result = null + var/resultcolor = null //for paint var/list/required_reagents = new/list() var/list/required_catalysts = new/list() @@ -55,14 +56,14 @@ datum empulse(location, round(created_volume / 24), round(created_volume / 14), 1) holder.clear_reagents() return -/* + silicate name = "Silicate" id = "silicate" result = "silicate" required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) result_amount = 3 -*/ + stoxin name = "Soporific" id = "stoxin" @@ -131,7 +132,7 @@ datum name = "Water" id = "water" result = "water" - required_reagents = list("oxygen" = 2, "hydrogen" = 1) + required_reagents = list("oxygen" = 1, "hydrogen" = 2) result_amount = 1 thermite @@ -1344,6 +1345,109 @@ datum var/obj/effect/golemrune/Z = new /obj/effect/golemrune Z.loc = get_turf(holder.my_atom) Z.announce_to_ghosts() + +//////////////////////////////////////////PAINT/////////////////////////////////////////// +//Crayon dust -> paint + red_paint + name = "Red paint" + id = "red_paint" + result = "paint" + resultcolor = "#FE191A" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1) + result_amount = 5 + + orange_paint + name = "Orange paint" + id = "orange_paint" + result = "paint" + resultcolor = "#FFBE4F" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1) + result_amount = 5 + + yellow_paint + name = "Yellow paint" + id = "yellow_paint" + result = "paint" + resultcolor = "#FDFE7D" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1) + result_amount = 5 + + green_paint + name = "Green paint" + id = "green_paint" + result = "paint" + resultcolor = "#18A31A" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1) + result_amount = 5 + + blue_paint + name = "Blue paint" + id = "blue_paint" + result = "paint" + resultcolor = "#247CFF" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1) + result_amount = 5 + + purple_paint + name = "Purple paint" + id = "purple_paint" + result = "paint" + resultcolor = "#CC0099" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1) + result_amount = 5 + + grey_paint //mime + name = "Grey paint" + id = "grey_paint" + result = "paint" + resultcolor = "#808080" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1) + result_amount = 5 + + brown_paint + name = "Brown paint" + id = "brown_paint" + result = "paint" + resultcolor = "#846F35" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1) + result_amount = 5 + +//Ghetto reactions + + blood_paint + name = "Blood paint" + id = "blood_paint" + result = "paint" + resultcolor = "#FE191A" + required_reagents = list("plasticide" = 1, "water" = 3, "blood" = 2) + result_amount = 5 + + milk_paint + name = "Milk paint" + id = "milk_paint" + result = "paint" + resultcolor = "#F0F8FF" + required_reagents = list("plasticide" = 1, "water" = 3, "milk" = 5) + result_amount = 5 + + carbon_paint + name = "Carbon paint" + id = "carbon_paint" + result = "paint" + resultcolor = "#333333" + required_reagents = list("plasticide" = 1, "water" = 3, "carbon" = 1) + result_amount = 5 + +//Aluminum "non-ghetto" white paint + + aluminum_paint + name = "Aluminum paint" + id = "aluminum_paint" + result = "paint" + resultcolor = "#F0F8FF" + required_reagents = list("plasticide" = 1, "water" = 3, "aluminum" = 1) + result_amount = 5 + //////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// tofu diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index deee473acb..d82ded7bba 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -8,7 +8,6 @@ amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = null - flags = FPRINT var/mode = 1 var/charge_cost = 50 var/charge_tick = 0 diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index ee5be182dd..f643ccca90 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -10,7 +10,7 @@ desc = "Just your average condiment container." icon = 'icons/obj/food.dmi' icon_state = "emptycondiment" - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER possible_transfer_amounts = list(1,5,10) center_of_mass = list("x"=16, "y"=6) volume = 50 diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 915a43d253..ceabea1e50 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -6,7 +6,7 @@ desc = "yummy" icon = 'icons/obj/drinks.dmi' icon_state = null - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. possible_transfer_amounts = list(5,10,25) volume = 50 @@ -152,7 +152,7 @@ amount_per_transfer_from_this = 20 possible_transfer_amounts = null volume = 150 - flags = FPRINT | CONDUCT | TABLEPASS | OPENCONTAINER + flags = CONDUCT | OPENCONTAINER /obj/item/weapon/reagent_containers/food/drinks/golden_cup/tournament_26_06_2011 desc = "A golden cup. It will be presented to a winner of tournament 26 june and name of the winner will be graved on it." diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 7aaad7a678..292f998318 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -469,7 +469,7 @@ New() ..() - reagents.add_reagent("nutriment", 1) + reagents.add_reagent("protein", 2) throw_impact(atom/hit_atom) ..() @@ -533,7 +533,7 @@ New() ..() - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 3) reagents.add_reagent("sodiumchloride", 1) reagents.add_reagent("blackpepper", 1) bitesize = 1 @@ -546,7 +546,7 @@ New() ..() - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/flour name = "flour" @@ -566,7 +566,7 @@ New() ..() - reagents.add_reagent("nutriment", rand(3,5)) + reagents.add_reagent("protein", rand(3,5)) reagents.add_reagent("toxin", rand(1,3)) src.bitesize = 3 @@ -612,7 +612,7 @@ New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("protein", 3) reagents.add_reagent("carpotoxin", 3) src.bitesize = 6 @@ -624,7 +624,7 @@ New() ..() - reagents.add_reagent("nutriment", 4) + reagents.add_reagent("protein", 4) reagents.add_reagent("carpotoxin", 3) bitesize = 3 @@ -659,7 +659,7 @@ New() ..() - reagents.add_reagent("nutriment", 12) + reagents.add_reagent("protein", 12) reagents.add_reagent("hyperzine", 5) src.bitesize = 3 @@ -671,7 +671,7 @@ New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("protein", 3) src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/meatball @@ -682,7 +682,7 @@ New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("protein", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage @@ -693,7 +693,7 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donkpocket @@ -704,7 +704,8 @@ New() ..() - reagents.add_reagent("nutriment", 4) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) var/warm = 0 proc/cooltime() //Not working, derp? @@ -723,7 +724,7 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) reagents.add_reagent("alkysine", 6) bitesize = 2 @@ -750,7 +751,7 @@ icon_state = "hburger" New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheeseburger @@ -759,6 +760,7 @@ icon_state = "cheeseburger" New() ..() + reagents.add_reagent("protein", 2) reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger @@ -769,7 +771,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fishburger @@ -780,7 +783,7 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) reagents.add_reagent("carpotoxin", 3) bitesize = 3 @@ -828,7 +831,7 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/clownburger @@ -839,11 +842,6 @@ New() ..() -/* - var/datum/disease/F = new /datum/disease/pierrot_throat(0) - var/list/data = list("viruses"= list(F)) - reagents.add_reagent("blood", 4, data) -*/ reagents.add_reagent("nutriment", 6) bitesize = 2 @@ -868,7 +866,7 @@ //var/herp = 0 New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 8) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/muffin @@ -945,7 +943,7 @@ New() ..() - reagents.add_reagent("nutriment", 10) + reagents.add_reagent("protein", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylenviridians @@ -970,7 +968,7 @@ New() ..() - reagents.add_reagent("nutriment", 10) + reagents.add_reagent("protein", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofupie @@ -1025,7 +1023,7 @@ New() ..() - reagents.add_reagent("nutriment", 10) + reagents.add_reagent("protein", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/wingfangchu @@ -1037,7 +1035,7 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) bitesize = 2 @@ -1050,7 +1048,7 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeykabob @@ -1062,7 +1060,7 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofukabob @@ -1079,14 +1077,15 @@ /obj/item/weapon/reagent_containers/food/snacks/cubancarp name = "Cuban Carp" - desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" + desc = "A sandwich that burns your tongue and then leaves it numb!" icon_state = "cubancarp" trash = /obj/item/trash/plate filling_color = "#E9ADFF" New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) reagents.add_reagent("capsaicin", 3) bitesize = 3 @@ -1120,7 +1119,7 @@ New() ..() - reagents.add_reagent("nutriment", 4) + reagents.add_reagent("protein", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/no_raisin @@ -1178,7 +1177,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("protein", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fries @@ -1225,7 +1225,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 2) + reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie @@ -1260,7 +1261,7 @@ New() ..() - reagents.add_reagent("nutriment", 4) + reagents.add_reagent("protein", 4) reagents.add_reagent("sodiumchloride", 1) reagents.add_reagent("blackpepper", 1) bitesize = 3 @@ -1314,7 +1315,7 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 8) reagents.add_reagent("water", 5) bitesize = 5 @@ -1332,13 +1333,13 @@ /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "Tomato soup" - desc = "Smells like copper" + desc = "Smells like copper." icon_state = "tomatosoup" filling_color = "#FF0000" New() ..() - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) reagents.add_reagent("blood", 10) reagents.add_reagent("water", 5) bitesize = 5 @@ -1454,7 +1455,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1469,7 +1471,8 @@ trash = /obj/item/trash/snack_bowl New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) reagents.add_reagent("frostoil", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1503,7 +1506,7 @@ New() ..() - reagents.add_reagent("nutriment",10) + reagents.add_reagent("protein", 10) afterattack(obj/O as obj, mob/user as mob, proximity) if(!proximity) return @@ -1568,24 +1571,18 @@ desc = "Still wrapped in some paper." icon_state = "monkeycubewrap" wrapped = 1 - - /obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube name = "farwa cube" monkey_type = /mob/living/carbon/monkey/tajara /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube name = "farwa cube" monkey_type =/mob/living/carbon/monkey/tajara - - /obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube name = "stok cube" monkey_type = /mob/living/carbon/monkey/unathi /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube name = "stok cube" monkey_type =/mob/living/carbon/monkey/unathi - - /obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube name = "neaera cube" monkey_type = /mob/living/carbon/monkey/skrell @@ -1613,7 +1610,8 @@ New() ..() - reagents.add_reagent("nutriment", 14) + reagents.add_reagent("protein", 10) + reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/enchiladas @@ -1625,7 +1623,8 @@ New() ..() - reagents.add_reagent("nutriment",8) + reagents.add_reagent("protein", 6) + reagents.add_reagent("nutriment",2) reagents.add_reagent("capsaicin", 6) bitesize = 4 @@ -1638,7 +1637,7 @@ New() ..() - reagents.add_reagent("nutriment", 10) + reagents.add_reagent("protein", 10) reagents.add_reagent("banana", 5) reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) @@ -1665,7 +1664,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) bitesize = 3 @@ -1678,7 +1678,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich @@ -1690,7 +1691,8 @@ New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) reagents.add_reagent("carbon", 2) bitesize = 2 @@ -1703,7 +1705,8 @@ New() ..() - reagents.add_reagent("nutriment", 7) + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup @@ -1740,7 +1743,8 @@ New() ..() - reagents.add_reagent("nutriment", 10) + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) reagents.add_reagent("water", 5) @@ -1836,7 +1840,7 @@ /obj/item/weapon/reagent_containers/food/snacks/ricepudding name = "Rice Pudding" - desc = "Where's the Jam!" + desc = "Where's the jam?" icon_state = "rpudding" trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" @@ -1868,7 +1872,8 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw @@ -1879,7 +1884,8 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/poppypretzel @@ -1914,7 +1920,8 @@ New() ..() - reagents.add_reagent("nutriment", 50) + reagents.add_reagent("protein", 25) + reagents.add_reagent("nutriment", 25) bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/candiedapple @@ -2043,7 +2050,7 @@ New() ..() - reagents.add_reagent("nutriment", 5) + reagents.add_reagent("protein", 5) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/beetsoup @@ -2055,19 +2062,7 @@ New() ..() - switch(rand(1,6)) - if(1) - name = "borsch" - if(2) - name = "bortsch" - if(3) - name = "borstch" - if(4) - name = "borsh" - if(5) - name = "borshch" - if(6) - name = "borscht" + name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) reagents.add_reagent("nutriment", 8) bitesize = 2 @@ -2092,7 +2087,8 @@ New() ..() - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("protein", 2) + reagents.add_reagent("nutriment", 6) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart @@ -2125,7 +2121,8 @@ filling_color = "#FF7575" New() ..() - reagents.add_reagent("nutriment", 30) + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice @@ -2145,7 +2142,8 @@ filling_color = "#8AFF75" New() ..() - reagents.add_reagent("nutriment", 30) + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice @@ -2228,7 +2226,8 @@ filling_color = "#E6AEDB" New() ..() - reagents.add_reagent("nutriment", 25) + reagents.add_reagent("protein", 25) + reagents.add_reagent("nutriment", 5) reagents.add_reagent("alkysine", 10) bitesize = 2 @@ -2249,7 +2248,8 @@ filling_color = "#FAF7AF" New() ..() - reagents.add_reagent("nutriment", 25) + reagents.add_reagent("protein", 15) + reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice @@ -2364,7 +2364,7 @@ filling_color = "#FFF700" New() ..() - reagents.add_reagent("nutriment", 20) + reagents.add_reagent("protein", 20) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge @@ -2389,7 +2389,7 @@ /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice name = "Birthday Cake slice" - desc = "A slice of your birthday" + desc = "A slice of your birthday." icon_state = "birthdaycakeslice" trash = /obj/item/trash/plate filling_color = "#FFD6D6" @@ -2426,7 +2426,8 @@ filling_color = "#FFF896" New() ..() - reagents.add_reagent("nutriment", 20) + reagents.add_reagent("protein", 15) + reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice @@ -2511,7 +2512,8 @@ slices_num = 6 New() ..() - reagents.add_reagent("nutriment", 40) + reagents.add_reagent("nutriment", 35) + reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2530,7 +2532,7 @@ slices_num = 6 New() ..() - reagents.add_reagent("nutriment", 50) + reagents.add_reagent("protein", 50) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2550,6 +2552,7 @@ New() ..() reagents.add_reagent("nutriment", 35) + reagents.add_reagent("protein", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice @@ -2568,6 +2571,7 @@ New() ..() reagents.add_reagent("nutriment", 30) + reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("imidazoline", 12) bitesize = 2 @@ -2799,6 +2803,7 @@ bitesize = 2 New() ..() + reagents.add_reagent("protein", 1) reagents.add_reagent("nutriment", 3) // Dough + rolling pin = flat dough @@ -2818,6 +2823,7 @@ slices_num = 3 New() ..() + reagents.add_reagent("protein", 1) reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/doughslice @@ -2891,7 +2897,8 @@ bitesize = 3 New() ..() - reagents.add_reagent("nutriment", 7) + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -2901,7 +2908,7 @@ bitesize = 1 New() ..() - reagents.add_reagent("nutriment", 1) + reagents.add_reagent("protein", 1) /obj/item/weapon/reagent_containers/food/snacks/cutlet name = "cutlet" @@ -2911,7 +2918,7 @@ bitesize = 2 New() ..() - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/rawmeatball name = "raw meatball" @@ -2921,7 +2928,7 @@ bitesize = 2 New() ..() - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/hotdog name = "hotdog" @@ -2930,7 +2937,7 @@ bitesize = 2 New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 6) /obj/item/weapon/reagent_containers/food/snacks/flatbread name = "flatbread" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 925c43e17d..7394c72880 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -12,7 +12,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,60) volume = 60 - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER var/label_text = "" @@ -137,7 +137,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen)) - var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) + var/tmp_label = sanitize(copytext(input(user, "Enter a label for [src.name]","Label",src.label_text), 1, MAX_NAME_LEN)) if(length(tmp_label) > 10) user << "\red The label can be at most 10 characters long." else @@ -209,7 +209,7 @@ volume = 120 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,60,120) - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -218,7 +218,7 @@ matter = list("glass" = 500) volume = 60 amount_per_transfer_from_this = 10 - flags = FPRINT | TABLEPASS | OPENCONTAINER | NOREACT + flags = OPENCONTAINER | NOREACT /obj/item/weapon/reagent_containers/glass/beaker/bluespace name = "bluespace beaker" @@ -228,7 +228,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,60,120,300) - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/vial @@ -239,7 +239,7 @@ volume = 30 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25) - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/cryoxadone New() @@ -270,7 +270,7 @@ amount_per_transfer_from_this = 20 possible_transfer_amounts = list(10,20,30,60,120) volume = 120 - flags = FPRINT | OPENCONTAINER + flags = OPENCONTAINER attackby(var/obj/D, mob/user as mob) if(isprox(D)) @@ -297,7 +297,7 @@ volume = 15 amount_per_transfer_from_this = 5 possible_transfer_amounts = list(1,5,15) - flags = FPRINT | TABLEPASS | OPENCONTAINER */ + flags = OPENCONTAINER */ /* /obj/item/weapon/reagent_containers/glass/blender_jug @@ -329,7 +329,6 @@ amount_per_transfer_from_this = 20 possible_transfer_amounts = list(10,20,30,60) volume = 120 - flags = FPRINT /obj/item/weapon/reagent_containers/glass/dispenser name = "reagent glass" @@ -337,7 +336,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "beaker0" amount_per_transfer_from_this = 10 - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/dispenser/surfactant name = "reagent glass (surfactant)" diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 846eb3bfa7..44afd28407 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -9,7 +9,7 @@ item_state = "atoxinbottle" amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,60) - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER volume = 60 on_reagent_change() diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm index 9286e5ab03..7c8bf02a5b 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm @@ -2,7 +2,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/robot amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100) - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER volume = 60 var/reagent = "" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 49348a22a0..fd3557b62f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -11,7 +11,7 @@ amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = null - flags = FPRINT | TABLEPASS | OPENCONTAINER + flags = OPENCONTAINER slot_flags = SLOT_BELT /obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 1db8fa1aa4..cc9778eb4f 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/janitor.dmi' icon_state = "cleaner" item_state = "cleaner" - flags = TABLEPASS|OPENCONTAINER|FPRINT|NOBLUDGEON + flags = OPENCONTAINER|NOBLUDGEON slot_flags = SLOT_BELT throwforce = 3 w_class = 2.0 @@ -21,7 +21,7 @@ ..() src.verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT -/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) \ || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return @@ -46,7 +46,7 @@ user << "\The [src] is empty!" return - Spray_at(A) + Spray_at(A, user, proximity) playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) @@ -61,28 +61,39 @@ log_game("[key_name(user)] fired Space lube from \a [src].") return -/obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj) - var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src)) - D.create_reagents(amount_per_transfer_from_this) - reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_size) - D.icon += mix_color_from_reagents(D.reagents.reagent_list) +/obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj, mob/user as mob, proximity) + if (A.density && proximity) + A.visible_message("[usr] sprays [A] with [src].") + var/obj/D = new/obj() + D.create_reagents(amount_per_transfer_from_this) + reagents.trans_to(D, amount_per_transfer_from_this) + D.icon += mix_color_from_reagents(D.reagents.reagent_list) + spawn(0) + D.reagents.reaction(A) + sleep(5) + del(D) + else + var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src)) + D.create_reagents(amount_per_transfer_from_this) + reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_size) + D.icon += mix_color_from_reagents(D.reagents.reagent_list) - var/turf/A_turf = get_turf(A)//BS12 + var/turf/A_turf = get_turf(A)//BS12 - spawn(0) - for(var/i=0, i Invalid text.
    " return @@ -57,7 +57,7 @@ else nameset = 1 if("Description") - var/str = trim(copytext(sanitize(input(usr,"Label text?","Set label","")),1,MAX_MESSAGE_LEN)) + var/str = trim(sanitize(copytext(input(usr,"Label text?","Set label",""),1,MAX_MESSAGE_LEN))) if(!str || !length(str)) usr << "\red Invalid text." return @@ -115,7 +115,6 @@ icon_state = "deliverycrate3" var/obj/item/wrapped = null var/sortTag = null - flags = FPRINT var/examtext = null var/nameset = 0 var/tag_x @@ -151,7 +150,7 @@ else if(istype(W, /obj/item/weapon/pen)) switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) if("Title") - var/str = trim(copytext(sanitize(input(usr,"Label text?","Set label","")),1,MAX_NAME_LEN)) + var/str = trim(sanitize(copytext(input(usr,"Label text?","Set label",""),1,MAX_NAME_LEN))) if(!str || !length(str)) usr << " Invalid text." return @@ -166,7 +165,7 @@ nameset = 1 if("Description") - var/str = trim(copytext(sanitize(input(usr,"Label text?","Set label","")),1,MAX_MESSAGE_LEN)) + var/str = trim(sanitize(copytext(input(usr,"Label text?","Set label",""),1,MAX_MESSAGE_LEN))) if(!str || !length(str)) usr << "\red Invalid text." return @@ -305,7 +304,7 @@ examine(mob/user) if(..(user, 0)) user << "\blue There are [amount] units of package wrap left!" - + return @@ -317,7 +316,7 @@ w_class = 2 item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT slot_flags = SLOT_BELT proc/openwindow(mob/user as mob) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 3f40be01df..8d390fa785 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - /* Research and Development (R&D) Console @@ -27,8 +25,6 @@ cause a ton of data to be lost, an admin can go send it back. - The second method is with Technology Disks and Design Disks. Each of these disks can hold a single technology or design datum in it's entirety. You can then take the disk to any R&D console and upload it's data to it. This method is a lot more secure (since it won't update every console in existence) but it's more of a hassle to do. Also, the disks can be stolen. - - */ /obj/machinery/computer/rdconsole @@ -523,9 +519,50 @@ won't update every console in existence) but it's more of a hassle to do. Also, spawn(20) screen = 1.6 updateUsrDialog() + + else if (href_list["print"]) //Print research information + screen = 0.5 + spawn(20) + var/obj/item/weapon/paper/PR = new/obj/item/weapon/paper + PR.name = "list of researched technologies" + PR.info = "
    [station_name()] Science Laboratories" + PR.info += "

    [ (text2num(href_list["print"]) == 2) ? "Detailed" : ] Research Progress Report

    " + PR.info += "report prepared at [worldtime2text()] station time

    " + if(text2num(href_list["print"]) == 2) + PR.info += GetResearchListInfo() + else + PR.info += GetResearchLevelsInfo() + PR.info_links = PR.info + PR.icon_state = "paper_words" + PR.loc = src.loc + spawn(10) + screen = ((text2num(href_list["print"]) == 2) ? 5.0 : 1.1) + updateUsrDialog() + updateUsrDialog() return +/obj/machinery/computer/rdconsole/proc/GetResearchLevelsInfo() + var/dat + dat += "
      " + for(var/datum/tech/T in files.known_tech) + dat += "
    • " + dat += "[T.name]" + dat += "
        " + dat += "
      • Level: [T.level]" + dat += "
      • Summary: [T.desc]" + dat += "
      " + return dat + +/obj/machinery/computer/rdconsole/proc/GetResearchListInfo() + var/dat + dat += "
        " + for(var/datum/design/D in files.known_designs) + if(D.build_path) + dat += "
      • [D.name]: [D.desc]" + dat += "
      " + return dat + /obj/machinery/computer/rdconsole/attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) return @@ -570,6 +607,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(0.4) dat += "Imprinting Circuit. Please Wait..." + if(0.5) + dat += "Printing Research Information. Please Wait..." + if(1.0) //Main Menu dat += "Main Menu:

      " dat += "Loaded disk: " @@ -593,16 +633,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "
    " if(1.1) //Research viewer - dat += "Main Menu
    " + dat += "Main Menu || " + dat += "Print This Page
    " dat += "Current Research Levels:

    " - dat += "
      " - for(var/datum/tech/T in files.known_tech) - dat += "
    • " - dat += "[T.name]" - dat += "
        " - dat += "
      • Level: [T.level]" - dat += "
      • Summary: [T.desc]" - dat += "
      " + dat += GetResearchLevelsInfo() dat += "
    " if(1.2) //Technology Disk Menu @@ -897,14 +931,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, ///////////////////Research Information Browser//////////////////// if(5.0) - dat += "Main Menu
    " + dat += "Main Menu || " + dat += "Print This Page
    " dat += "List of Researched Technologies and Designs:" - dat += "
      " - for(var/datum/design/D in files.known_designs) - if(D.build_path) - dat += "
    • [D.name]: [D.desc]" - dat += "
    " - + dat += GetResearchListInfo() user << browse("Research and Development Console
    [dat]", "window=rdconsole;size=850x600") onclose(user, "rdconsole") @@ -917,4 +947,4 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/core name = "Core R&D Console" - id = 1 \ No newline at end of file + id = 1 diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 3dcd21e9bb..c7ed90f786 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -185,7 +185,7 @@ datum/tech/materials datum/tech/engineering name = "Engineering Research" - desc = "Development of new and improved engineering parts and." + desc = "Development of new and improved engineering parts." id = "engineering" datum/tech/phorontech diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm index fb01ee4661..9c3cc70eeb 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm @@ -26,9 +26,7 @@ /mob/living/simple_animal/hostile/giant_spider/nurse,\ /mob/living/simple_animal/hostile/alien,\ /mob/living/simple_animal/hostile/bear,\ - /mob/living/simple_animal/hostile/creature,\ - /mob/living/simple_animal/hostile/panther,\ - /mob/living/simple_animal/hostile/snake\ + /mob/living/simple_animal/hostile/creature\ ) else spawn_type = pick(\ diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm index 1b3afdd22c..4108986789 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm @@ -102,7 +102,7 @@ spawned_obj.desc += " It is made of [source_material]." else spawned_obj.desc = "It is made of [source_material]." - source_material.loc = null + del(source_material) spawn_progress_time = 0 max_spawn_time = rand(30,100) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index 8eca5f355d..b8d1c9a87c 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -8,7 +8,7 @@ if(prob(100 * weakness)) user << "\red You are suddenly zapped away elsewhere!" if (user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(user)) @@ -28,7 +28,7 @@ if(prob(100 * weakness)) M << "\red You are displaced by a strange force!" if(M.buckled) - M.buckled.unbuckle() + M.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) @@ -47,7 +47,7 @@ if(prob(100 * weakness)) M << "\red You are displaced by a strange force!" if(M.buckled) - M.buckled.unbuckle() + M.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index e6c622a94a..f5b718dcf0 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -80,7 +80,7 @@ datum amount_per_transfer_from_this = 1 possible_transfer_amounts = list(1, 2) volume = 2 - flags = FPRINT | OPENCONTAINER + flags = OPENCONTAINER obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/W as obj, mob/living/user as mob) if(istype(W, /obj/item/weapon/pen)) diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm index df2ff6d852..14b84fd805 100644 --- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm @@ -5,7 +5,7 @@ icon_state = "samak" icon_living = "samak" icon_dead = "samak_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'icons/jungle.dmi' move_to_delay = 2 maxHealth = 125 health = 125 @@ -26,7 +26,7 @@ icon_state = "diyaab" icon_living = "diyaab" icon_dead = "diyaab_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'icons/jungle.dmi' move_to_delay = 1 maxHealth = 25 health = 25 @@ -47,7 +47,7 @@ icon_state = "shantak" icon_living = "shantak" icon_dead = "shantak_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'icons/jungle.dmi' move_to_delay = 1 maxHealth = 75 health = 75 @@ -66,7 +66,7 @@ icon_state = "yithian" icon_living = "yithian" icon_dead = "yithian_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'icons/jungle.dmi' /mob/living/simple_animal/tindalos name = "tindalos" @@ -74,4 +74,4 @@ icon_state = "tindalos" icon_living = "tindalos" icon_dead = "tindalos_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'icons/jungle.dmi' diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm index 776d91751c..441630af30 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm @@ -147,9 +147,9 @@ cur_artifact = analysed //if both effects are active, we can't harvest either - if(cur_artifact.my_effect && cur_artifact.my_effect.activated && cur_artifact.secondary_effect.activated) + if(cur_artifact.my_effect && cur_artifact.my_effect.activated && cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated) src.visible_message("[src] states, \"Cannot harvest. Source is emitting conflicting energy signatures.\"") - else if(!cur_artifact.my_effect.activated && !cur_artifact.secondary_effect.activated) + else if(!cur_artifact.my_effect.activated && !(cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated)) src.visible_message("[src] states, \"Cannot harvest. No energy emitting from source.\"") else diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm index 38fab6221f..6f79f8d8ba 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm @@ -6,7 +6,6 @@ icon_state = "flashgun" item_state = "lampgreen" w_class = 2.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT var/nearest_artifact_id = "unknown" var/nearest_artifact_distance = -1 diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index bcfa0eb823..7c357b53da 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -20,7 +20,6 @@ icon_state = "sampler0" item_state = "screwdriver_brown" w_class = 1.0 - flags = FPRINT | TABLEPASS //slot_flags = SLOT_BELT var/sampled_turf = "" var/num_stored_bags = 10 diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm index 111e465e48..425b3e0dc3 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm @@ -10,7 +10,6 @@ icon_state = "crap" item_state = "analyzer" w_class = 2.0 - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT var/list/positive_locations = list() var/datum/depth_scan/current diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index d2d8148c13..95b3276bd3 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -20,7 +20,7 @@ // var/maxshieldload = 200 var/obj/structure/cable/attached // the attached cable var/storedpower = 0 - flags = FPRINT | CONDUCT + flags = CONDUCT //There have to be at least two posts, so these are effectively doubled var/power_draw = 30000 //30 kW. How much power is drawn from powernet. Increase this to allow the generator to sustain longer shields, at the cost of more power draw. var/max_stored_power = 50000 //50 kW diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index dcd6cc4b31..72cff7ab3d 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -67,8 +67,7 @@ /datum/surgery_step/open_encased/retract allowed_tools = list( /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 + /obj/item/weapon/crowbar = 75 ) min_duration = 30 @@ -124,8 +123,7 @@ /datum/surgery_step/open_encased/close allowed_tools = list( /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 + /obj/item/weapon/crowbar = 75 ) min_duration = 20 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 238657c28d..2642b87cb7 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -305,7 +305,7 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] cuts off [target]'s [affected.display_name] with \the [tool].", \ "\blue You cut off [target]'s [affected.display_name] with \the [tool].") - affected.droplimb(1,0) + affected.droplimb(1,1,1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index bb7d25046a..32546da143 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -198,12 +198,13 @@ if(worm.controlling) target.release_control() worm.detatch() - - obj.loc = get_turf(target) - if(istype(obj,/obj/item/weapon/implant)) - var/obj/item/weapon/implant/imp = obj - imp.imp_in = null - imp.implanted = 0 + worm.leave_host() + else + obj.loc = get_turf(target) + if(istype(obj,/obj/item/weapon/implant)) + var/obj/item/weapon/implant/imp = obj + imp.imp_in = null + imp.implanted = 0 else user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.display_name].", \ "\blue There's something inside [target]'s [affected.display_name], but you just missed it this time." ) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index ccd9d388e2..c954c16de6 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -169,3 +169,43 @@ "\red Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.display_name] with the [tool]!") //no damage or anything, just wastes medicine + +/datum/surgery_step/hardsuit + allowed_tools = list( + /obj/item/weapon/weldingtool = 80, + /obj/item/weapon/circular_saw = 60, + /obj/item/weapon/pickaxe/plasmacutter = 100 + ) + + can_infect = 0 + blood_level = 0 + + min_duration = 120 + max_duration = 180 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!istype(target)) + return 0 + if(istype(tool,/obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/welder = tool + if(!welder.isOn()) + return 0 + return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove) + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \ + "You start cutting through the support systems of [target]'s [target.back] with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + var/obj/item/weapon/rig/rig = target.back + if(!istype(rig)) + return + rig.reset() + user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool].", \ + "You have cut through the support systems of [target]'s [rig] with \the [tool].") + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \ + "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.") \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 3f5cc5800f..825a4c582e 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -98,7 +98,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) //We had proper tools! (or RNG smiled.) and user did not move or change hands. if(prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully - else if (tool in user.contents && user.Adjacent(M)) //or + else if ((tool in user.contents) && user.Adjacent(M)) //or S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ else // This failing silently was a pain. user << "\red You must remain close to your patient to conduct surgery." diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index df2286f70e..24f1542219 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -13,6 +13,10 @@ animate_movement=1 luminosity = 3 + can_buckle = 1 + buckle_movable = 1 + buckle_lying = 0 + var/attack_log = null var/on = 0 var/health = 0 //do not forget to set health for your vehicle! @@ -25,7 +29,6 @@ var/emagged = 0 var/powered = 0 //set if vehicle is powered and should use fuel when moving var/move_delay = 1 //set this to limit the speed of the vehicle - var/movable = 1 var/obj/item/weapon/cell/cell var/charge_use = 5 //set this to adjust the amount of power the vehicle uses per move @@ -298,9 +301,7 @@ C.layer = layer + 0.1 //so it sits above the vehicle if(ismob(C)) - var/mob/M = C - M.buckled = src - M.update_canmove() + buckle_mob(C) return 1 @@ -337,16 +338,13 @@ load.forceMove(dest) load.set_dir(get_dir(loc, dest)) - load.anchored = initial(load.anchored) + load.anchored = 0 //we can only load non-anchored items, so it makes sense to set this to false load.pixel_x = initial(load.pixel_x) load.pixel_y = initial(load.pixel_y) load.layer = initial(load.layer) if(ismob(load)) - var/mob/M = load - M.buckled = null - M.anchored = initial(M.anchored) - M.update_canmove() + unbuckle_mob(load) load = null diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 977c9ab9ca..0f16b91b34 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -16,17 +16,21 @@ uniqueID = rand(0,10000) ..() -/datum/disease2/disease/proc/makerandom(var/greater=0) +/datum/disease2/disease/proc/makerandom(var/severity=1) for(var/i=1 ; i <= max_stage ; i++ ) var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder holder.stage = i - if(greater) - holder.getrandomeffect(2) - else - holder.getrandomeffect() + holder.getrandomeffect(severity) effects += holder uniqueID = rand(0,10000) - infectionchance = rand(60,90) + switch(severity) + if(1) + infectionchance = 1 + if(2) + infectionchance = rand(10,20) + else + infectionchance = rand(60,90) + antigen |= text2num(pick(ANTIGENS)) antigen |= text2num(pick(ANTIGENS)) spreadtype = prob(70) ? "Airborne" : "Contact" @@ -76,7 +80,7 @@ clicks += 10 //Moving to the next stage - if(clicks > stage*100 && prob(10)) + if(clicks > max(stage*100, 200) && prob(10)) if(stage == max_stage) src.cure(mob) mob.antibodies |= src.antigen @@ -84,7 +88,8 @@ clicks = 0 //Do nasty effects for(var/datum/disease2/effectholder/e in effects) - e.runeffect(mob,stage) + if(prob(33)) + e.runeffect(mob,stage) //Short airborne spread if(src.spreadtype == "Airborne") diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 3ebeefeba8..50d7bcb569 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -9,7 +9,7 @@ /datum/disease2/effectholder/proc/runeffect(var/mob/living/carbon/human/mob,var/stage) if(happensonce > -1 && effect.stage <= stage && prob(chance)) - effect.activate(mob) + effect.activate(mob, multiplier) if(happensonce == 1) happensonce = -1 @@ -33,14 +33,14 @@ multiplier = rand(1,effect.maxm) /datum/disease2/effectholder/proc/majormutate() - getrandomeffect(2) + getrandomeffect(3) //////////////////////////////////////////////////////////////// ////////////////////////EFFECTS///////////////////////////////// //////////////////////////////////////////////////////////////// /datum/disease2/effect - var/chance_maxm = 50 + var/chance_maxm = 50 //note that disease effects only proc once every 3 ticks for humans var/name = "Blanking effect" var/stage = 4 var/maxm = 1 @@ -56,10 +56,16 @@ ////////////////////////STAGE 4///////////////////////////////// +/datum/disease2/effect/nothing + name = "Nil Syndrome" + stage = 4 + badness = 1 + chance_maxm = 0 + /datum/disease2/effect/gibbingtons name = "Gibbingtons Syndrome" stage = 4 - badness = 2 + badness = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.gib() @@ -67,19 +73,21 @@ name = "Radian's Syndrome" stage = 4 maxm = 3 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.radiation += (2*multiplier) /datum/disease2/effect/deaf name = "Dead Ear Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.ear_deaf += 20 /datum/disease2/effect/monkey name = "Monkism Syndrome" stage = 4 - badness = 2 + badness = 3 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob,/mob/living/carbon/human)) var/mob/living/carbon/human/h = mob @@ -88,7 +96,7 @@ /datum/disease2/effect/suicide name = "Suicidal Syndrome" stage = 4 - badness = 2 + badness = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.suiciding = 1 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while @@ -101,12 +109,14 @@ /datum/disease2/effect/killertoxins name = "Toxification Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.adjustToxLoss(15*multiplier) /datum/disease2/effect/dna name = "Reverse Pattern Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.bodytemperature = max(mob.bodytemperature, 350) scramble(0,mob,10) @@ -115,6 +125,7 @@ /datum/disease2/effect/organs name = "Shutdown Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob, /mob/living/carbon/human)) var/mob/living/carbon/human/H = mob @@ -140,6 +151,7 @@ /datum/disease2/effect/immortal name = "Longevity Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob, /mob/living/carbon/human)) var/mob/living/carbon/human/H = mob @@ -157,11 +169,10 @@ var/backlash_amt = 5*multiplier mob.apply_damages(backlash_amt,backlash_amt,backlash_amt,backlash_amt) -////////////////////////STAGE 3///////////////////////////////// - /datum/disease2/effect/bones name = "Fragile Bones Syndrome" stage = 4 + badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob, /mob/living/carbon/human)) var/mob/living/carbon/human/H = mob @@ -174,6 +185,8 @@ for (var/datum/organ/external/E in H.organs) E.min_broken_damage = initial(E.min_broken_damage) +////////////////////////STAGE 3///////////////////////////////// + /datum/disease2/effect/toxins name = "Hyperacidity" stage = 3 @@ -192,9 +205,8 @@ name = "Telepathy Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.dna.check_integrity() mob.dna.SetSEState(REMOTETALKBLOCK,1) - domutcheck(mob, null) + domutcheck(mob, null, MUTCHK_FORCED) /datum/disease2/effect/mind name = "Lazy Mind Syndrome" @@ -239,10 +251,10 @@ activate(var/mob/living/carbon/mob,var/multiplier) mob.apply_damage(2, CLONE) - /datum/disease2/effect/groan name = "Groaning Syndrome" stage = 3 + chance_maxm = 25 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*groan") ////////////////////////STAGE 2///////////////////////////////// @@ -250,6 +262,7 @@ /datum/disease2/effect/scream name = "Loudness Syndrome" stage = 2 + chance_maxm = 25 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*scream") @@ -262,6 +275,7 @@ /datum/disease2/effect/sleepy name = "Resting Syndrome" stage = 2 + chance_maxm = 15 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*collapse") @@ -288,6 +302,7 @@ /datum/disease2/effect/fridge name = "Refridgerator Syndrome" stage = 2 + chance_maxm = 25 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*shiver") @@ -333,17 +348,19 @@ name = "Flemmingtons" stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red Mucous runs down the back of your throat." + mob << "Mucous runs down the back of your throat." /datum/disease2/effect/drool name = "Saliva Effect" stage = 1 + chance_maxm = 25 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*drool") /datum/disease2/effect/twitch name = "Twitcher" stage = 1 + chance_maxm = 25 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*twitch") @@ -351,4 +368,4 @@ name = "Headache" stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) - mob << " Your head hurts a bit" + mob << "Your head hurts a bit." diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 6118dade42..6f55e3ba58 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -1,53 +1,61 @@ -//Returns 1 if mob can be infected, 0 otherwise. Checks his clothing. -proc/get_infection_chance(var/mob/living/carbon/M, var/vector = "Airborne") - var/score = 0 +//Returns 1 if mob can be infected, 0 otherwise. +proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") if (!istype(M)) return 0 - if(istype(M, /mob/living/carbon/human)) + var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. + var/score = round(0.06*protection) //scales 100% protection to 6. - if (vector == "Airborne") - if(M.internal) //not breathing infected air helps greatly - score = 30 - if(M.wear_mask) - score += 5 - if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal) - score += 10 - if(istype(M:wear_suit, /obj/item/clothing/suit/space) && istype(M:head, /obj/item/clothing/head/helmet/space)) - score += 20 - if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit) && istype(M:head, /obj/item/clothing/head/bio_hood)) - score += 30 + switch(vector) + if("Airborne") + if(M.internal) + score = 6 //not breathing infected air helps greatly + var/obj/item/I = M.wear_mask + + //masks provide a small bonus and can replace overall bio protection + score = max(score, round(0.06*I.armor["bio"])) + if (istype(I, /obj/item/clothing/mask)) + score += 1 //this should be added after + + if("Contact") + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + //gloves provide a larger bonus + if (istype(H.gloves, /obj/item/clothing/gloves)) + score += 2 - - if (vector == "Contact") - if(M:gloves) score += 15 - if(istype(M:wear_suit, /obj/item/clothing/suit/space) && istype(M:head, /obj/item/clothing/head/helmet/space)) - score += 15 - if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit) && istype(M:head, /obj/item/clothing/head/bio_hood)) - score += 15 - - -// log_debug("[M]'s resistance to [vector] viruses: [score]") - - if(score >= 30) + if(score >= 6) return 0 - else if(score == 25 && prob(99)) + else if(score >= 5 && prob(99)) return 0 - else if(score == 20 && prob(95)) + else if(score >= 4 && prob(95)) return 0 - else if(score == 15 && prob(75)) + else if(score >= 3 && prob(75)) return 0 - else if(score == 10 && prob(55)) + else if(score >= 2 && prob(55)) return 0 - else if(score == 5 && prob(35)) + else if(score >= 1 && prob(35)) return 0 -// log_debug("Infection got through") return 1 +//Similar to infection check, but used for when M is spreading the virus. +/proc/infection_spreading_check(var/mob/living/carbon/M, var/vector = "Airborne") + if (!istype(M)) + return 0 + + var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. + + if (vector == "Airborne") + var/obj/item/I = M.wear_mask + if (istype(I)) + protection = max(protection, round(0.06*I.armor["bio"])) + + return prob(protection) + //Checks if table-passing table can reach target (5 tile radius) proc/airborne_can_reach(turf/source, turf/target) var/obj/dummy = new(source) - dummy.flags = FPRINT | TABLEPASS dummy.pass_flags = PASSTABLE for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break @@ -72,44 +80,42 @@ proc/airborne_can_reach(turf/source, turf/target) return if(M.reagents.has_reagent("spaceacillin")) return - - if(istype(M,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/chimp = M - if (!(chimp.greaterform in disease.affected_species)) - return - - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/chump = M - if (!(chump.species.name in disease.affected_species)) - return + + if(!disease.affected_species.len) + return + + if (!(M.species.name in disease.affected_species)) + if (forced) + disease.affected_species[1] = M.species.name + else + return //not compatible with this species // log_debug("Infecting [M]") - if(prob(disease.infectionchance) || forced) - // certain clothes can prevent an infection - if(!forced && !get_infection_chance(M, disease.spreadtype)) - return - + if(forced || (infection_check(M, disease.spreadtype) && prob(disease.infectionchance))) var/datum/disease2/disease/D = disease.getcopy() D.minormutate() // log_debug("Adding virus") M.virus2["[D.uniqueID]"] = D M.hud_updateflag |= 1 << STATUS_HUD + +//Infects mob M with disease D +/proc/infect_mob(var/mob/living/carbon/M, var/datum/disease2/disease/D) + infect_virus2(M,D,1) + M.hud_updateflag |= 1 << STATUS_HUD + //Infects mob M with random lesser disease, if he doesn't have one /proc/infect_mob_random_lesser(var/mob/living/carbon/M) var/datum/disease2/disease/D = new /datum/disease2/disease - D.makerandom() - D.infectionchance = 1 - infect_virus2(M,D,1) - M.hud_updateflag |= 1 << STATUS_HUD + D.makerandom(1) + infect_mob(M, D) //Infects mob M with random greated disease, if he doesn't have one /proc/infect_mob_random_greater(var/mob/living/carbon/M) var/datum/disease2/disease/D = new /datum/disease2/disease - D.makerandom(1) - infect_virus2(M,D,1) - M.hud_updateflag |= 1 << STATUS_HUD + D.makerandom(2) + infect_mob(M, D) //Fancy prob() function. /proc/dprob(var/p) @@ -125,12 +131,15 @@ proc/airborne_can_reach(turf/source, turf/target) // log_debug("Attempting virus [ID]") var/datum/disease2/disease/V = virus2[ID] if(V.spreadtype != vector) continue + + //It's hard to get other people sick if you're in an airtight suit. + if(!infection_spreading_check(src, V.spreadtype)) continue if (vector == "Airborne") if(airborne_can_reach(get_turf(src), get_turf(victim))) // log_debug("In range, infecting") infect_virus2(victim,V) - else +// else // log_debug("Could not reach target") if (vector == "Contact") @@ -147,7 +156,7 @@ proc/airborne_can_reach(turf/source, turf/target) var/mob/living/carbon/human/H = victim var/datum/organ/external/select_area = H.get_organ(src.zone_sel.selecting) var/list/clothes = list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.gloves, H.shoes) - for(var/obj/item/clothing/C in clothes ) + for(var/obj/item/clothing/C in clothes) if(C && istype(C)) if(C.body_parts_covered & select_area.body_part) nudity = 0 @@ -155,4 +164,5 @@ proc/airborne_can_reach(turf/source, turf/target) for (var/ID in victim.virus2) var/datum/disease2/disease/V = victim.virus2[ID] if(V && V.spreadtype != vector) continue + if(!infection_spreading_check(victim, V.spreadtype)) continue infect_virus2(src,V) diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index d145ac0b2a..a2a102611d 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -6,7 +6,7 @@ icon_state = "health" w_class = 2.0 item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT + flags = CONDUCT /obj/item/device/antibody_scanner/attack(mob/M as mob, mob/user as mob) if(!istype(M,/mob/living/carbon/)) diff --git a/code/setup.dm b/code/setup.dm index c3ab2739a8..4b91223b21 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -11,8 +11,17 @@ //radiation constants #define STEFAN_BOLTZMANN_CONSTANT 5.6704e-8 //W/(m^2*K^4) #define COSMIC_RADIATION_TEMPERATURE 3.15 //K -#define AVERAGE_SOLAR_RADIATION 200 //W/m^2. Kind of arbitrary. Really this should depend on the sun position much like solars. -#define RADIATOR_OPTIMUM_PRESSURE 110 //kPa at 20 C +#define AVERAGE_SOLAR_RADIATION 200 //W/m^2. Kind of arbitrary. Really this should depend on the sun position much like solars. From the numbers on Erebus, this'd be an orbit of 23.3 lightseconds. +#define RADIATOR_OPTIMUM_PRESSURE 3771 //kPa - this should be higher as gasses aren't great conductors until they are dense. Used the critical pressure for air. +#define GAS_CRITICAL_TEMPERATURE 132.65 //K - the critical point temperature for air + +/* + The pipe looks to be thin vertically and wide horizontally, so we'll assume that it's + three centimeters thick, one meter wide, and only explosed to the sun 3 degrees off of edge-on. + Since the radiatior is uniform along it's length, the ratio of surface area touched by sunlight + to the total surface area is the same as the ratio of the perimeter of the cross-section. +*/ +#define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)) //unitless ratio #define CELL_VOLUME 2500 //liters in a cell #define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC @@ -68,6 +77,15 @@ #define SHOE_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //For gloves #define SHOE_MAX_HEAT_PROTECTION_TEMPERATURE 1500 //For gloves +//Fire +#define FIRE_MIN_STACKS -20 +#define FIRE_MAX_STACKS 25 +//If the number of stacks goes above this firesuits won't protect you anymore. If not you can walk around while on fire like a badass. +#define FIRE_MAX_FIRESUIT_STACKS 20 + +#define THROWFORCE_SPEED_DIVISOR 5 //The throwing speed value at which the throwforce multiplier is exactly 1. +#define THROWNOBJ_KNOCKBACK_SPEED 15 //The minumum speed of a thrown object that will cause living mobs it hits to be knocked back. +#define THROWNOBJ_KNOCKBACK_DIVISOR 2 //Affects how much speed the mob is knocked back with #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( @@ -166,36 +184,34 @@ //FLAGS BITMASK #define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere //To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. -#define TABLEPASS 2 // can pass by a table or rack -#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler -#define AIRTIGHT 8 // functions with internals -#define USEDELAY 16 // 1 second extra delay on use (Can be used once every 2s) -#define NOSHIELD 32 // weapon not affected by shield -#define CONDUCT 64 // conducts electricity (metal etc.) -#define FPRINT 256 // takes a fingerprint -#define ON_BORDER 512 // item has priority to check when entering or leaving -#define NOBLOODY 2048 // used to items if they don't want to get a blood overlay -#define NODELAY 32768 // 1 second attackby delay skipped (Can be used once every 0.2s). Most objects have a 1s attackby delay, which doesn't require a flag. +#define NOBLUDGEON 2 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler +#define AIRTIGHT 4 // functions with internals +#define USEDELAY 8 // 1 second extra delay on use (Can be used once every 2s) +#define NOSHIELD 16 // weapon not affected by shield +#define CONDUCT 32 // conducts electricity (metal etc.) +#define ON_BORDER 64 // item has priority to check when entering or leaving +#define NOBLOODY 512 // used to items if they don't want to get a blood overlay +#define NODELAY 8192 // 1 second attackby delay skipped (Can be used once every 0.2s). Most objects have a 1s attackby delay, which doesn't require a flag. -#define GLASSESCOVERSEYES 1024 -#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags -#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes -#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head -#define HEADCOVERSMOUTH 2048 +#define GLASSESCOVERSEYES 256 +#define MASKCOVERSEYES 256 // get rid of some of the other retardation in these flags +#define HEADCOVERSEYES 256 // feel free to realloc these numbers for other purposes +#define MASKCOVERSMOUTH 512 // on other items, these are just for mask/head +#define HEADCOVERSMOUTH 512 -#define THICKMATERIAL 1024 //From /tg: prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP for shoes) -#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc +#define THICKMATERIAL 256 //From /tg: prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP for shoes) +#define NOSLIP 256 //prevents from slipping on wet floors, in space etc -#define OPENCONTAINER 4096 // is an open container for chemistry purposes +#define OPENCONTAINER 1024 // is an open container for chemistry purposes -#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) -#define ONESIZEFITSALL 8192 -#define PHORONGUARD 16384 //Does not get contaminated by phoron. +#define BLOCK_GAS_SMOKE_EFFECT 2048 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) +#define ONESIZEFITSALL 2048 +#define PHORONGUARD 4096 //Does not get contaminated by phoron. -#define NOREACT 16384 //Reagents dont' react inside this container. +#define NOREACT 4096 //Reagents dont' react inside this container. #define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair. -#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise. +#define BLOCKHAIR 8192 // temporarily removes the user's hair, facial and otherwise. //flags for pass_flags #define PASSTABLE 1 @@ -478,6 +494,8 @@ #define INVISIBILITY_OBSERVER 60 #define SEE_INVISIBLE_OBSERVER 60 +#define INVISIBILITY_AI_EYE 61 +#define SEE_INVISIBLE_OBSERVER_AI_EYE 61 #define INVISIBILITY_MAXIMUM 100 diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 8a3eaf1a40..5bb538a3dc 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -19,7 +19,7 @@ em {font-style: normal;font-weight: bold;} .ooc img.text_tag {width: 32px; height: 10px;} .ooc .everyone {color: #002eb8;} -.ooc .looc {color: #6699cc;} +.ooc .looc {color: #3A9696;} .ooc .elevated {color: #2e78d9;} .ooc .moderator {color: #184880;} .ooc .developer {color: #1b521f;} @@ -28,12 +28,12 @@ em {font-style: normal;font-weight: bold;} /* Admin: Private Messages */ .pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;} .pm .in {color: #ff0000;} -.pm .out {color: #B54A4A;} -.pm .other {color: #164664;} +.pm .out {color: #ff0000;} +.pm .other {color: #0000ff;} /* Admin: Channels */ .mod_channel {color: #735638; font-weight: bold;} -.mod_channel .admin {color: #e40045; font-weight: bold;} +.mod_channel .admin {color: #b82e00; font-weight: bold;} .admin_channel {color: #9611D4; font-weight: bold;} /* Radio: Misc */ diff --git a/code/unused/AI_Visibility.dm b/code/unused/AI_Visibility.dm deleted file mode 100644 index d218f4409b..0000000000 --- a/code/unused/AI_Visibility.dm +++ /dev/null @@ -1,310 +0,0 @@ -//All credit for this goes to Uristqwerty. - -/turf - var/image/obscured - var/image/dim - -/turf/proc/visibilityChanged() - cameranet.updateVisibility(src) - -/datum/camerachunk - var/list/obscuredTurfs = list() - var/list/visibleTurfs = list() - var/list/dimTurfs = list() - var/list/obscured = list() - var/list/dim = list() - var/list/cameras = list() - var/list/turfs = list() - var/list/seenby = list() - var/visible = 0 - var/changed = 0 - var/updating = 0 - -/mob/aiEye - var/list/visibleCameraChunks = list() - var/mob/ai = null - density = 0 - -/datum/camerachunk/proc/add(mob/aiEye/ai) - ai.visibleCameraChunks += src - if(ai.ai.client) - ai.ai.client.images += obscured - ai.ai.client.images += dim - visible++ - seenby += ai - if(changed && !updating) - update() - -/datum/camerachunk/proc/remove(mob/aiEye/ai) - ai.visibleCameraChunks -= src - if(ai.ai.client) - ai.ai.client.images -= obscured - ai.ai.client.images -= dim - seenby -= ai - if(visible > 0) - visible-- - -/datum/camerachunk/proc/visibilityChanged(turf/loc) - if(!(loc in visibleTurfs)) - return - - hasChanged() - -/datum/camerachunk/proc/hasChanged() - if(visible) - if(!updating) - updating = 1 - spawn(10)//Batch large changes, such as many doors opening or closing at once - update() - updating = 0 - else - changed = 1 - -/datum/camerachunk/proc/update() - var/list/newDimTurfs = list() - var/list/newVisibleTurfs = list() - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 6 - for(var/turf/t in view(7, c)) - if(t in turfs) - newDimTurfs += t - - for(var/turf/t in view(6, c)) - if(t in turfs) - newVisibleTurfs += t - - c.luminosity = lum - - var/list/dimAdded = newDimTurfs - dimTurfs - var/list/dimRemoved = dimTurfs - newDimTurfs - var/list/visAdded = newVisibleTurfs - visibleTurfs - var/list/visRemoved = visibleTurfs - newVisibleTurfs - - visibleTurfs = newVisibleTurfs - dimTurfs = newDimTurfs - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in dimRemoved) - if(t.dim) - dim -= t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.dim - - if(!(t in visibleTurfs)) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured - - for(var/turf/t in dimAdded) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", 15) - t.mouse_opacity = 0 - - dim += t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.dim - - if(t.obscured) - obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured - - for(var/turf/t in visAdded) - if(t.obscured) - obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured - - for(var/turf/t in visRemoved) - if(t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured - - - -/datum/camerachunk/New(loc, x, y, z) - x &= ~0xf - y &= ~0xf - - for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z))) - if(c.status) - cameras += c - - for(var/turf/t in range(10, locate(x + 8, y + 8, z))) - if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16) - turfs += t - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 6 - for(var/turf/t in view(7, c)) - if(t in turfs) - dimTurfs += t - - for(var/turf/t in view(6, c)) - if(t in turfs) - visibleTurfs += t - - c.luminosity = lum - - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) - - obscured += t.obscured - - for(var/turf/t in dimTurfs) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('icons/effects/cameravis.dmi', t, "dim", TURF_LAYER) - - dim += t.dim - -var/datum/cameranet/cameranet = new() - -/datum/cameranet - var/list/cameras = list() - var/list/chunks = list() - var/network = "net1" - var/ready = 0 - -/datum/cameranet/New() - ..() - -/datum/cameranet/proc/chunkGenerated(x, y, z) - var/key = "[x],[y],[z]" - return key in chunks - -/datum/cameranet/proc/getCameraChunk(x, y, z) - var/key = "[x],[y],[z]" - - if(!(key in chunks)) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] - -/datum/cameranet/proc/visibility(mob/aiEye/ai) - var/x1 = max(0, ai.x - 16) & ~0xf - var/y1 = max(0, ai.y - 16) & ~0xf - var/x2 = min(world.maxx, ai.x + 16) & ~0xf - var/y2 = min(world.maxy, ai.y + 16) & ~0xf - - var/list/visibleChunks = list() - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - visibleChunks += getCameraChunk(x, y, ai.z) - - var/list/remove = ai.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - ai.visibleCameraChunks - - for(var/datum/camerachunk/c in remove) - c.remove(ai) - - for(var/datum/camerachunk/c in add) - c.add(ai) - -/datum/cameranet/proc/updateVisibility(turf/loc) - if(!chunkGenerated(loc.x & ~0xf, loc.y & ~0xf, loc.z)) - return - - var/datum/camerachunk/chunk = getCameraChunk(loc.x & ~0xf, loc.y & ~0xf, loc.z) - chunk.visibilityChanged(loc) - -/datum/cameranet/proc/addCamera(obj/machinery/camera/c) - var/x1 = max(0, c.x - 16) & ~0xf - var/y1 = max(0, c.y - 16) & ~0xf - var/x2 = min(world.maxx, c.x + 16) & ~0xf - var/y2 = min(world.maxy, c.y + 16) & ~0xf - - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - if(chunkGenerated(x, y, c.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z) - if(!(c in chunk.cameras)) - chunk.cameras += c - chunk.hasChanged() - - -/mob/living/silicon/ai/var/mob/aiEye/eyeobj = new() - -/mob/living/silicon/ai/New() - ..() - eyeobj.ai = src - -/mob/living/silicon/ai/verb/freelook() - set category = "AI Commands" - set name = "freelook" - current = null //cancel camera view first, it causes problems - cameraFollow = null - machine = null - if(client.eye == eyeobj) - client.eye = src - for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks) - c.remove(eyeobj) - else - client.eye = eyeobj - eyeobj.loc = loc - cameranet.visibility(eyeobj) - cameraFollow = null -/mob/aiEye/Move() - . = ..() - if(.) - cameranet.visibility(src) - -/client/AIMove(n, direct, var/mob/living/silicon/ai/user) - if(eye == user.eyeobj) - user.eyeobj.loc = get_step(user.eyeobj, direct) - cameranet.visibility(user.eyeobj) - - else - return ..() - -/* -/client/AIMoveZ(direct, var/mob/living/silicon/ai/user) - if(eye == user.eyeobj) - var/dif = 0 - if(direct == UP && user.eyeobj.z > 1) - dif = -1 - else if(direct == DOWN && user.eyeobj.z < 4) - dif = 1 - user.eyeobj.loc = locate(user.eyeobj.x, user.eyeobj.y, user.eyeobj.z + dif) - cameranet.visibility(user.eyeobj) - else - return ..() -*/ - -/turf/move_camera_by_click() - if(istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/AI = usr - if(AI.client.eye == AI.eyeobj) - return - return ..() - -/obj/machinery/door/update_nearby_tiles(need_rebuild) - . = ..(need_rebuild) - cameranet.updateVisibility(loc) - -/obj/machinery/camera/New() - ..() - cameranet.addCamera(src) \ No newline at end of file diff --git a/code/unused/Agouri_stuff.dm b/code/unused/Agouri_stuff.dm deleted file mode 100644 index e204fbd7d3..0000000000 --- a/code/unused/Agouri_stuff.dm +++ /dev/null @@ -1,1947 +0,0 @@ -/* -/obj/vehicle/airtight - //inner atmos - var/use_internal_tank = 0 - var/internal_tank_valve = ONE_ATMOSPHERE - var/obj/machinery/portable_atmospherics/canister/internal_tank - var/datum/gas_mixture/cabin_air - var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature - var/datum/global_iterator/pr_give_air //moves air from tank to cabin - - -/obj/vehicle/airtight/New() - ..() - src.add_airtank() - src.add_cabin() - src.add_airtight_iterators() - - - - -//######################################### Helpers for airtight vehicles ######################################### - -/obj/vehicle/airtight/proc/add_cabin() - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air - -/obj/vehicle/airtight/proc/add_airtank() - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank - -/obj/vehicle/airtight/proc/add_airtight_iterators() - pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) - pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src)) - - -//######################################### Specific datums for airtight vehicles ################################# - - -/datum/global_iterator/vehicle_preserve_temp //normalizing cabin air temperature to 20 degrees celsium - delay = 20 - - process(var/obj/vehicle/airtight/V) - if(V.cabin_air && V.cabin_air.return_volume() > 0) - var/delta = V.cabin_air.temperature - T20C - V.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) - return - - -/datum/global_iterator/vehicle_tank_give_air - delay = 15 - - process(var/obj/vehicle/airtight/V) - if(V.internal_tank) - var/datum/gas_mixture/tank_air = V.internal_tank.return_air() - var/datum/gas_mixture/cabin_air = V.cabin_air - - var/release_pressure = V.internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = V.get_turf_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - del(removed) - else - return stop() - return - - -//######################################### Atmospherics for vehicles ############################################# - - -/obj/vehicle/proc/get_turf_air() - var/turf/T = get_turf(src) - if(T) - . = T.return_air() - return - -/obj/vehicle/airtight/remove_air(amount) - if(use_internal_tank) - return cabin_air.remove(amount) - else - var/turf/T = get_turf(src) - if(T) - return T.remove_air(amount) - return - -/obj/vehicle/airtight/return_air() - if(use_internal_tank) - return cabin_air - return get_turf_air() - -/obj/vehicle/airtight/proc/return_pressure() - . = 0 - if(use_internal_tank) - . = cabin_air.return_pressure() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_pressure() - return - - -/obj/vehicle/airtight/proc/return_temperature() - . = 0 - if(use_internal_tank) - . = cabin_air.return_temperature() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_temperature() - return - -/obj/vehicle/airtight/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) - //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) - return 0 - - //Make sure are close enough for a valid connection - if(new_port.loc != src.loc) - return 0 - - //Perform the connection - connected_port = new_port - connected_port.connected_device = src - - //Actually enforce the air sharing - var/datum/pipe_network/network = connected_port.return_network(src) - if(network && !(internal_tank.return_air() in network.gases)) - network.gases += internal_tank.return_air() - network.update = 1 - log_message("Vehicle airtank connected to external port.") - return 1 - -/obj/vehicle/airtight/proc/disconnect() - if(!connected_port) - return 0 - - var/datum/pipe_network/network = connected_port.return_network(src) - if(network) - network.gases -= internal_tank.return_air() - - connected_port.connected_device = null - connected_port = null - src.log_message("Vehicle airtank disconnected from external port.") - return 1 - - - - -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// - - - -/obj/vehicle - name = "Vehicle" - icon = 'icons/vehicles/vehicles.dmi' - density = 1 - anchored = 1 - unacidable = 1 //To avoid the pilot-deleting shit that came with mechas - layer = MOB_LAYER - //var/can_move = 1 - var/mob/living/carbon/occupant = null - //var/step_in = 10 //make a step in step_in/10 sec. - //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. - //var/step_energy_drain = 10 - var/health = 300 //health is health - //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - //the values in this list show how much damage will pass through, not how much will be absorbed. - var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) - var/obj/item/weapon/cell/cell //Our power source - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 1 - //var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new - var/lights = 0 - var/lights_power = 6 - - //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri - //var/use_internal_tank = 0 - //var/internal_tank_valve = ONE_ATMOSPHERE - //var/obj/machinery/portable_atmospherics/canister/internal_tank - //var/datum/gas_mixture/cabin_air - //var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/obj/item/device/radio/radio = null - - var/max_temperature = 2500 - //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - - var/wreckage - - var/list/equipment = new - var/obj/selected - //var/max_equip = 3 - - var/datum/events/events - - - -/obj/vehicle/New() - ..() - events = new - icon_state += "-unmanned" - add_radio() - //add_cabin() //No cabin for non-airtights - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) - removeVerb(/atom/movable/verb/pull) - log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return - - -//################ Helpers ########################################################### - - -/obj/vehicle/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/vehicle/proc/addVerb(verb_path) - verbs += verb_path - -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - -/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ - -/obj/vehicle/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = 1 - -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - -/obj/vehicle/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) - return 1 - else - return 0 - -//################ Logs and messages ############################################ - - -/obj/vehicle/proc/log_message(message as text,red=null) - log.len++ - log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") - return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - del(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) - return - - -*/ - - - - - -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// - - - - -/*/turf/DblClick() - if(istype(usr, /mob/living/silicon/ai)) - return move_camera_by_click() - if(usr.stat || usr.restrained() || usr.lying) - return ..() - - if(usr.hand && istype(usr.l_hand, /obj/item/weapon/flamethrower)) - var/turflist = getline(usr,src) - var/obj/item/weapon/flamethrower/F = usr.l_hand - F.flame_turf(turflist) - else if(!usr.hand && istype(usr.r_hand, /obj/item/weapon/flamethrower)) - var/turflist = getline(usr,src) - var/obj/item/weapon/flamethrower/F = usr.r_hand - F.flame_turf(turflist) - - return ..() - -/turf/New() - ..() - for(var/atom/movable/AM as mob|obj in src) - spawn( 0 ) - src.Entered(AM) - return - return - -/turf/ex_act(severity) - return 0 - - -/turf/bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam/pulse)) - src.ex_act(2) - ..() - return 0 - -/turf/bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/bullet/gyro)) - explosion(src, -1, 0, 2) - ..() - return 0 - -/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) - if (!mover || !isturf(mover.loc)) - return 1 - - - //First, check objects to block exit that are not on the border - for(var/obj/obstacle in mover.loc) - if((obstacle.flags & ~ON_BORDER) && (mover != obstacle) && (forget != obstacle)) - if(!obstacle.CheckExit(mover, src)) - mover.Bump(obstacle, 1) - return 0 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in mover.loc) - if((border_obstacle.flags & ON_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) - if(!border_obstacle.CheckExit(mover, src)) - mover.Bump(border_obstacle, 1) - return 0 - - //Next, check objects to block entry that are on the border - for(var/obj/border_obstacle in src) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != border_obstacle)) - mover.Bump(border_obstacle, 1) - return 0 - - //Then, check the turf itself - if (!src.CanPass(mover, src)) - mover.Bump(src, 1) - return 0 - - //Finally, check objects/mobs to block entry that are not on the border - for(var/atom/movable/obstacle in src) - if(obstacle.flags & ~ON_BORDER) - if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle)) - mover.Bump(obstacle, 1) - return 0 - return 1 //Nothing found to block so return success! - - -/turf/Entered(atom/movable/M as mob|obj) - var/loopsanity = 100 - if(ismob(M)) - if(!M:lastarea) - M:lastarea = get_area(M.loc) - if(M:lastarea.has_gravity == 0) - inertial_drift(M) - - /* - if(M.flags & NOGRAV) - inertial_drift(M) - */ - - - - else if(!istype(src, /turf/space)) - M:inertia_dir = 0 - ..() - var/objects = 0 - for(var/atom/A as mob|obj|turf|area in src) - if(objects > loopsanity) break - objects++ - spawn( 0 ) - if ((A && M)) - A.HasEntered(M, 1) - return - objects = 0 - for(var/atom/A as mob|obj|turf|area in range(1)) - if(objects > loopsanity) break - objects++ - spawn( 0 ) - if ((A && M)) - A.HasProximity(M, 1) - return - return - -/turf/proc/inertial_drift(atom/movable/A as mob|obj) - if(!(A.last_move)) return - if((istype(A, /mob/) && src.x > 2 && src.x < (world.maxx - 1) && src.y > 2 && src.y < (world.maxy-1))) - var/mob/M = A - if(M.Process_Spacemove(1)) - M.inertia_dir = 0 - return - spawn(5) - if((M && !(M.anchored) && (M.loc == src))) - if(M.inertia_dir) - step(M, M.inertia_dir) - return - M.inertia_dir = M.last_move - step(M, M.inertia_dir) - return - -/turf/proc/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(src.intact) - -// override for space turfs, since they should never hide anything -/turf/space/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(0) - -// Removes all signs of lattice on the pos of the turf -Donkieyo -/turf/proc/RemoveLattice() - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - del L - -/turf/proc/ReplaceWithFloor(explode=0) - var/prior_icon = icon_old - var/old_dir = dir - - var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) ) - - W.RemoveLattice() - W.set_dir(old_dir) - if(prior_icon) W.icon_state = prior_icon - else W.icon_state = "floor" - - if (!explode) - W.opacity = 1 - W.sd_SetOpacity(0) - //This is probably gonna make lighting go a bit wonky in bombed areas, but sd_SetOpacity was the primary reason bombs have been so laggy. --NEO - W.levelupdate() - return W - -/turf/proc/ReplaceWithPlating() - var/prior_icon = icon_old - var/old_dir = dir - - var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) ) - - W.RemoveLattice() - W.set_dir(old_dir) - if(prior_icon) W.icon_state = prior_icon - else W.icon_state = "plating" - W.opacity = 1 - W.sd_SetOpacity(0) - W.levelupdate() - return W - -/turf/proc/ReplaceWithEngineFloor() - var/old_dir = dir - - var/turf/simulated/floor/engine/E = new /turf/simulated/floor/engine( locate(src.x, src.y, src.z) ) - - E.set_dir(old_dir) - E.icon_state = "engine" - -/turf/simulated/Entered(atom/A, atom/OL) - if (istype(A,/mob/living/carbon)) - var/mob/living/carbon/M = A - if(M.lying) return - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes)) - if(H.m_intent == "run") - if(H.footstep >= 2) - H.footstep = 0 - else - H.footstep++ - if(H.footstep == 0) - playsound(src, "clownstep", 50, 1) // this will get annoying very fast. - else - playsound(src, "clownstep", 20, 1) - - switch (src.wet) - if(1) - if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes - if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the wet floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) - else - M.inertia_dir = 0 - return - else if(!istype(M, /mob/living/carbon/slime)) - if (M.m_intent == "run") - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the wet floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) - else - M.inertia_dir = 0 - return - - if(2) //lube - if(!istype(M, /mob/living/carbon/slime)) - M.stop_pulling() - step(M, M.dir) - spawn(1) step(M, M.dir) - spawn(2) step(M, M.dir) - spawn(3) step(M, M.dir) - spawn(4) step(M, M.dir) - M.take_organ_damage(2) // Was 5 -- TLE - M << "\blue You slipped on the floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Weaken(10) - - ..() - -/turf/proc/ReplaceWithSpace() - var/old_dir = dir - var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) - S.set_dir(old_dir) - return S - -/turf/proc/ReplaceWithLattice() - var/old_dir = dir - var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) - S.set_dir(old_dir) - new /obj/structure/lattice( locate(src.x, src.y, src.z) ) - return S - -/turf/proc/ReplaceWithWall() - var/old_icon = icon_state - var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) ) - S.icon_old = old_icon - S.opacity = 0 - S.sd_NewOpacity(1) - return S - -/turf/proc/ReplaceWithRWall() - var/old_icon = icon_state - var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) ) - S.icon_old = old_icon - S.opacity = 0 - S.sd_NewOpacity(1) - return S - -/turf/simulated/wall/New() - ..() - -/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0) - if(istype(src,/turf/simulated/wall/r_wall)) - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/structure/girder/reinforced(src) - new /obj/item/stack/sheet/plasteel( src ) - else - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/plasteel( src ) - else if(istype(src,/turf/simulated/wall/cult)) - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/effect/decal/remains/human(src) - else - new /obj/effect/decal/remains/human(src) - - else - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/structure/girder(src) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - else - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - - ReplaceWithPlating(explode) - -/turf/simulated/wall/examine(mob/user) - user << "It looks like a regular wall." - return - -/turf/simulated/wall/ex_act(severity) - switch(severity) - if(1.0) - //SN src = null - src.ReplaceWithSpace() - del(src) - return - if(2.0) - if (prob(50)) - dismantle_wall(0,1) - else - dismantle_wall(1,1) - if(3.0) - var/proba - if (istype(src, /turf/simulated/wall/r_wall)) - proba = 15 - else - proba = 40 - if (prob(proba)) - dismantle_wall(0,1) - else - return - -/turf/simulated/wall/blob_act() - if(prob(50)) - dismantle_wall() - -/turf/simulated/wall/attack_paw(mob/user as mob) - if ((user.mutations & HULK)) - if (prob(40)) - usr << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - usr << text("\blue You punch the wall.") - return - - return src.attack_hand(user) - - -/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob) - if(M.wall_smash) - if (istype(src, /turf/simulated/wall/r_wall)) - M << text("\blue This wall is far too strong for you to destroy.") - return - else - if (prob(40)) - M << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - M << text("\blue You smash against the wall.") - return - - M << "\blue You push the wall but nothing happens!" - return - -/turf/simulated/wall/attack_hand(mob/user as mob) - if ((user.mutations & HULK)) - if (prob(40)) - usr << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - usr << text("\blue You punch the wall.") - return - - user << "\blue You push the wall but nothing happens!" - playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1) - src.add_fingerprint(user) - return - -/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - var/turf/T = get_turf(user) - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (W:remove_fuel(0,user)) - W:welding = 2 - user << "\blue Now disassembling the outer wall plating." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(100) - if (W && istype(src, /turf/simulated/wall)) - if ((get_turf(user) == T && user.equipped() == W)) - user << "\blue You disassembled the outer wall plating." - dismantle_wall() - W:welding = 1 - else - user << "\blue You need more welding fuel to complete this task." - return - - else if (istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - else - user << "\blue Now disassembling the outer wall plating." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(60) - if (W && istype(src, /turf/simulated/wall)) - if ((get_turf(user) == T && user.equipped() == W)) - user << "\blue You disassembled the outer wall plating." - dismantle_wall() - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced apart."), 2) - return - - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - var/turf/T = user.loc - user << "\blue Now drilling through wall." - sleep(60) - if (W && istype(src, /turf/simulated/wall)) - if ((user.loc == T && user.equipped() == W)) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was drilled apart by []!", user), 1, text("\red You hear metal being drilled appart."), 2) - return - - else if(istype(W, /obj/item/weapon/melee/energy/blade)) - var/turf/T = user.loc - user << "\blue Now slicing through wall." - W:spark_system.start() - playsound(src.loc, "sparks", 50, 1) - sleep(70) - if (W && istype(src, /turf/simulated/wall)) - if ((user.loc == T && user.equipped() == W)) - W:spark_system.start() - playsound(src.loc, "sparks", 50, 1) - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) - return - - else if(istype(W,/obj/item/apc_frame)) - var/obj/item/apc_frame/AH = W - AH.try_build(src) - else if(istype(W,/obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = W - if(P.resulting_poster) - var/check = 0 - var/stuff_on_wall = 0 - for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/effect/decal/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall==3) - check = 1 - break - - if(check) - user << "The wall is far too cluttered to place a poster!" - return - - user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. - - P.resulting_poster.loc = src - var/temp = P.resulting_poster.icon_state - var/temp_loc = user.loc - P.resulting_poster.icon_state = "poster_being_set" - playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(24) - - if(user.loc == temp_loc)//Let's check if he still is there - user << "You place the poster!" - P.resulting_poster.icon_state = temp - src.contents += P.resulting_poster - del(P) - else - user << "You stop placing the poster." - P.resulting_poster.loc = P - P.resulting_poster.icon_state = temp - else - return attack_hand(user) - return - - -/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - - if(!istype(src, /turf/simulated/wall/r_wall)) - return // this may seem stupid and redundant but apparently floors can call this attackby() proc, it was spamming shit up. -- Doohl - - - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - W:eyecheck(user) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (src.d_state == 2) - W:welding = 2 - user << "\blue Slicing metal cover." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(60) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 3 - user << "\blue You removed the metal cover." - W:welding = 1 - - else if (src.d_state == 5) - W:welding = 2 - user << "\blue Removing support rods." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 6 - new /obj/item/stack/rods( src ) - user << "\blue You removed the support rods." - W:welding = 1 - - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (src.d_state == 2) - user << "\blue Slicing metal cover." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 3 - user << "\blue You removed the metal cover." - - else if (src.d_state == 5) - user << "\blue Removing support rods." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(70) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 6 - new /obj/item/stack/rods( src ) - user << "\blue You removed the support rods." - - else if(istype(W, /obj/item/weapon/melee/energy/blade)) - user << "\blue This wall is too thick to slice through. You will need to find a different path." - return - - else if (istype(W, /obj/item/weapon/wrench)) - if (src.d_state == 4) - var/turf/T = user.loc - user << "\blue Detaching support rods." - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 5 - user << "\blue You detach the support rods." - - else if (istype(W, /obj/item/weapon/wirecutters)) - if (src.d_state == 0) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - src.d_state = 1 - new /obj/item/stack/rods( src ) - - else if (istype(W, /obj/item/weapon/screwdriver)) - if (src.d_state == 1) - var/turf/T = user.loc - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Removing support lines." - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 2 - user << "\blue You removed the support lines." - - else if (istype(W, /obj/item/weapon/crowbar)) - - if (src.d_state == 3) - var/turf/T = user.loc - user << "\blue Prying cover off." - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 4 - user << "\blue You removed the cover." - - else if (src.d_state == 6) - var/turf/T = user.loc - user << "\blue Prying outer sheath off." - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - sleep(100) - if(src) - if ((user.loc == T && user.equipped() == W)) - user << "\blue You removed the outer sheath." - dismantle_wall() - return - - else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - var/turf/T = user.loc - user << "\blue You begin to drill though, this will take some time." - sleep(200) - if(src) - if ((user.loc == T && user.equipped() == W)) - user << "\blue Your drill tears though the reinforced plating." - dismantle_wall() - return - - else if ((istype(W, /obj/item/stack/sheet/metal)) && (src.d_state)) - var/turf/T = user.loc - user << "\blue Repairing wall." - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 0 - src.icon_state = initial(src.icon_state) - user << "\blue You repaired the wall." - if (W:amount > 1) - W:amount-- - else - del(W) - - else if(istype(W,/obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = W - if(P.resulting_poster) - var/check = 0 - var/stuff_on_wall = 0 - for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/effect/decal/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall==3) - check = 1 - break - - if(check) - user << "The wall is far too cluttered to place a poster!" - return - - user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. - - P.resulting_poster.loc = src - var/temp = P.resulting_poster.icon_state - var/temp_loc = user.loc - P.resulting_poster.icon_state = "poster_being_set" - playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(24) - - if(user.loc == temp_loc)//Let's check if he still is there - user << "You place the poster!" - P.resulting_poster.icon_state = temp - src.contents += P.resulting_poster - del(P) - else - user << "You stop placing the poster." - P.resulting_poster.loc = P - P.resulting_poster.icon_state = temp - return - - if(istype(W,/obj/item/apc_frame)) - var/obj/item/apc_frame/AH = W - AH.try_build(src) - return - - if(src.d_state > 0) - src.icon_state = "r_wall-[d_state]" - - else - return attack_hand(user) - return - -/turf/simulated/wall/meteorhit(obj/M as obj) - if (prob(15)) - dismantle_wall() - else if(prob(70)) - ReplaceWithPlating() - else - ReplaceWithLattice() - return 0 - - -//This is so damaged or burnt tiles or platings don't get remembered as the default tile -var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","damaged4", - "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", - "platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2", - "light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken", - "light_on_broken","light_off","wall_thermite","grass1","grass2","grass3","grass4", - "asteroid","asteroid_dug", - "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", - "asteroid5","asteroid6","asteroid7","asteroid8", - "burning","oldburning","light-on-r","light-on-y","light-on-g","light-on-b") - -var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3","asteroid","asteroid_dug") - -/turf/simulated/floor - - //Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not. - //Use the is_plating(), is_plasteel_floor() and is_light_floor() procs instead. --Errorage - name = "floor" - icon = 'icons/turf/floors.dmi' - icon_state = "floor" - var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default - var/icon_plating = "plating" - thermal_conductivity = 0.040 - heat_capacity = 10000 - var/broken = 0 - var/burnt = 0 - var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/plasteel - - airless - icon_state = "floor" - name = "airless floor" - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - - New() - ..() - name = "floor" - - light - name = "Light floor" - luminosity = 5 - icon_state = "light_on" - floor_tile = new/obj/item/stack/tile/light - - New() - floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. - var/n = name //just in case commands rename it in the ..() call - ..() - spawn(4) - update_icon() - name = n - - grass - name = "Grass patch" - icon_state = "grass1" - floor_tile = new/obj/item/stack/tile/grass - - New() - floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. - icon_state = "grass[pick("1","2","3","4")]" - ..() - spawn(4) - update_icon() - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - -/turf/simulated/floor/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/wall/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/floor/engine - name = "reinforced floor" - icon_state = "engine" - thermal_conductivity = 0.025 - heat_capacity = 325000 - -/turf/simulated/floor/engine/cult - name = "engraved floor" - icon_state = "cult" - - -/turf/simulated/floor/engine/n20 - New() - ..() - var/datum/gas_mixture/adding = new - var/datum/gas/sleeping_agent/trace_gas = new - - trace_gas.moles = 2000 - adding.trace_gases += trace_gas - adding.temperature = T20C - - assume_air(adding) - -/turf/simulated/floor/engine/vacuum - name = "vacuum floor" - icon_state = "engine" - oxygen = 0 - nitrogen = 0.001 - temperature = TCMB - -/turf/simulated/floor/plating - name = "plating" - icon_state = "plating" - floor_tile = null - intact = 0 - -/turf/simulated/floor/plating/airless - icon_state = "plating" - name = "airless plating" - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - - New() - ..() - name = "plating" - -/turf/simulated/floor/grid - icon = 'icons/turf/floors.dmi' - icon_state = "circuit" - -/turf/simulated/floor/New() - ..() - if(icon_state in icons_to_ignore_at_floor_init) //so damaged/burned tiles or plating icons aren't saved as the default - icon_regular_floor = "floor" - else - icon_regular_floor = icon_state - -//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) -// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt))) -// if (!( locate(/obj/machinery/mass_driver, src) )) -// return 0 -// return ..() - -/turf/simulated/floor/ex_act(severity) - //set src in oview(1) - switch(severity) - if(1.0) - src.ReplaceWithSpace() - if(2.0) - switch(pick(1,2;75,3)) - if (1) - src.ReplaceWithLattice() - if(prob(33)) new /obj/item/stack/sheet/metal(src) - if(2) - src.ReplaceWithSpace() - if(3) - if(prob(80)) - src.break_tile_to_plating() - else - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - if(prob(33)) new /obj/item/stack/sheet/metal(src) - if(3.0) - if (prob(50)) - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - return - -/turf/simulated/floor/blob_act() - return - -turf/simulated/floor/proc/update_icon() - if(is_plasteel_floor()) - if(!broken && !burnt) - icon_state = icon_regular_floor - if(is_plating()) - if(!broken && !burnt) - icon_state = icon_plating //Because asteroids are 'platings' too. - if(is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - if(T.on) - switch(T.state) - if(0) - icon_state = "light_on" - sd_SetLuminosity(5) - if(1) - var/num = pick("1","2","3","4") - icon_state = "light_on_flicker[num]" - sd_SetLuminosity(5) - if(2) - icon_state = "light_on_broken" - sd_SetLuminosity(5) - if(3) - icon_state = "light_off" - sd_SetLuminosity(0) - else - sd_SetLuminosity(0) - icon_state = "light_off" - if(is_grass_floor()) - if(!broken && !burnt) - if(!(icon_state in list("grass1","grass2","grass3","grass4"))) - icon_state = "grass[pick("1","2","3","4")]" - spawn(1) - if(istype(src,/turf/simulated/floor)) //Was throwing runtime errors due to a chance of it changing to space halfway through. - if(air) - update_visuals(air) - -turf/simulated/floor/return_siding_icon_state() - ..() - if(is_grass_floor()) - var/dir_sum = 0 - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(!(T.is_grass_floor())) - dir_sum += direction - if(dir_sum) - return "wood_siding[dir_sum]" - else - return 0 - - -/turf/simulated/floor/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/turf/simulated/floor/attack_hand(mob/user as mob) - if (is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - T.on = !T.on - update_icon() - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/mob/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -/turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob) - if(!C) - return - if(!user) - return - if(istype(C, /obj/item/weapon/wrench)) - user << "\blue Removing rods..." - playsound(src.loc, 'sound/items/Ratchet.ogg', 80, 1) - if(do_after(user, 30)) - new /obj/item/stack/rods(src, 2) - ReplaceWithFloor() - var/turf/simulated/floor/F = src - F.make_plating() - return - -/turf/simulated/floor/proc/gets_drilled() - return - -/turf/simulated/floor/proc/break_tile_to_plating() - if(!is_plating()) - make_plating() - break_tile() - -/turf/simulated/floor/is_plasteel_floor() - if(istype(floor_tile,/obj/item/stack/tile/plasteel)) - return 1 - else - return 0 - -/turf/simulated/floor/is_light_floor() - if(istype(floor_tile,/obj/item/stack/tile/light)) - return 1 - else - return 0 - -/turf/simulated/floor/is_grass_floor() - if(istype(floor_tile,/obj/item/stack/tile/grass)) - return 1 - else - return 0 - -/turf/simulated/floor/is_plating() - if(!floor_tile) - return 1 - return 0 - -/turf/simulated/floor/proc/break_tile() - if(istype(src,/turf/simulated/floor/engine)) return - if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor)) - src.ReplaceWithPlating() - if(broken) return - if(is_plasteel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - broken = 1 - else if(is_plasteel_floor()) - src.icon_state = "light_broken" - broken = 1 - else if(is_plating()) - src.icon_state = "platingdmg[pick(1,2,3)]" - broken = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - broken = 1 - -/turf/simulated/floor/proc/burn_tile() - if(istype(src,/turf/simulated/floor/engine)) return - if(broken || burnt) return - if(is_plasteel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - burnt = 1 - else if(is_plasteel_floor()) - src.icon_state = "floorscorched[pick(1,2)]" - burnt = 1 - else if(is_plating()) - src.icon_state = "panelscorched" - burnt = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - burnt = 1 - -//This proc will delete the floor_tile and the update_iocn() proc will then change the icon_state of the turf -//This proc auto corrects the grass tiles' siding. -/turf/simulated/floor/proc/make_plating() - if(istype(src,/turf/simulated/floor/engine)) return - - if(is_grass_floor()) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - - if(!floor_tile) return - del(floor_tile) - icon_plating = "plating" - sd_SetLuminosity(0) - floor_tile = null - intact = 0 - broken = 0 - burnt = 0 - - update_icon() - levelupdate() - -//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/plasteel/T = null) - broken = 0 - burnt = 0 - intact = 1 - sd_SetLuminosity(0) - if(T) - if(istype(T,/obj/item/stack/tile/plasteel)) - floor_tile = T - if (icon_regular_floor) - icon_state = icon_regular_floor - else - icon_state = "floor" - icon_regular_floor = icon_state - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/plasteel - icon_state = "floor" - icon_regular_floor = icon_state - - update_icon() - levelupdate() - -//This proc will make the turf a light floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_light_floor(var/obj/item/stack/tile/light/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/light)) - floor_tile = T - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/light - - update_icon() - levelupdate() - -//This proc will make a turf into a grass patch. Fun eh? Insert the grass tile to be used as the argument -//If no argument is given a new one will be made. -/turf/simulated/floor/proc/make_grass_floor(var/obj/item/stack/tile/grass/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/grass)) - floor_tile = T - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/grass - - update_icon() - levelupdate() - -/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) - - if(!C || !user) - return 0 - - if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles - if(is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - if(T.state) - user.u_equip(C) - del(C) - T.state = C //fixing it by bashing it with a light bulb, fun eh? - update_icon() - user << "\blue You replace the light bulb." - else - user << "\blue The lightbulb seems fine, no need to replace it." - - if(istype(C, /obj/item/weapon/crowbar) && (!(is_plating()))) - if(broken || burnt) - user << "\red You remove the broken plating." - else - user << "\red You remove the [floor_tile.name]." - new floor_tile.type(src) - - make_plating() - playsound(src.loc, 'sound/items/Crowbar.ogg', 80, 1) - - return - - if(istype(C, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = C - if (is_plating()) - if (R.amount >= 2) - user << "\blue Reinforcing the floor..." - if(do_after(user, 30) && R && R.amount >= 2 && is_plating()) - ReplaceWithEngineFloor() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 80, 1) - R.use(2) - return - else - user << "\red You need more rods." - else - user << "\red You must remove the plating first." - return - - if(istype(C, /obj/item/stack/tile)) - if(is_plating()) - if(!broken && !burnt) - var/obj/item/stack/tile/T = C - floor_tile = new T.type - intact = 1 - if(istype(T,/obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/L = T - var/obj/item/stack/tile/light/F = floor_tile - F.state = L.state - F.on = L.on - if(istype(T,/obj/item/stack/tile/grass)) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding gets updated properly - T.use(1) - update_icon() - levelupdate() - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - else - user << "\blue This section is too damaged to support a tile. Use a welder to fix the damage." - - - if(istype(C, /obj/item/stack/cable_coil)) - if(is_plating()) - var/obj/item/stack/cable_coil/coil = C - coil.turf_place(src, user) - else - user << "\red You must remove the plating first." - - if(istype(C, /obj/item/weapon/shovel)) - if(is_grass_floor()) - new /obj/item/weapon/ore/glass(src) - new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass - user << "\blue You shovel the grass." - make_plating() - else - user << "\red You cannot shovel this." - - if(istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/welder = C - if(welder.welding && (is_plating())) - if(broken || burnt) - if(welder.remove_fuel(0,user)) - user << "\red You fix some dents on the broken plating." - playsound(src.loc, 'sound/items/Welder.ogg', 80, 1) - icon_state = "plating" - burnt = 0 - broken = 0 - else - user << "\blue You need more welding fuel to complete this task." - -/turf/unsimulated/floor/attack_paw(user as mob) - return src.attack_hand(user) - -/turf/unsimulated/floor/attack_hand(var/mob/user as mob) - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/mob/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -// imported from space.dm - -/turf/space/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/turf/space/attack_hand(mob/user as mob) - if ((user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -/turf/space/attackby(obj/item/C as obj, mob/user as mob) - - if (istype(C, /obj/item/stack/rods)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return - var/obj/item/stack/rods/R = C - user << "\blue Constructing support lattice ..." - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - ReplaceWithLattice() - R.use(1) - return - - if (istype(C, /obj/item/stack/tile/plasteel)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - var/obj/item/stack/tile/plasteel/S = C - del(L) - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - S.build(src) - S.use(1) - return - else - user << "\red The plating is going to need some support." - return - - -// Ported from unstable r355 - -/turf/space/Entered(atom/movable/A as mob|obj) - ..() - if ((!(A) || src != A.loc || istype(null, /obj/effect/beam))) return - - inertial_drift(A) - - if(ticker && ticker.mode) - - // Okay, so let's make it so that people can travel z levels but not nuke disks! - // if(ticker.mode.name == "nuclear emergency") return - - if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") - Sandbox_Spacemove(A) - - else - if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1)) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - - if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. - return - - if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear))) - if(istype(A, /mob/living)) - var/mob/living/MM = A - if(MM.client) - MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." - return - - - - var/move_to_z_str = pickweight(accessable_z_levels) - - var/move_to_z = text2num(move_to_z_str) - - if(!move_to_z) - return - - - - A.z = move_to_z - - - if(src.x <= 2) - A.x = world.maxx - 2 - - else if (A.x >= (world.maxx - 1)) - A.x = 3 - - else if (src.y <= 2) - A.y = world.maxy - 2 - - else if (A.y >= (world.maxy - 1)) - A.y = 3 - - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - -// if(istype(A, /obj/structure/closet/coffin)) -// coffinhandler.Add(A) - -/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) - var/cur_x - var/cur_y - var/next_x - var/next_y - var/target_z - var/list/y_arr - - if(src.x <= 1) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - next_x = (--cur_x||global_map.len) - y_arr = global_map[next_x] - target_z = y_arr[cur_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" - //debug -*/ - if(target_z) - A.z = target_z - A.x = world.maxx - 2 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - else if (src.x >= world.maxx) - if(istype(A, /obj/effect/meteor)) - del(A) - return - - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - next_x = (++cur_x > global_map.len ? 1 : cur_x) - y_arr = global_map[next_x] - target_z = y_arr[cur_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" - //debug -*/ - if(target_z) - A.z = target_z - A.x = 3 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - else if (src.y <= 1) - if(istype(A, /obj/effect/meteor)) - del(A) - return - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - y_arr = global_map[cur_x] - next_y = (--cur_y||y_arr.len) - target_z = y_arr[next_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" - //debug -*/ - if(target_z) - A.z = target_z - A.y = world.maxy - 2 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - - else if (src.y >= world.maxy) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - y_arr = global_map[cur_x] - next_y = (++cur_y > y_arr.len ? 1 : cur_y) - target_z = y_arr[next_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" - //debug -*/ - if(target_z) - A.z = target_z - A.y = 3 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - return - -/obj/effect/vaultspawner - var/maxX = 6 - var/maxY = 6 - var/minX = 2 - var/minY = 2 - -/obj/effect/vaultspawner/New(turf/location as turf,lX = minX,uX = maxX,lY = minY,uY = maxY,var/type = null) - if(!type) - type = pick("sandstone","rock","alien") - - var/lowBoundX = location.x - var/lowBoundY = location.y - - var/hiBoundX = location.x + rand(lX,uX) - var/hiBoundY = location.y + rand(lY,uY) - - var/z = location.z - - for(var/i = lowBoundX,i<=hiBoundX,i++) - for(var/j = lowBoundY,j<=hiBoundY,j++) - if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) - new /turf/simulated/wall/vault(locate(i,j,z),type) - else - new /turf/simulated/floor/vault(locate(i,j,z),type) - - del(src) - -/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N -//Useful to batch-add creatures to the list. - for(var/mob/living/M in src) - if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone. - spawn(0) - M.gib() - for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged. - spawn(0) - M.take_damage(100, "brute") - for(var/obj/effect/critter/M in src) - spawn(0) - M.Die() - -/turf/proc/Bless() - if(flags & NOJAUNT) - return - flags |= NOJAUNT - overlays += image('icons/effects/water.dmi',src,"holywater")*/ \ No newline at end of file diff --git a/code/unused/BrokenInhands.dm b/code/unused/BrokenInhands.dm deleted file mode 100644 index 6339d3c011..0000000000 --- a/code/unused/BrokenInhands.dm +++ /dev/null @@ -1,36 +0,0 @@ -/proc/getbrokeninhands() - var/icon/IL = new('icons/mob/items_lefthand.dmi') - var/list/Lstates = IL.IconStates() - var/icon/IR = new('icons/mob/items_righthand.dmi') - var/list/Rstates = IR.IconStates() - - - var/text - for(var/A in typesof(/obj/item)) - var/obj/item/O = new A( locate(1,1,1) ) - if(!O) continue - var/icon/J = new(O.icon) - var/list/istates = J.IconStates() - if(!Lstates.Find(O.icon_state) && !Lstates.Find(O.item_state)) - if(O.icon_state) - text += "[O.type] WANTS IN LEFT HAND CALLED\n\"[O.icon_state]\".\n" - if(!Rstates.Find(O.icon_state) && !Rstates.Find(O.item_state)) - if(O.icon_state) - text += "[O.type] WANTS IN RIGHT HAND CALLED\n\"[O.icon_state]\".\n" - - - if(O.icon_state) - if(!istates.Find(O.icon_state)) - text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.icon_state]\" IN \"[O.icon]\"\n" - if(O.item_state) - if(!istates.Find(O.item_state)) - text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.item_state]\" IN \"[O.icon]\"\n" - text+="\n" - del(O) - if(text) - var/F = file("broken_icons.txt") - fdel(F) - F << text - world << "Completely successfully and written to [F]" - - diff --git a/code/unused/Ultralight.dm b/code/unused/Ultralight.dm deleted file mode 100644 index 783726de91..0000000000 --- a/code/unused/Ultralight.dm +++ /dev/null @@ -1,341 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -//UltraLight system, by Sukasa - - const/ar/UL_LUMINOSITY = 0 - const/ar/UL_SQUARELIGHT = 0 - - const/ar/UL_RGB = 1 - const/ar/UL_ROUNDLIGHT = 2 - - const/ar/UL_I_FALLOFF_SQUARE = 0 - const/ar/UL_I_FALLOFF_ROUND = 1 - - const/ar/UL_I_LUMINOSITY = 0 - const/ar/UL_I_RGB = 1 - - const/ar/UL_I_LIT = 0 - const/ar/UL_I_EXTINGUISHED = 1 - const/ar/UL_I_ONZERO = 2 - - ul_LightingEnabled = 1 - ul_LightingResolution = 1 - ul_Steps = 7 - ul_LightingModel = UL_I_RGB - ul_FalloffStyle = UL_I_FALLOFF_ROUND - ul_TopLuminosity = 0 - ul_Layer = 10 - ul_SuppressLightLevelChanges = 0 - - list/ul_FastRoot = list(0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7) - - -proc - ul_Clamp(var/Value) - return min(max(Value, 0), ul_Steps) - -atom - var/LuminosityRed = 0 - var/LuminosityGreen = 0 - var/LuminosityBlue = 0 - - var/ul_Extinguished = UL_I_ONZERO - - proc - sd_SetLuminosity(var/Red, var/Green = Red, var/Blue = Red) - - if(LuminosityRed == Red && LuminosityGreen == Green && LuminosityBlue == Blue) - return //No point doing all that work if it won't have any effect anyways... - - if (ul_Extinguished == UL_I_EXTINGUISHED) - LuminosityRed = Red - LuminosityGreen = Green - LuminosityBlue = Blue - - return - - if (ul_IsLuminous()) - ul_Extinguish() - - LuminosityRed = Red - LuminosityGreen = Green - LuminosityBlue = Blue - - ul_Extinguished = UL_I_ONZERO - - if (ul_IsLuminous()) - ul_Illuminate() - - return - - ul_Illuminate() - if (ul_Extinguished == UL_I_LIT) - return - - ul_Extinguished = UL_I_LIT - - ul_UpdateTopLuminosity() - luminosity = ul_Luminosity() - - for(var/turf/Affected in view(ul_Luminosity(), src)) - var/Falloff = src.ul_FalloffAmount(Affected) - - var/DeltaRed = LuminosityRed - Falloff - var/DeltaGreen = LuminosityGreen - Falloff - var/DeltaBlue = LuminosityBlue - Falloff - - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) - - Affected.LightLevelRed += max(DeltaRed, 0) - Affected.LightLevelGreen += max(DeltaGreen, 0) - Affected.LightLevelBlue += max(DeltaBlue, 0) - - Affected.MaxRed += LuminosityRed - Affected.MaxGreen += LuminosityGreen - Affected.MaxBlue += LuminosityBlue - - Affected.ul_UpdateLight() - - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - return - - ul_Extinguish() - - if (ul_Extinguished != UL_I_LIT) - return - - ul_Extinguished = UL_I_EXTINGUISHED - - for(var/turf/Affected in view(ul_Luminosity(), src)) - - var/Falloff = ul_FalloffAmount(Affected) - - var/DeltaRed = LuminosityRed - Falloff - var/DeltaGreen = LuminosityGreen - Falloff - var/DeltaBlue = LuminosityBlue - Falloff - - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) - - Affected.LightLevelRed -= max(DeltaRed, 0) - Affected.LightLevelGreen -= max(DeltaGreen, 0) - Affected.LightLevelBlue -= max(DeltaBlue, 0) - - Affected.MaxRed -= LuminosityRed - Affected.MaxGreen -= LuminosityGreen - Affected.MaxBlue -= LuminosityBlue - - Affected.ul_UpdateLight() - - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - - luminosity = 0 - - return - - ul_FalloffAmount(var/atom/ref) - if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) - var/x = (ref.x - src.x) - var/y = (ref.y - src.y) - if ((x*x + y*y) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= x*x+y*y, i++) - ul_FastRoot += round(sqrt(x*x+y*y)) - return round(ul_LightingResolution * ul_FastRoot[x*x + y*y + 1], 1) - - else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) - return get_dist(src, ref) - - return 0 - - ul_SetOpacity(var/NewOpacity) - if(opacity != NewOpacity) - - var/list/Blanked = ul_BlankLocal() - var/atom/T = src - while(T && !isturf(T)) - T = T.loc - - opacity = NewOpacity - - if(T) - T:LightLevelRed = 0 - T:LightLevelGreen = 0 - T:LightLevelBlue = 0 - - ul_UnblankLocal(Blanked) - - return - - ul_UnblankLocal(var/list/ReApply = view(ul_TopLuminosity, src)) - for(var/atom/Light in ReApply) - if(Light.ul_IsLuminous()) - Light.ul_Illuminate() - - return - - ul_BlankLocal() - var/list/Blanked = list( ) - var/TurfAdjust = isturf(src) ? 1 : 0 - - for(var/atom/Affected in view(ul_TopLuminosity, src)) - if(Affected.ul_IsLuminous() && Affected.ul_Extinguished == UL_I_LIT && (ul_FalloffAmount(Affected) <= Affected.luminosity + TurfAdjust)) - Affected.ul_Extinguish() - Blanked += Affected - - return Blanked - - ul_UpdateTopLuminosity() - - if (ul_TopLuminosity < LuminosityRed) - ul_TopLuminosity = LuminosityRed - - if (ul_TopLuminosity < LuminosityGreen) - ul_TopLuminosity = LuminosityGreen - - if (ul_TopLuminosity < LuminosityBlue) - ul_TopLuminosity = LuminosityBlue - - return - - ul_Luminosity() - return max(LuminosityRed, LuminosityGreen, LuminosityBlue) - - ul_IsLuminous(var/Red = LuminosityRed, var/Green = LuminosityGreen, var/Blue = LuminosityBlue) - return (Red > 0 || Green > 0 || Blue > 0) - - ul_LightLevelChanged() - //Designed for client projects to use. Called on items when the turf they are in has its light level changed - return - - New() - ..() - if(ul_IsLuminous()) - spawn(1) - ul_Illuminate() - return - - Del() - if(ul_IsLuminous()) - ul_Extinguish() - - ..() - - return - - movable - Move() - ul_Extinguish() - ..() - ul_Illuminate() - return - -turf - var/LightLevelRed = 0 - var/LightLevelGreen = 0 - var/LightLevelBlue = 0 - - var/list/MaxRed = list( ) - var/list/MaxGreen = list( ) - var/list/MaxBlue = list( ) - - proc - - ul_GetRed() - return ul_Clamp(min(LightLevelRed, max(MaxRed))) - ul_GetGreen() - return ul_Clamp(min(LightLevelGreen, max(MaxGreen))) - ul_GetBlue() - return ul_Clamp(min(LightLevelBlue, max(MaxBlue))) - - ul_UpdateLight() - - var/area/CurrentArea = loc - - if(!isarea(CurrentArea) || !CurrentArea.ul_Lighting) - return - - var/LightingTag = copytext(CurrentArea.tag, 1, findtext(CurrentArea.tag, ":UL")) + ":UL[ul_GetRed()]_[ul_GetGreen()]_[ul_GetBlue()]" - - if(CurrentArea.tag != LightingTag) - var/area/NewArea = locate(LightingTag) - - if(!NewArea) - NewArea = new CurrentArea.type() - NewArea.tag = LightingTag - - for(var/V in CurrentArea.vars - "contents") - if(issaved(CurrentArea.vars[V])) - NewArea.vars[V] = CurrentArea.vars[V] - - NewArea.tag = LightingTag - - NewArea.ul_Light(ul_GetRed(), ul_GetGreen(), ul_GetBlue()) - - - NewArea.contents += src - - return - - ul_Recalculate() - - ul_SuppressLightLevelChanges++ - - var/list/Lights = ul_BlankLocal() - - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - - ul_UnblankLocal(Lights) - - ul_SuppressLightLevelChanges-- - - return - -area - var/ul_Overlay = null - var/ul_Lighting = 1 - - var/LightLevelRed = 0 - var/LightLevelGreen = 0 - var/LightLevelBlue = 0 - - proc - ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blue = LightLevelBlue) - - if(!src || !src.ul_Lighting) - return - - overlays -= ul_Overlay - - LightLevelRed = Red - LightLevelGreen = Green - LightLevelBlue = Blue - - luminosity = ul_IsLuminous(LightLevelRed, LightLevelGreen, LightLevelBlue) - - ul_Overlay = image('icons/effects/ULIcons.dmi', , num2text(LightLevelRed) + "-" + num2text(LightLevelGreen) + "-" + num2text(LightLevelBlue), ul_Layer) - - overlays += ul_Overlay - - return - - ul_Prep() - - if(!tag) - tag = "[type]" - if(ul_Lighting) - if(!findtext(tag,":UL")) - ul_Light() - //world.log << tag - - return diff --git a/code/unused/Virus2Prob.dm b/code/unused/Virus2Prob.dm deleted file mode 100644 index bf9868041d..0000000000 --- a/code/unused/Virus2Prob.dm +++ /dev/null @@ -1,12 +0,0 @@ -var/list/prob_G_list = list() - -/proc/probG(var/define,var/everyother) - if(prob_G_list["[define]"]) - prob_G_list["[define]"] += 1 - if(prob_G_list["[define]"] == everyother) - prob_G_list["[define]"] = 0 - return 1 - else - (prob_G_list["[define]"]) = 0 - (prob_G_list["[define]"]) = rand(1,everyother-1) - return 0 diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm deleted file mode 100644 index fb4a994f28..0000000000 --- a/code/unused/_debug.dm +++ /dev/null @@ -1,619 +0,0 @@ -// NOTE WELL! -// Only include this file when debugging locally -// Do not include in release versions - - -#define VARSICON 1 -#define SDEBUG 1 - -/client/verb/Debug() - set category = "Debug" - set name = "Debug-Debug" - if(src.holder.rank == "Game Admin") - Debug = !Debug - - world << "Debugging [Debug ? "On" : "Off"]" - else - alert("Coders only baby") - return - -/turf/verb/Flow() - set category = "Debug" - //set hidden = 1 - if(Debug) - for(var/turf/T in range(5)) - - var/obj/effect/mark/O = locate(/obj/effect/mark/, T) - - if(!O) - O = new /obj/effect/mark(T) - else - O.overlays.Cut() - - var/obj/move/OM = locate(/obj/move/, T) - - if(OM) - - if(! OM.updatecell) - O.icon_state = "x2" - else - O.icon_state = "blank" -/* -Doing this because FindTurfs() isn't even used - for(var/atom/U in OM.FindTurfs() ) - var/dirn = get_dir(OM, U) - if(dirn == 1) - O.overlays += image('icons/misc/mark.dmi', OM.airdir==1?"up":"fup") - else if(dirn == 2) - O.overlays += image('icons/misc/mark.dmi', OM.airdir==2?"dn":"fdn") - else if(dirn == 4) - O.overlays += image('icons/misc/mark.dmi', OM.airdir==4?"rt":"frt") - else if(dirn == 8) - O.overlays += image('icons/misc/mark.dmi', OM.airdir==8?"lf":"flf") -*/ - else - - if(!(T.updatecell)) - O.icon_state = "x2" - else - O.icon_state = "blank" - - if(T.airN) - O.overlays += image('icons/misc/mark.dmi', T.airdir==1?"up":"fup") - - if(T.airS) - O.overlays += image('icons/misc/mark.dmi', T.airdir==2?"dn":"fdn") - - if(T.airW) - O.overlays += image('icons/misc/mark.dmi', T.airdir==8?"lf":"flf") - - if(T.airE) - O.overlays += image('icons/misc/mark.dmi', T.airdir==4?"rt":"frt") - - - if(T.condN) - O.overlays += image('icons/misc/mark.dmi', T.condN == 1?"yup":"rup") - - if(T.condS) - O.overlays += image('icons/misc/mark.dmi', T.condS == 1?"ydn":"rdn") - - if(T.condE) - O.overlays += image('icons/misc/mark.dmi', T.condE == 1?"yrt":"rrt") - - if(T.condW) - O.overlays += image('icons/misc/mark.dmi', T.condW == 1?"ylf":"rlf") - else - alert("Debugging off") - return - -/turf/verb/Clear() - set category = "Debug" - //set hidden = 1 - if(Debug) - for(var/obj/effect/mark/O in world) - del(O) - else - alert("Debugging off") - return - -/proc/numbericon(var/tn as text,var/s = 0) - if(Debug) - var/image/I = image('icons/misc/mark.dmi', "blank") - - if(lentext(tn)>8) - tn = "*" - - var/len = lentext(tn) - - for(var/d = 1 to lentext(tn)) - - - var/char = copytext(tn, len-d+1, len-d+2) - - if(char == " ") - continue - - var/image/ID = image('icons/misc/mark.dmi', char) - - ID.pixel_x = -(d-1)*4 - ID.pixel_y = s - //if(d>1) I.Shift(WEST, (d-1)*8) - - I.overlays += ID - - - - return I - else - alert("Debugging off") - return - -/*/turf/verb/Stats() - set category = "Debug" - for(var/turf/T in range(5)) - - var/obj/effect/mark/O = locate(/obj/effect/mark/, T) - - if(!O) - O = new /obj/effect/mark(T) - else - O.overlays.Cut() - - - var/temp = round(T.temp-T0C, 0.1) - - O.overlays += numbericon("[temp]C") - - var/pres = round(T.tot_gas() / CELLSTANDARD * 100, 0.1) - - O.overlays += numbericon("[pres]", -8) - O.mark = "[temp]/[pres]" -*/ -/* -/turf/verb/Pipes() - set category = "Debug" - - for(var/turf/T in range(6)) - - //world << "Turf [T] at ([T.x],[T.y])" - - for(var/obj/machinery/M in T) - //world <<" Mach [M] with pdir=[M.p_dir]" - - if(M && M.p_dir) - - //world << "Accepted" - var/obj/effect/mark/O = locate(/obj/effect/mark/, T) - - if(!O) - O = new /obj/effect/mark(T) - else - O.overlays.Cut() - - if(istype(M, /obj/machinery/pipes)) - var/obj/machinery/pipes/P = M - O.overlays += numbericon("[P.plnum] ", -20) - M = P.pl - - - var/obj/substance/gas/G = M.get_gas() - - if(G) - - var/cap = round( 100*(G.tot_gas()/ M.capmult / 6e6), 0.1) - var/temp = round(G.temperature - T0C, 0.1) - O.overlays += numbericon("[temp]C", 0) - O.overlays += numbericon("[cap]", -8) - - break -*/ -/turf/verb/Cables() - set category = "Debug" - if(Debug) - for(var/turf/T in range(6)) - - //world << "Turf [T] at ([T.x],[T.y])" - - var/obj/effect/mark/O = locate(/obj/effect/mark/, T) - - if(!O) - O = new /obj/effect/mark(T) - else - O.overlays.Cut() - - var/marked = 0 - for(var/obj/M in T) - //world <<" Mach [M] with pdir=[M.p_dir]" - - - if(M && istype(M, /obj/structure/cable/)) - - - var/obj/structure/cable/C = M - //world << "Accepted" - - O.overlays += numbericon("[C.netnum] " , marked) - - marked -= 8 - - else if(M && istype(M, /obj/machinery/power/)) - - var/obj/machinery/power/P = M - O.overlays += numbericon("*[P.netnum] " , marked) - marked -= 8 - - if(!marked) - del(O) - else - alert("Debugging off") - return - - -/turf/verb/Solar() - set category = "Debug" - if(Debug) - - for(var/turf/T in range(6)) - - //world << "Turf [T] at ([T.x],[T.y])" - - var/obj/effect/mark/O = locate(/obj/effect/mark/, T) - - if(!O) - O = new /obj/effect/mark(T) - else - O.overlays.Cut() - - - var/obj/machinery/power/solar/S - - S = locate(/obj/machinery/power/solar, T) - - if(S) - - O.overlays += numbericon("[S.obscured] " , 0) - O.overlays += numbericon("[round(S.sunfrac*100,0.1)] " , -12) - - else - del(O) - else - alert("Debugging off") - return - - -/mob/verb/Showports() - set category = "Debug" - if(Debug) - var/turf/T - var/obj/machinery/pipes/P - var/list/ndirs - - for(var/obj/machinery/pipeline/PL in plines) - - var/num = plines.Find(PL) - - P = PL.nodes[1] // 1st node in list - ndirs = P.get_node_dirs() - - T = get_step(P, ndirs[1]) - - var/obj/effect/mark/O = new(T) - - O.overlays += numbericon("[num] * 1 ", -4) - O.overlays += numbericon("[ndirs[1]] - [ndirs[2]]",-16) - - - P = PL.nodes[PL.nodes.len] // last node in list - - ndirs = P.get_node_dirs() - T = get_step(P, ndirs[2]) - - O = new(T) - - O.overlays += numbericon("[num] * 2 ", -4) - O.overlays += numbericon("[ndirs[1]] - [ndirs[2]]", -16) - else - alert("Debugging off") - return - -/atom/verb/delete() - set category = "Debug" - set src in view() - if(Debug) - del(src) - else - alert("Debugging off") - return - - -/area/verb/dark() - set category = "Debug" - if(Debug) - if(src.icon_state == "dark") - icon_state = null - else - icon_state = "dark" - else - alert("Debugging off") - return - -/area/verb/power() - set category = "Debug" - if(Debug) - power_equip = !power_equip - power_environ = !power_environ - - world << "Power ([src]) = [power_equip]" - - power_change() - else - alert("Debugging off") - return - -// *****RM - -// ***** - - -/mob/verb/ShowPlasma() - set category = "Debug" - if(Debug) - Plasma() - else - alert("Debugging off") - return - -/mob/verb/Blobcount() - set category = "Debug" - if(Debug) - world << "Blob count: [blobs.len]" - else - alert("Debugging off") - return - - -/mob/verb/Blobkill() - set category = "Debug" - if(Debug) - blobs = list() - world << "Blob killed." - else - alert("Debugging off") - return - -/mob/verb/Blobmode() - set category = "Debug" - if(Debug) - world << "Event=[ticker.event]" - world << "Time =[(ticker.event_time - world.realtime)/10]s" - else - alert("Debugging off") - return - -/mob/verb/Blobnext() - set category = "Debug" - if(Debug) - ticker.event_time = world.realtime - else - alert("Debugging off") - return - - -/mob/verb/callshuttle() - set category = "Debug" - if(Debug) - ticker.timeleft = 300 - ticker.timing = 1 - else - alert("Debugging off") - return - -/mob/verb/apcs() - set category = "Debug" - if(Debug) - for(var/obj/machinery/power/apc/APC in world) - world << APC.report() - else - alert("Debugging off") - return - -/mob/verb/Globals() - set category = "Debug" - if(Debug) - debugobj = new() - - debugobj.debuglist = list( powernets, plines, vote, config, admins, ticker, SS13_airtunnel, sun ) - - - world << "Debug" - else - alert("Debugging off") - return - /*for(var/obj/O in plines) - - world << "[O.name]" - */ - - - - -/mob/verb/Mach() - set category = "Debug" - if(Debug) - var/n = 0 - for(var/obj/machinery/M in world) - n++ - if(! (M in machines) ) - world << "[M] [M.type]: not in list" - - world << "in world: [n]; in list:[machines.len]" - else - alert("Debugging off") - return - - -/*/mob/verb/air() - set category = "Debug" - - Air() - -/proc/Air() - - - var/area/A = locate(/area/airintake) - - var/atot = 0 - for(var/turf/T in A) - atot += T.tot_gas() - - var/ptot = 0 - for(var/obj/machinery/pipeline/PL in plines) - if(PL.suffix == "d") - ptot += PL.ngas.tot_gas() - - var/vtot = 0 - for(var/obj/machinery/atmoalter/V in machines) - if(V.suffix == "d") - vtot += V.gas.tot_gas() - - var/ctot = 0 - for(var/obj/machinery/connector/C in machines) - if(C.suffix == "d") - ctot += C.ngas.tot_gas() - - - var/tot = atot + ptot + vtot + ctot - - diary << "A=[num2text(atot,10)] P=[num2text(ptot,10)] V=[num2text(vtot,10)] C=[num2text(ctot,10)] : Total=[num2text(tot,10)]" -*/ -/mob/verb/Revive() - set category = "Debug" - if(Debug) - adjustFireLoss(0 - getBruteLoss()) - setToxLoss(0) - adjustBruteLoss(0 - getBruteLoss()) - setOxyLoss(0) - paralysis = 0 - stunned = 0 - weakened = 0 - health = 100 - if(stat > 1) stat=0 - disabilities = initial(disabilities) - sdisabilities = initial(sdisabilities) - for(var/datum/organ/external/e in src) - e.brute_dam = 0.0 - e.burn_dam = 0.0 - e.bandaged = 0.0 - e.wound_size = 0.0 - e.max_damage = initial(e.max_damage) - e.broken = 0 - e.destroyed = 0 - e.perma_injury = 0 - e.update_icon() - if(src.type == /mob/living/carbon/human) - var/mob/living/carbon/human/H = src - H.update_body() - H.UpdateDamageIcon() - else - alert("Debugging off") - return - -/mob/verb/Smoke() - set category = "Debug" - if(Debug) - var/obj/effect/smoke/O = new /obj/effect/smoke( src.loc ) - O.set_dir(pick(NORTH, SOUTH, EAST, WEST)) - spawn( 0 ) - O.Life() - else - alert("Debugging off") - return - -/mob/verb/revent(number as num) - set category = "Debug" - set name = "Change event %" - if(!src.holder) - src << "Only administrators may use this command." - return - if(src.holder) - eventchance = number - log_admin("[src.key] set the random event chance to [eventchance]%") - message_admins("[src.key] set the random event chance to [eventchance]%") - -/* Does nothing but blow up the station. -/mob/verb/funbutton() - set category = "Admin" - set name = "Random Expl.(REMOVE ME)" - if(!src.holder) - src << "Only administrators may use this command." - return - for(var/turf/T in world) - if(prob(4) && T.z in station_levels && istype(T,/turf/station/floor)) - spawn(50+rand(0,3000)) - var/obj/item/weapon/tank/plasmatank/pt = new /obj/item/weapon/tank/plasmatank( T ) - pt.gas.temperature = 400+T0C - pt.ignite() - for(var/turf/P in view(3, T)) - if (P.poison) - P.poison = 0 - P.oldpoison = 0 - P.tmppoison = 0 - P.oxygen = 755985 - P.oldoxy = 755985 - P.tmpoxy = 755985 - usr << "\blue Blowing up station ..." - world << "[usr.key] has used boom boom boom shake the room" -*/ - -/mob/verb/removeplasma() - set category = "Debug" - set name = "Stabilize Atmos." - if(!src.holder) - src << "Only administrators may use this command." - return - spawn(0) - for(var/turf/T in view()) - T.poison = 0 - T.oldpoison = 0 - T.tmppoison = 0 - T.oxygen = 755985 - T.oldoxy = 755985 - T.tmpoxy = 755985 - T.co2 = 14.8176 - T.oldco2 = 14.8176 - T.tmpco2 = 14.8176 - T.n2 = 2.844e+006 - T.on2 = 2.844e+006 - T.tn2 = 2.844e+006 - T.tsl_gas = 0 - T.osl_gas = 0 - T.sl_gas = 0 - T.temp = 293.15 - T.otemp = 293.15 - T.ttemp = 293.15 - -/mob/verb/fire(turf/T as turf in world) - set category = "Special Verbs" - set name = "Create Fire" - if(!src.holder) - src << "Only administrators may use this command." - return - world << "[usr.key] created fire" - spawn(0) - T.poison += 30000000 - T.firelevel = T.poison - -/mob/verb/co2(turf/T as turf in world) - set category = "Special Verbs" - set name = "Create CO2" - if(!src.holder) - src << "Only administrators may use this command." - return - world << "[usr.key] created CO2" - spawn(0) - T.co2 += 300000000 - -/mob/verb/n2o(turf/T as turf in world) - set category = "Special Verbs" - set name = "Create N2O" - if(!src.holder) - src << "Only administrators may use this command." - return - world << "[usr.key] created N2O" - spawn(0) - T.sl_gas += 30000000 - -/mob/verb/explosion(T as obj|mob|turf in world) - set category = "Special Verbs" - set name = "Create Explosion" - if(!src.holder) - src << "Only administrators may use this command." - return - world << "[usr.key] created an explosion" - var/obj/item/weapon/tank/plasmatank/pt = new /obj/item/weapon/tank/plasmatank( T ) - playsound(pt.loc, "explosion", 100, 1,3) - playsound(pt.loc, 'sound/effects/explosionfar.ogg', 100, 1,10) - pt.gas.temperature = 500+T0C - pt.ignite() - - diff --git a/code/unused/ai_lockdown.dm b/code/unused/ai_lockdown.dm deleted file mode 100644 index 552ae977f3..0000000000 --- a/code/unused/ai_lockdown.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/silicon/ai/proc/lockdown() - set category = "AI Commands" - set name = "Lockdown" - - if(usr.stat == 2) - usr <<"You cannot initiate lockdown because you are dead!" - return - - src << "Initiating lockdowns has been disabled due to system stress." -// Commented this out to disable Lockdowns -- TLE -/* world << "\red Lockdown initiated by [usr.name]!" - - for(var/obj/machinery/firealarm/FA in world) //activate firealarms - spawn( 0 ) - if(FA.lockdownbyai == 0) - FA.lockdownbyai = 1 - FA.alarm() - for(var/obj/machinery/door/airlock/AL in world) //close airlocks - spawn( 0 ) - if(AL.canAIControl() && AL.icon_state == "door0" && AL.lockdownbyai == 0) - AL.close() - AL.lockdownbyai = 1 - - var/obj/machinery/computer/communications/C = locate() in world - if(C) - C.post_status("alert", "lockdown") -*/ - -/* src.verbs -= /mob/living/silicon/ai/proc/lockdown - src.verbs += /mob/living/silicon/ai/proc/disablelockdown - usr << "\red Disable lockdown command enabled!" - winshow(usr,"rpane",1) -*/ - -/mob/living/silicon/ai/proc/disablelockdown() - set category = "AI Commands" - set name = "Disable Lockdown" - - if(usr.stat == 2) - usr <<"You cannot disable lockdown because you are dead!" - return - - world << "\red Lockdown cancelled by [usr.name]!" - - for(var/obj/machinery/firealarm/FA in world) //deactivate firealarms - spawn( 0 ) - if(FA.lockdownbyai == 1) - FA.lockdownbyai = 0 - FA.reset() - for(var/obj/machinery/door/airlock/AL in world) //open airlocks - spawn ( 0 ) - if(AL.canAIControl() && AL.lockdownbyai == 1) - AL.open() - AL.lockdownbyai = 0 - -/* src.verbs -= /mob/living/silicon/ai/proc/disablelockdown - src.verbs += /mob/living/silicon/ai/proc/lockdown - usr << "\red Disable lockdown command removed until lockdown initiated again!" - winshow(usr,"rpane",1) -*/ \ No newline at end of file diff --git a/code/unused/airtunnel.dm b/code/unused/airtunnel.dm deleted file mode 100644 index 9b61340bdf..0000000000 --- a/code/unused/airtunnel.dm +++ /dev/null @@ -1,463 +0,0 @@ -/obj/machinery/sec_lock//P'sure this was part of the tunnel - name = "Security Pad" - desc = "A lock, for doors. Used by security." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "sec_lock" - var/obj/item/weapon/card/id/scan = null - var/a_type = 0.0 - var/obj/machinery/door/d1 = null - var/obj/machinery/door/d2 = null - anchored = 1.0 - req_access = list(access_brig) - use_power = 1 - idle_power_usage = 2 - active_power_usage = 4 - -/obj/move/airtunnel/process() - if (!( src.deployed )) - return null - else - ..() - return - -/obj/move/airtunnel/connector/create() - src.current = src - src.next = new /obj/move/airtunnel( null ) - src.next.master = src.master - src.next.previous = src - spawn( 0 ) - src.next.create(airtunnel_start - airtunnel_stop, src.y) - return - return - -/obj/move/airtunnel/connector/wall/create() - src.current = src - src.next = new /obj/move/airtunnel/wall( null ) - src.next.master = src.master - src.next.previous = src - spawn( 0 ) - src.next.create(airtunnel_start - airtunnel_stop, src.y) - return - return - -/obj/move/airtunnel/connector/wall/process() - return - -/obj/move/airtunnel/wall/create(num, y_coord) - if (((num < 7 || (num > 16 && num < 23)) && y_coord == airtunnel_bottom)) - src.next = new /obj/move/airtunnel( null ) - else - src.next = new /obj/move/airtunnel/wall( null ) - src.next.master = src.master - src.next.previous = src - if (num > 1) - spawn( 0 ) - src.next.create(num - 1, y_coord) - return - return - -/obj/move/airtunnel/wall/move_right() - flick("wall-m", src) - return ..() - -/obj/move/airtunnel/wall/move_left() - flick("wall-m", src) - return ..() - -/obj/move/airtunnel/wall/process() - return - -/obj/move/airtunnel/proc/move_left() - src.relocate(get_step(src, WEST)) - if ((src.next && src.next.deployed)) - return src.next.move_left() - else - return src.next - return - -/obj/move/airtunnel/proc/move_right() - src.relocate(get_step(src, EAST)) - if ((src.previous && src.previous.deployed)) - src.previous.move_right() - return src.previous - -/obj/move/airtunnel/proc/create(num, y_coord) - if (y_coord == airtunnel_bottom) - if ((num < 7 || (num > 16 && num < 23))) - src.next = new /obj/move/airtunnel( null ) - else - src.next = new /obj/move/airtunnel/wall( null ) - else - src.next = new /obj/move/airtunnel( null ) - src.next.master = src.master - src.next.previous = src - if (num > 1) - spawn( 0 ) - src.next.create(num - 1, y_coord) - return - return - -/obj/machinery/at_indicator/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - for(var/x in src.verbs) - src.verbs -= x - src.icon_state = "reader_broken" - stat |= BROKEN - if(3.0) - if (prob(25)) - for(var/x in src.verbs) - src.verbs -= x - src.icon_state = "reader_broken" - stat |= BROKEN - else - return - -/obj/machinery/at_indicator/blob_act() - if (prob(75)) - for(var/x in src.verbs) - src.verbs -= x - src.icon_state = "reader_broken" - stat |= BROKEN - -/obj/machinery/at_indicator/proc/update_icon() - if(stat & (BROKEN|NOPOWER)) - icon_state = "reader_broken" - return - - var/status = 0 - if (SS13_airtunnel.operating == 1) - status = "r" - else - if (SS13_airtunnel.operating == 2) - status = "e" - else - if(!SS13_airtunnel.connectors) - return - var/obj/move/airtunnel/connector/C = pick(SS13_airtunnel.connectors) - if (C.current == C) - status = 0 - else - if (!( C.current.next )) - status = 2 - else - status = 1 - src.icon_state = text("reader[][]", (SS13_airtunnel.siphon_status == 2 ? "1" : "0"), status) - return - -/obj/machinery/at_indicator/process() - if(stat & (NOPOWER|BROKEN)) - src.update_icon() - return - use_power(5, ENVIRON) - src.update_icon() - return - -/obj/machinery/computer/airtunnel/attack_paw(user as mob) - return src.attack_hand(user) - -obj/machinery/computer/airtunnel/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/airtunnel/attack_hand(var/mob/user as mob) - if(..()) - return - - var/dat = "Air Tunnel Controls
    " - user.machine = src - if (SS13_airtunnel.operating == 1) - dat += "Status: RETRACTING
    " - else - if (SS13_airtunnel.operating == 2) - dat += "Status: EXPANDING
    " - else - var/obj/move/airtunnel/connector/C = pick(SS13_airtunnel.connectors) - if (C.current == C) - dat += "Status: Fully Retracted
    " - else - if (!( C.current.next )) - dat += "Status: Fully Extended
    " - else - dat += "Status: Stopped Midway
    " - dat += text("Retract Stop Extend
    ", src, src, src) - dat += text("
    Air Level: []
    ", (SS13_airtunnel.air_stat ? "Acceptable" : "DANGEROUS")) - dat += "Air System Status: " - switch(SS13_airtunnel.siphon_status) - if(0.0) - dat += "Stopped " - if(1.0) - dat += "Siphoning (Siphons only) " - if(2.0) - dat += "Regulating (BOTH) " - if(3.0) - dat += "RELEASING MAX (Siphons only) " - else - dat += text("(Refresh)
    ", src) - dat += text("RELEASE (Siphons only) Siphon (Siphons only) Stop Regulate
    ", src, src, src, src) - dat += text("

    Close
    ", user) - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/airtunnel/proc/update_icon() - if(stat & BROKEN) - icon_state = "broken" - return - - if(stat & NOPOWER) - icon_state = "c_unpowered" - return - - var/status = 0 - if (SS13_airtunnel.operating == 1) - status = "r" - else - if (SS13_airtunnel.operating == 2) - status = "e" - else - var/obj/move/airtunnel/connector/C = pick(SS13_airtunnel.connectors) - if (C.current == C) - status = 0 - else - if (!( C.current.next )) - status = 2 - else - status = 1 - src.icon_state = text("console[][]", (SS13_airtunnel.siphon_status >= 2 ? "1" : "0"), status) - return - -/obj/machinery/computer/airtunnel/process() - src.update_icon() - if(stat & (NOPOWER|BROKEN)) - return - use_power(250) - src.updateUsrDialog() - return - -/obj/machinery/computer/airtunnel/Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))) - usr.machine = src - if (href_list["retract"]) - SS13_airtunnel.retract() - else if (href_list["stop"]) - SS13_airtunnel.operating = 0 - else if (href_list["extend"]) - SS13_airtunnel.extend() - else if (href_list["release"]) - SS13_airtunnel.siphon_status = 3 - SS13_airtunnel.siphons() - else if (href_list["siphon"]) - SS13_airtunnel.siphon_status = 1 - SS13_airtunnel.siphons() - else if (href_list["stop_siph"]) - SS13_airtunnel.siphon_status = 0 - SS13_airtunnel.siphons() - else if (href_list["auto"]) - SS13_airtunnel.siphon_status = 2 - SS13_airtunnel.siphons() - else if (href_list["refresh"]) - SS13_airtunnel.siphons() - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/obj/machinery/sec_lock/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/sec_lock/attack_paw(user as mob) - return src.attack_hand(user) - -/obj/machinery/sec_lock/attack_hand(var/mob/user as mob) - if(..()) - return - use_power(10) - - if (src.loc == user.loc) - var/dat = text("Security Pad:
    \nKeycard: []
    \nToggle Outer Door
    \nToggle Inner Door
    \n
    \nEmergency Close
    \nEmergency Open
    ", (src.scan ? text("[]", src, src.scan.name) : text("-----", src)), src, src, src, src) - user << browse(dat, "window=sec_lock") - onclose(user, "sec_lock") - return - -/obj/machinery/sec_lock/attackby(nothing, user as mob) - return src.attack_hand(user) - -/obj/machinery/sec_lock/New() - ..() - spawn( 2 ) - if (src.a_type == 1) - src.d2 = locate(/obj/machinery/door, locate(src.x - 2, src.y - 1, src.z)) - src.d1 = locate(/obj/machinery/door, get_step(src, SOUTHWEST)) - else - if (src.a_type == 2) - src.d2 = locate(/obj/machinery/door, locate(src.x - 2, src.y + 1, src.z)) - src.d1 = locate(/obj/machinery/door, get_step(src, NORTHWEST)) - else - src.d1 = locate(/obj/machinery/door, get_step(src, SOUTH)) - src.d2 = locate(/obj/machinery/door, get_step(src, SOUTHEAST)) - return - return - -/obj/machinery/sec_lock/Topic(href, href_list) - if(..()) - return - if ((!( src.d1 ) || !( src.d2 ))) - usr << "\red Error: Cannot interface with door security!" - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))) - usr.machine = src - if (href_list["card"]) - if (src.scan) - src.scan.loc = src.loc - src.scan = null - else - var/obj/item/weapon/card/id/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() - I.loc = src - src.scan = I - if (href_list["door1"]) - if (src.scan) - if (src.check_access(src.scan)) - if (src.d1.density) - spawn( 0 ) - src.d1.open() - return - else - spawn( 0 ) - src.d1.close() - return - if (href_list["door2"]) - if (src.scan) - if (src.check_access(src.scan)) - if (src.d2.density) - spawn( 0 ) - src.d2.open() - return - else - spawn( 0 ) - src.d2.close() - return - if (href_list["em_cl"]) - if (src.scan) - if (src.check_access(src.scan)) - if (!( src.d1.density )) - src.d1.close() - return - sleep(1) - spawn( 0 ) - if (!( src.d2.density )) - src.d2.close() - return - if (href_list["em_op"]) - if (src.scan) - if (src.check_access(src.scan)) - spawn( 0 ) - if (src.d1.density) - src.d1.open() - return - sleep(1) - spawn( 0 ) - if (src.d2.density) - src.d2.open() - return - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/datum/air_tunnel/air_tunnel1/New() - ..() - for(var/obj/move/airtunnel/A in locate(/area/airtunnel1)) - A.master = src - A.create() - src.connectors += A - //Foreach goto(21) - return - -/datum/air_tunnel/proc/siphons() - switch(src.siphon_status) - if(0.0) - for(var/obj/machinery/atmoalter/siphs/S in locate(/area/airtunnel1)) - S.t_status = 3 - if(1.0) - for(var/obj/machinery/atmoalter/siphs/fullairsiphon/S in locate(/area/airtunnel1)) - S.t_status = 2 - S.t_per = 1000000.0 - for(var/obj/machinery/atmoalter/siphs/scrubbers/S in locate(/area/airtunnel1)) - S.t_status = 3 - if(2.0) - for(var/obj/machinery/atmoalter/siphs/S in locate(/area/airtunnel1)) - S.t_status = 4 - if(3.0) - for(var/obj/machinery/atmoalter/siphs/fullairsiphon/S in locate(/area/airtunnel1)) - S.t_status = 1 - S.t_per = 1000000.0 - for(var/obj/machinery/atmoalter/siphs/scrubbers/S in locate(/area/airtunnel1)) - S.t_status = 3 - else - return - -/datum/air_tunnel/proc/stop() - src.operating = 0 - return - -/datum/air_tunnel/proc/extend() - if (src.operating) - return - - spawn(0) - src.operating = 2 - while(src.operating == 2) - var/ok = 1 - for(var/obj/move/airtunnel/connector/A in src.connectors) - if (!( A.current.next )) - src.operating = 0 - return - if (!( A.move_left() )) - ok = 0 - if (!( ok )) - src.operating = 0 - else - for(var/obj/move/airtunnel/connector/A in src.connectors) - if (A.current) - A.current.next.loc = get_step(A.current.loc, EAST) - A.current = A.current.next - A.current.deployed = 1 - else - src.operating = 0 - sleep(20) - return - -/datum/air_tunnel/proc/retract() - if (src.operating) - return - spawn(0) - src.operating = 1 - while(src.operating == 1) - var/ok = 1 - for(var/obj/move/airtunnel/connector/A in src.connectors) - if (A.current == A) - src.operating = 0 - return - if (A.current) - A.current.loc = null - A.current.deployed = 0 - A.current = A.current.previous - else - ok = 0 - if (!( ok )) - src.operating = 0 - else - for(var/obj/move/airtunnel/connector/A in src.connectors) - if (!( A.current.move_right() )) - src.operating = 0 - sleep(20) - return \ No newline at end of file diff --git a/code/unused/assemblies.dm b/code/unused/assemblies.dm deleted file mode 100644 index 2c6909287a..0000000000 --- a/code/unused/assemblies.dm +++ /dev/null @@ -1,951 +0,0 @@ -/*/obj/item/assembly - name = "assembly" - icon = 'icons/obj/assemblies.dmi' - item_state = "assembly" - var/status = 0.0 - throwforce = 10 - w_class = 3.0 - throw_speed = 4 - throw_range = 10 - -/obj/item/assembly/a_i_a - name = "Health-Analyzer/Igniter/Armor Assembly" - desc = "A health-analyzer, igniter and armor assembly." - icon_state = "armor-igniter-analyzer" - var/obj/item/device/healthanalyzer/part1 = null - var/obj/item/device/igniter/part2 = null - var/obj/item/clothing/suit/armor/vest/part3 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/m_i_ptank - desc = "A very intricate igniter and proximity sensor electrical assembly mounted onto top of a plasma tank." - name = "Proximity/Igniter/Plasma Tank Assembly" - icon_state = "prox-igniter-tank0" - var/obj/item/device/prox_sensor/part1 = null - var/obj/item/device/igniter/part2 = null - var/obj/item/weapon/tank/plasma/part3 = null - status = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/prox_ignite - name = "Proximity/Igniter Assembly" - desc = "A proximity-activated igniter assembly." - icon_state = "prox-igniter0" - var/obj/item/device/prox_sensor/part1 = null - var/obj/item/device/igniter/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/r_i_ptank - desc = "A very intricate igniter and signaller electrical assembly mounted onto top of a plasma tank." - name = "Radio/Igniter/Plasma Tank Assembly" - icon_state = "radio-igniter-tank" - var/obj/item/device/radio/signaler/part1 = null - var/obj/item/device/igniter/part2 = null - var/obj/item/weapon/tank/plasma/part3 = null - status = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/anal_ignite - name = "Health-Analyzer/Igniter Assembly" - desc = "A health-analyzer igniter assembly." - icon_state = "timer-igniter0" - var/obj/item/device/healthanalyzer/part1 = null - var/obj/item/device/igniter/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - item_state = "electronic" - -/obj/item/assembly/time_ignite - name = "Timer/Igniter Assembly" - desc = "A timer-activated igniter assembly." - icon_state = "timer-igniter0" - var/obj/item/device/timer/part1 = null - var/obj/item/device/igniter/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/t_i_ptank - desc = "A very intricate igniter and timer assembly mounted onto top of a plasma tank." - name = "Timer/Igniter/Plasma Tank Assembly" - icon_state = "timer-igniter-tank0" - var/obj/item/device/timer/part1 = null - var/obj/item/device/igniter/part2 = null - var/obj/item/weapon/tank/plasma/part3 = null - status = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/rad_ignite - name = "Radio/Igniter Assembly" - desc = "A radio-activated igniter assembly." - icon_state = "radio-igniter" - var/obj/item/device/radio/signaler/part1 = null - var/obj/item/device/igniter/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/rad_infra - name = "Signaller/Infrared Assembly" - desc = "An infrared-activated radio signaller" - icon_state = "infrared-radio0" - var/obj/item/device/radio/signaler/part1 = null - var/obj/item/device/infra/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/rad_prox - name = "Signaller/Prox Sensor Assembly" - desc = "A proximity-activated radio signaller." - icon_state = "prox-radio0" - var/obj/item/device/radio/signaler/part1 = null - var/obj/item/device/prox_sensor/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/assembly/rad_time - name = "Signaller/Timer Assembly" - desc = "A radio signaller activated by a count-down timer." - icon_state = "timer-radio0" - var/obj/item/device/radio/signaler/part1 = null - var/obj/item/device/timer/part2 = null - status = null - flags = FPRINT | TABLEPASS| CONDUCT -*/ - -/obj/item/assembly/time_ignite/premade/New() - ..() - part1 = new(src) - part2 = new(src) - part1.master = src - part2.master = src - //part2.status = 0 - -/obj/item/assembly/time_ignite/Del() - del(part1) - del(part2) - ..() - -/obj/item/assembly/time_ignite/attack_self(mob/user as mob) - if (src.part1) - src.part1.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/time_ignite/receive_signal() - if (!status) - return - for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - src.part2.Activate() - return - -/obj/effect/decal/ash/attack_hand(mob/user as mob) - usr << "\blue The ashes slip through your fingers." - del(src) - return - -/obj/item/assembly/time_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part1.master = null - src.part1 = null - src.part2.loc = T - src.part2.master = null - src.part2 = null - - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The timer is now secured!", 1) - else - user.show_message("\blue The timer is now unsecured!", 1) - src.part2.secured = src.status - src.add_fingerprint(user) - return - -/obj/item/assembly/time_ignite/c_state(n) - src.icon_state = text("timer-igniter[]", n) - return - -//*********** - -/obj/item/assembly/anal_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part1.master = null - src.part1 = null - src.part2.loc = T - src.part2.master = null - src.part2 = null - - del(src) - return - if (( istype(W, /obj/item/weapon/screwdriver) )) - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The analyzer is now secured!", 1) - else - user.show_message("\blue The analyzer is now unsecured!", 1) - src.part2.secured = src.status - src.add_fingerprint(user) - if(( istype(W, /obj/item/clothing/suit/armor/vest) ) && src.status) - var/obj/item/assembly/a_i_a/R = new - R.part1 = part1 - R.part1.master = R - part1 = null - - R.part2 = part2 - R.part2.master = R - part2 = null - - user.put_in_hand(R) - user.before_take_item(W) - R.part3 = W - R.part3.master = R - del(src) - -/* WTF THIS SHIT? It is working? Shouldn't. --rastaf0 - W.loc = R - R.part1 = W - R.part2 = W - W.layer = initial(W.layer) - if (user.client) - user.client.screen -= W - if (user.r_hand == W) - user.u_equip(W) - user.r_hand = R - else - user.u_equip(W) - user.l_hand = R - W.master = R - src.master = R - src.layer = initial(src.layer) - user.u_equip(src) - if (user.client) - user.client.screen -= src - src.loc = R - R.part3 = src - R.layer = 20 - R.loc = user - src.add_fingerprint(user) -*/ - return -/* else if ((istype(W, /obj/item/device/timer) && !( src.status ))) - - var/obj/item/assembly/time_ignite/R = new /obj/item/assembly/time_ignite( user ) - W.loc = R - R.part1 = W - W.layer = initial(W.layer) - if (user.client) - user.client.screen -= W - if (user.r_hand == W) - user.u_equip(W) - user.r_hand = R - else - user.u_equip(W) - user.l_hand = R - W.master = R - src.master = R - src.layer = initial(src.layer) - user.u_equip(src) - if (user.client) - user.client.screen -= src - src.loc = R - R.part2 = src - R.layer = 20 - R.loc = user - src.add_fingerprint(user) -*/ - -/obj/item/assembly/proc/c_state(n, O as obj) - return - -/obj/item/assembly/a_i_a/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part1.master = null - src.part1 = null - src.part2.loc = T - src.part2.master = null - src.part2 = null - src.part3.loc = T - src.part3.master = null - src.part3 = null - - del(src) - return - if (( istype(W, /obj/item/weapon/screwdriver) )) - if (!src.status && (!part1||!part2||!part3)) - user << "\red You cannot finish the assembly, not all components are in place!" - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The armor is now secured!", 1) - else - user.show_message("\blue The armor is now unsecured!", 1) - src.add_fingerprint(user) - -/obj/item/assembly/a_i_a/Del() - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - del(src.part3) - ..() - return -//***** - -/obj/item/assembly/rad_time/Del() - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - ..() - return - -/obj/item/assembly/rad_time/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part2.loc = T - src.part1.master = null - src.part2.master = null - src.part1 = null - src.part2 = null - //SN src = null - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The signaler is now secured!", 1) - else - user.show_message("\blue The signaler is now unsecured!", 1) - src.part1.b_stat = !( src.status ) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_time/attack_self(mob/user as mob) - src.part1.attack_self(user, src.status) - src.part2.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_time/receive_signal(datum/signal/signal) - if (signal.source == src.part2) - src.part1.send_signal("ACTIVATE") - return -//******************* -/obj/item/assembly/rad_prox/c_state(n) - src.icon_state = "prox-radio[n]" - return - -/obj/item/assembly/rad_prox/Del() - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - ..() - return - -/obj/item/assembly/rad_prox/HasProximity(atom/movable/AM as mob|obj) - if (istype(AM, /obj/effect/beam)) - return - if (AM.move_speed < 12) - src.part2.sense() - return - -/obj/item/assembly/rad_prox/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part2.loc = T - src.part1.master = null - src.part2.master = null - src.part1 = null - src.part2 = null - //SN src = null - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The proximity sensor is now secured!", 1) - else - user.show_message("\blue The proximity sensor is now unsecured!", 1) - src.part1.b_stat = !( src.status ) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_prox/attack_self(mob/user as mob) - src.part1.attack_self(user, src.status) - src.part2.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_prox/receive_signal(datum/signal/signal) - if (signal.source == src.part2) - src.part1.send_signal("ACTIVATE") - return - -/obj/item/assembly/rad_prox/Move() - ..() - src.part2.sense() - return - -/obj/item/assembly/rad_prox/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/item/assembly/rad_prox/dropped() - spawn( 0 ) - src.part2.sense() - return - return -//************************ -/obj/item/assembly/rad_infra/c_state(n) - src.icon_state = text("infrared-radio[]", n) - return - -/obj/item/assembly/rad_infra/Del() - del(src.part1) - del(src.part2) - ..() - return - -/obj/item/assembly/rad_infra/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part2.loc = T - src.part1.master = null - src.part2.master = null - src.part1 = null - src.part2 = null - //SN src = null - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The infrared laser is now secured!", 1) - else - user.show_message("\blue The infrared laser is now unsecured!", 1) - src.part1.b_stat = !( src.status ) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_infra/attack_self(mob/user as mob) - src.part1.attack_self(user, src.status) - src.part2.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_infra/receive_signal(datum/signal/signal) - - if (signal.source == src.part2) - src.part1.send_signal("ACTIVATE") - return - -/obj/item/assembly/rad_infra/verb/rotate() - set name = "Rotate Assembly" - set category = "Object" - set src in usr - - src.set_dir(turn(src.dir, 90)) - src.part2.set_dir(src.dir) - src.add_fingerprint(usr) - return - -/obj/item/assembly/rad_infra/Move() - - var/t = src.dir - ..() - src.set_dir(t) - //src.part2.first = null - del(src.part2.first) - return - -/obj/item/assembly/rad_infra/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/item/assembly/rad_infra/attack_hand(M) - del(src.part2.first) - ..() - return - -/obj/item/assembly/prox_ignite/HasProximity(atom/movable/AM as mob|obj) - - if (istype(AM, /obj/effect/beam)) - return - if (AM.move_speed < 12 && src.part1) - src.part1.sense() - return - -/obj/item/assembly/prox_ignite/dropped() - spawn( 0 ) - src.part1.sense() - return - return - -/obj/item/assembly/prox_ignite/Del() - del(src.part1) - del(src.part2) - ..() - return - -/obj/item/assembly/prox_ignite/c_state(n) - src.icon_state = text("prox-igniter[]", n) - return - -/obj/item/assembly/prox_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part2.loc = T - src.part1.master = null - src.part2.master = null - src.part1 = null - src.part2 = null - //SN src = null - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The proximity sensor is now secured! The igniter now works!", 1) - else - user.show_message("\blue The proximity sensor is now unsecured! The igniter will not work.", 1) - src.part2.secured = src.status - src.add_fingerprint(user) - return - -/obj/item/assembly/prox_ignite/attack_self(mob/user as mob) - - if (src.part1) - src.part1.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/prox_ignite/receive_signal() - for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - src.part2.Activate() - return - -/obj/item/assembly/rad_ignite/Del() - del(src.part1) - del(src.part2) - ..() - return - - - -/obj/item/assembly/rad_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/turf/T = src.loc - if (ismob(T)) - T = T.loc - src.part1.loc = T - src.part2.loc = T - src.part1.master = null - src.part2.master = null - src.part1 = null - src.part2 = null - //SN src = null - del(src) - return - if (!( istype(W, /obj/item/weapon/screwdriver) )) - return - src.status = !( src.status ) - if (src.status) - user.show_message("\blue The radio is now secured! The igniter now works!", 1) - else - user.show_message("\blue The radio is now unsecured! The igniter will not work.", 1) - src.part2.secured = src.status - src.part1.b_stat = !( src.status ) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_ignite/attack_self(mob/user as mob) - - if (src.part1) - src.part1.attack_self(user, src.status) - src.add_fingerprint(user) - return - -/obj/item/assembly/rad_ignite/receive_signal() - for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - src.part2.Activate() - return - -/obj/item/assembly/m_i_ptank/c_state(n) - - src.icon_state = text("prox-igniter-tank[]", n) - return - -/obj/item/assembly/m_i_ptank/HasProximity(atom/movable/AM as mob|obj) - if (istype(AM, /obj/effect/beam)) - return - if (AM.move_speed < 12 && src.part1) - src.part1.sense() - return - - -//*****RM -/obj/item/assembly/m_i_ptank/Bump(atom/O) - spawn(0) - //world << "miptank bumped into [O]" - if(src.part1.secured) - //world << "sending signal" - receive_signal() - else - //world << "not active" - ..() - -/obj/item/assembly/m_i_ptank/proc/prox_check() - if(!part1 || !part1.secured) - return - for(var/atom/A in view(1, src.loc)) - if(A!=src && !istype(A, /turf/space) && !isarea(A)) - //world << "[A]:[A.type] was sensed" - src.part1.sense() - break - - spawn(10) - prox_check() - - -//***** - - -/obj/item/assembly/m_i_ptank/dropped() - - spawn( 0 ) - part1.sense() - return - return - -/obj/item/assembly/m_i_ptank/examine(mob/user) - ..(user) - part3.examine(user) - -/obj/item/assembly/m_i_ptank/Del() - - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - //src.part3 = null - del(src.part3) - ..() - return - -/obj/item/assembly/m_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if (istype(W, /obj/item/device/analyzer)) - src.part3.attackby(W, user) - return - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/obj/item/assembly/prox_ignite/R = new(get_turf(src.loc)) - R.part1 = src.part1 - R.part1.master = R - R.part1.loc = R - R.part2 = src.part2 - R.part2.master = R - R.part2.loc = R - if (user.get_inactive_hand()==src) - user.put_in_inactive_hand(part3) - else - part3.loc = src.loc - src.part1 = null - src.part2 = null - src.part3 = null - del(src) - return - if (!( istype(W, /obj/item/weapon/weldingtool)&&W:welding )) - return - if (!( src.status )) - src.status = 1 - bombers += "[key_name(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]" - message_admins("[key_name_admin(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]") - user.show_message("\blue A pressure hole has been bored to the phoron tank valve. The phoron tank can now be ignited.", 1) - else - src.status = 0 - bombers += "[key_name(user)] unwelded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]" - user << "\blue The hole has been closed." - src.part2.secured = src.status - src.add_fingerprint(user) - return - -/obj/item/assembly/m_i_ptank/attack_self(mob/user as mob) - - playsound(src.loc, 'sound/weapons/armbomb.ogg', 100, 1) - src.part1.attack_self(user, 1) - src.add_fingerprint(user) - return - -/obj/item/assembly/m_i_ptank/receive_signal() - //world << "miptank [src] got signal" - for(var/mob/O in hearers(1, null)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - //Foreach goto(19) - - if ((src.status && prob(90))) - //world << "sent ignite() to [src.part3]" - src.part3.ignite() - else - if(!src.status) - src.part3.release() - src.part1.secured = 0.0 - - return - -/obj/item/assembly/m_i_ptank/emp_act(severity) - - if(istype(part3,/obj/item/weapon/tank/phoron) && prob(100/severity)) - part3.ignite() - ..() - -//*****RM - -/obj/item/assembly/t_i_ptank/c_state(n) - - src.icon_state = text("timer-igniter-tank[]", n) - return - -/obj/item/assembly/t_i_ptank/examine(mob/user) - ..(user) - src.part3.examine(user) - -/obj/item/assembly/t_i_ptank/Del() - - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - //src.part3 = null - del(src.part3) - ..() - return - -/obj/item/assembly/t_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - - if (istype(W, /obj/item/device/analyzer)) - src.part3.attackby(W, user) - return - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/obj/item/assembly/time_ignite/R = new(get_turf(src.loc)) - R.part1 = src.part1 - R.part1.master = R - R.part1.loc = R - R.part2 = src.part2 - R.part2.master = R - R.part2.loc = R - if (user.get_inactive_hand()==src) - user.put_in_inactive_hand(part3) - else - part3.loc = src.loc - src.part1 = null - src.part2 = null - src.part3 = null - del(src) - return - if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding)) - return - if (!( src.status )) - src.status = 1 - bombers += "[key_name(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]" - message_admins("[key_name_admin(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]") - user.show_message("\blue A pressure hole has been bored to the phoron tank valve. The phoron tank can now be ignited.", 1) - else - if(src) - src.status = 0 - bombers += "[key_name(user)] unwelded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]" - user << "\blue The hole has been closed." - src.part2.secured = src.status - src.add_fingerprint(user) - return - -/obj/item/assembly/t_i_ptank/attack_self(mob/user as mob) - - src.part1.attack_self(user, 1) - playsound(src.loc, 'sound/weapons/armbomb.ogg', 100, 1) - src.add_fingerprint(user) - return - -/obj/item/assembly/t_i_ptank/receive_signal() - //world << "tiptank [src] got signal" - for(var/mob/O in hearers(1, null)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - //Foreach goto(19) - if ((src.status && prob(90))) - //world << "sent ignite() to [src.part3]" - src.part3.ignite() - else - if(!src.status) - src.part3.release() - return - -/obj/item/assembly/t_i_ptank/emp_act(severity) - if(istype(part3,/obj/item/weapon/tank/phoron) && prob(100/severity)) - part3.ignite() - ..() - -/obj/item/assembly/r_i_ptank/examine(mob/user) - ..(user) - src.part3.examine(user) - -/obj/item/assembly/r_i_ptank/Del() - - //src.part1 = null - del(src.part1) - //src.part2 = null - del(src.part2) - //src.part3 = null - del(src.part3) - ..() - return - -/obj/item/assembly/r_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - - if (istype(W, /obj/item/device/analyzer)) - src.part3.attackby(W, user) - return - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/obj/item/assembly/rad_ignite/R = new(get_turf(src.loc)) - R.part1 = src.part1 - R.part1.master = R - R.part1.loc = R - R.part2 = src.part2 - R.part2.master = R - R.part2.loc = R - if (user.get_inactive_hand()==src) - user.put_in_inactive_hand(part3) - else - part3.loc = src.loc - src.part1 = null - src.part2 = null - src.part3 = null - del(src) - return - if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding )) - return - if (!( src.status )) - src.status = 1 - bombers += "[key_name(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]" - message_admins("[key_name_admin(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]") - user.show_message("\blue A pressure hole has been bored to the phoron tank valve. The phoron tank can now be ignited.", 1) - else - src.status = 0 - bombers += "[key_name(user)] unwelded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]" - user << "\blue The hole has been closed." - src.part2.secured = src.status - src.part1.b_stat = !( src.status ) - src.add_fingerprint(user) - return - -/obj/item/assembly/r_i_ptank/emp_act(severity) - if(istype(part3,/obj/item/weapon/tank/phoron) && prob(100/severity)) - part3.ignite() - ..() - - -/obj/item/clothing/suit/armor/a_i_a_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if (istype(W, /obj/item/device/analyzer)) - src.part4.attackby(W, user) - return - if ((istype(W, /obj/item/weapon/wrench) && !( src.status ))) - var/obj/item/assembly/a_i_a/R = new(get_turf(src.loc)) - R.part1 = src.part1 - R.part1.master = R - R.part1.loc = R - R.part2 = src.part2 - R.part2.master = R - R.part2.loc = R - R.part3 = src.part3 - R.part3.master = R - R.part3.loc = R - if (user.get_inactive_hand()==src) - user.put_in_inactive_hand(part4) - else - part4.loc = src.loc - src.part1 = null - src.part2 = null - src.part3 = null - src.part4 = null - del(src) - return - if (( istype(W, /obj/item/weapon/weldingtool) && W:welding)) - return - if (!( src.status )) - src.status = 1 - bombers += "[key_name(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]" - message_admins("[key_name_admin(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]") - user.show_message("\blue A pressure hole has been bored to the phoron tank valve. The phoron tank can now be ignited.", 1) - else - src.status = 0 - bombers += "[key_name(user)] unwelded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]" - user << "\blue The hole has been closed." -// src.part3.status = src.status - src.add_fingerprint(user) - return - -/obj/item/assembly/r_i_ptank/attack_self(mob/user as mob) - playsound(src.loc, 'sound/weapons/armbomb.ogg', 100, 1) - src.part1.attack_self(user, 1) - src.add_fingerprint(user) - return - -/obj/item/assembly/r_i_ptank/receive_signal() - //world << "riptank [src] got signal" - for(var/mob/O in hearers(1, null)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - //Foreach goto(19) - if ((src.status && prob(90))) - //world << "sent ignite() to [src.part3]" - src.part3.ignite() - else - if(!src.status) - src.part3.release() - return - - -//*****RM \ No newline at end of file diff --git a/code/unused/asteroiddevice.dm b/code/unused/asteroiddevice.dm deleted file mode 100644 index 57a5747cfe..0000000000 --- a/code/unused/asteroiddevice.dm +++ /dev/null @@ -1,105 +0,0 @@ -/obj/item/device/gps - name = "GPS" - icon = 'icons/obj/device.dmi' - icon_state = "pinoff" - flags = FPRINT | TABLEPASS| CONDUCT - slot_flags = SLOT_BELT - w_class = 2.0 - item_state = "electronic" - throw_speed = 4 - throw_range = 20 - m_amt = 500 - var/obj/effect/ship_landing_beacon/beacon = null - var/active = 0 - - attack_self() - if(!active) - active = 1 - work() - usr << "\blue You activate the GPS" - else - active = 0 - icon_state = "pinoff" - usr << "\blue You deactivate the GPS" - - proc/work() - while(active) - if(!beacon) - for(var/obj/effect/ship_landing_beacon/B in world) - if(B.name == "Beacon - SS13") - beacon = B - break - - if(!beacon) - usr << "\red Unable to detect beacon signal." - active = 0 - icon_state = "pinonnull" - return - - if(!istype(src.loc, /turf) && !istype(src.loc, /mob)) - usr << "\red Too much interference. Please hold the device in hand or place it on belt." - active = 0 - icon_state = "pinonnull" - return - - src.icon_state = "pinonfar" - - var/atom/cur_loc = src.loc - - if(cur_loc.z == beacon.z) - src.set_dir(get_dir(cur_loc,beacon)) - else - var/list/beacon_global_loc = beacon.get_global_map_pos() - var/list/src_global_loc = cur_loc.get_global_map_pos() - if(beacon_global_loc && src_global_loc) - var/hor_dir = 0 - var/ver_dir = 0 - if(beacon_global_loc["x"]>src_global_loc["x"]) - hor_dir = EAST - else if(beacon_global_loc["x"]src_global_loc["y"]) - ver_dir = NORTH - else if(beacon_global_loc["y"]Authorize command, sometimes the server will hiccup and not correctly authorize." - src << "\blue[no_auth_motd]" - src.authenticating = 0 -*/ - -/* The old goon auth/beta code is here -/client/proc/beta_tester_auth() - set name = "Tester?" - /*if(istester(src)) - src << "\blue Key accepted as beta tester" - else - src << "\redKey not accepted as beta tester. You may only observe the rounds. */ - -/client/proc/goonauth() - set name = "Goon?" - - if (src.authenticating) - return - - if(isgoon(src)) - src.goon = goon_keylist[src.ckey] - src.verbs -= /client/proc/goonauth - src << "Key authorized: Hello [goon_keylist[src.ckey]]!" - src << "\blue[auth_motd]" - return - - if (config.enable_authentication) //so that this verb isn't used when its goon only - if(src.authenticated && src.authenticated != 1) - src.goon = src.authenticated - src.verbs -= /client/proc/goonauth - src << "Key authorized: Hello [src.goon]!" - src << "\blue[auth_motd]" - else - src << "Please authorize first" - return - - src.authenticating = 1 - - spawn (rand(4, 18)) - var/result = world.Export("http://byond.lljk.net/status/?key=[src.ckey]") - var/success = 0 - - if(lowertext(result["STATUS"]) == "200 ok") - var/content = file2text(result["CONTENT"]) - - var/pos = findtext(content, " ") - var/code - var/account = "" - - if (!pos) - code = lowertext(content) - else - code = lowertext(copytext(content, 1, pos)) - account = copytext(content, pos + 1) - - if (code == "ok" && account) - src.verbs -= /client/proc/goonauth - src.goon = account - src << "Key authorized: Hello [html_encode(account)]!" - src << "\blue[auth_motd]" - success = 1 - goon_key(src.ckey, account) - - if (!success) - src.verbs += /client/proc/goonauth - //src << "Failed" - src << "\blue[no_auth_motd]" - - src.authenticating = 0 - -var/goon_keylist[0] -var/list/beta_tester_keylist - -/proc/beta_tester_loadfile() - beta_tester_keylist = new/list() - var/text = file2text("config/testers.txt") - if (!text) - diary << "Failed to load config/testers.txt\n" - else - var/list/lines = dd_text2list(text, "\n") - for(var/line in lines) - if (!line) - continue - - var/tester_key = copytext(line, 1, 0) - beta_tester_keylist.Add(tester_key) - - -/proc/goon_loadfile() - var/savefile/S=new("data/goon.goon") - S["key[0]"] >> goon_keylist - log_admin("Loading goon_keylist") - if (!length(goon_keylist)) - goon_keylist=list() - log_admin("goon_keylist was empty") - -/proc/goon_savefile() - var/savefile/S=new("data/goon.goon") - S["key[0]"] << goon_keylist - -/proc/goon_key(key as text,account as text) - var/ckey=ckey(key) - if (!goon_keylist.Find(ckey)) - goon_keylist.Add(ckey) - goon_keylist[ckey] = account - goon_savefile() - -/proc/isgoon(X) - if (istype(X,/mob)) X=X:ckey - if (istype(X,/client)) X=X:ckey - if ((ckey(X) in goon_keylist)) return 1 - else return 0 - -/proc/istester(X) - if (istype(X,/mob)) X=X:ckey - if (istype(X,/client)) X=X:ckey - if ((ckey(X) in beta_tester_keylist)) return 1 - else return 0 - -/proc/remove_goon(key as text) - var/ckey=ckey(key) - if (key && goon_keylist.Find(ckey)) - goon_keylist.Remove(ckey) - goon_savefile() - return 1 - return 0 -*/ \ No newline at end of file diff --git a/code/unused/beast/beast.dm b/code/unused/beast/beast.dm deleted file mode 100644 index aa01627153..0000000000 --- a/code/unused/beast/beast.dm +++ /dev/null @@ -1 +0,0 @@ -mob/living/carbon/beast \ No newline at end of file diff --git a/code/unused/beast/bodypart.dm b/code/unused/beast/bodypart.dm deleted file mode 100644 index 5f97031706..0000000000 --- a/code/unused/beast/bodypart.dm +++ /dev/null @@ -1,16 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -datum/bodypart - var/name = "unidentified bodypart" - var/health = 50 - -datum/bodypart/body - health = 100 - -datum/bodypart/head - health = 30 - -datum/bodypart/limb - -datum/bodypart/tail - health = 15 diff --git a/code/unused/beast/death.dm b/code/unused/beast/death.dm deleted file mode 100644 index 271f72beb2..0000000000 --- a/code/unused/beast/death.dm +++ /dev/null @@ -1,13 +0,0 @@ -/* -var/mob/dead/phantasm/P = new (src.loc) -for(var/obj/O in src.contents) // Where src is a mob - if(istype(O, /obj/item)) // Only remember carried items (sanity checking, mostly) - src.u_equip(O) // Unequip the item if we're wearing it - if (src.client) - src.client.screen -= O // Clear out any overlays the item added, notably in the equip windows - O.loc = src.loc // Honestly not sure if these two steps are necessary - O.dropped(src) // but they seem to occur everywhere else in the code, so we're not taking any chances. - O.layer = initial(O.layer) - O.loc = P // Add the item to the phantasm's inventory -src.Death(0) -*/ \ No newline at end of file diff --git a/code/unused/blender.dm b/code/unused/blender.dm deleted file mode 100644 index b76b74cf59..0000000000 --- a/code/unused/blender.dm +++ /dev/null @@ -1,156 +0,0 @@ -/* -This is a kitchen appliance to go along with the processor and the microwave. The Blender is for food items that are mixes or purees. -Currently, the end products of the blender are not compatable with the microwave but I hope to fix that eventually. - -Summary of Blender Code: It's basically a large reagent container and, like any other container, reactions can occur in it. However, -unlike a normal container, if you stick certain kinds of "blendable" items (ie. many food products), it'll convert the food item from -an object (which you can pick up and eat) into a reagent (which you can pour and drink). Containers with reagents in it can be poured -directly into the blender. Other food items will be converted into reagents by the blender. When deciding whether should be made with -the blender or the processor: Processor items are solid objects and Blender results are reagents. -*/ - -/obj/machinery/blender - name = "Blender" - desc = "A kitchen appliance used to blend stuff." - icon = 'icons/obj/kitchen.dmi' - icon_state = "blender_e" - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 5 - active_power_usage = 50 - flags = OPENCONTAINER //So that you can pour stuff into it. - var/processing = 0 //This turns on (1) while it is processing so you don't accidentally get multiples from the same item. - var/container = 1 //Is there a jug attached? Could have been done with a for loop but it's less code this way. - - New() - var/datum/reagents/R = new/datum/reagents(100) //Its large since you only get one. - reagents = R - R.my_atom = src - src.contents += new /obj/item/weapon/reagent_containers/glass/blender_jug(src) - src.container = "/obj/item/weapon/reagent_containers/glass/blender_jug" //Loads a jug into the blender. - - on_reagent_change() //When the reagents change, change the icon as well. - update_icon() - - - update_icon() //Changes the icon depending on how full it is and whether it has the jug attached. - if(src.container) - switch(src.reagents.total_volume) - if(0) - src.icon_state = "blender_e" //Empty - if(1 to 75) - src.icon_state = "blender_h" //Some but not full - if(76 to 100) - src.icon_state = "blender_f" //Mostly full. - else - src.icon_state = "blender_d" //No jug. Should be redundant but just in case. - return - -/obj/machinery/blender/attackby(var/obj/item/O as obj, var/mob/user as mob) //Attack it with an object. - if(src.contents.len >= 10 || src.reagents.total_volume >= 80) //Too full. Max 10 items or 80 units of reagent - user << "Too many items are already in the blending chamber." - else if(istype(O, /obj/item/weapon/reagent_containers/glass/blender_jug) && src.container == 0) //Load jug. - O.reagents.trans_to(src, O.reagents.total_volume) - del(O) - src.contents += new /obj/item/weapon/reagent_containers/glass/blender_jug(src) - //user.drop_item() - //O.loc = src - src.container = 1 - src.flags = OPENCONTAINER - src.update_icon() - else if(src.container == 0) //No jug to load in to. - user << "There is no container to put [O] in to!" - else - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) //Will only blend food items. Add others in this else clause. - user.drop_item() - O.loc = src - user << "You drop the [O] into the blender." - else if (istype(O, /obj/item/weapon/plantbag)) //Allows plant bags to empty into the blender. - for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) - O.contents -= G - G.loc = src - if(src.contents.len >= 10 || src.reagents.total_volume >= 80) //Sanity checking so the blender doesn't overfill - user << "You fill the blender to the brim." - break - if(src.contents.len < 10 && src.reagents.total_volume < 80) - user << "You empty the plant bag into the blender." - else - user << "That probably won't blend." - return 0 - - -/obj/machinery/blender/verb/blend() //Blend shit. Note: In the actual blending loop, make sure it can't include the jug. - set category = "Object" - set name = "Turn Blender On" - set src in oview(1) // Otherwise, it'll try to blend it too. - if (usr.stat != 0) - return - if (src.stat != 0) //NOPOWER etc - return - if(src.processing) - usr << "\red The blender is in the process of blending." - return - if(!src.container) - usr << "\red The blender doesn't have an attached container!" - return - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) - src.processing = 1 - usr << "\blue You turn on the blender." - use_power(250) - for(var/obj/O in src.contents) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans)) // Mass balance law - src.reagents.add_reagent("soymilk", O.reagents.get_reagent_amount("nutriment")) - O.reagents.del_reagent("nutriment") - else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)) // Mass balance law - src.reagents.add_reagent("ketchup", O.reagents.get_reagent_amount("nutriment")) - O.reagents.del_reagent("nutriment") - else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/corn)) // Mass balance law - src.reagents.add_reagent("cornoil", O.reagents.get_reagent_amount("nutriment")) - O.reagents.del_reagent("nutriment") - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) //This is intentionally not an "else if" - O.reagents.trans_to(src, O.reagents.total_volume) //Think of it as the "pulp" leftover. - del(O) - src.processing = 0 - usr << "The contents of the blender have been blended." - return - -/obj/machinery/blender/verb/detach() //Transfers the contents of the Blender to the Blender Jug and then ejects the jug. - set category = "Object" - set name = "Detach Blender Jug" - set src in oview(1) - if (usr.stat != 0) - return - if(src.processing) - usr << "The blender is in the process of blending." - else if(!src.container) - usr << "There is nothing to detach!" - else - for(var/obj/O in src.contents) //Searches through the contents for the jug. - if(istype(O, /obj/item/weapon/reagent_containers/glass/blender_jug)) - O.loc = get_turf(src) - src.reagents.trans_to(O, src.reagents.total_volume) - O = null - src.flags = null - src.icon_state = "blender_d" - usr << "You detatch the blending jug." - src.container = 0 - return - -/obj/machinery/blender/verb/eject() //Ejects the non-reagent contents of the blender besides the jug. - set category = "Object" - set name = "Empty Blender Jug" - set src in oview(1) - if (usr.stat != 0) - return - if(src.processing) - usr << "The blender is in the process of blending." - else if(!src.container) - usr << "There is nothing to eject!" - else - for(var/obj/O in src.contents) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) - O.loc = get_turf(src) - O = null - return - diff --git a/code/unused/carpetsplosion.dm b/code/unused/carpetsplosion.dm deleted file mode 100644 index 01e0e75757..0000000000 --- a/code/unused/carpetsplosion.dm +++ /dev/null @@ -1,83 +0,0 @@ -/proc/carpetsplosion(turf/location as turf,range = 10) - var/obj/effect/spreader/spreadEpicentre = new /obj/effect/spreader(location,range) - var/list/turf/spreadTurfs = list() - - sleep(5) - - for(var/obj/effect/spreader/spread in spreadEpicentre.spreadList) - spreadTurfs += get_turf(spread) - - del(spreadEpicentre) - return - -//DEBUG START -/obj/carpetnade - New() - ..() - carpetsplosion(loc) - -//DEBUG END - -/obj/effect/spreader - var/list/obj/effect/spreader/spreadList = list() - -/obj/effect/spreader/Del() - for(var/obj/effect/spreader/spread in spreadList) - if(spread != src) - del(spread) - ..() - -/obj/effect/spreader/New(location,var/amount = 1,obj/effects/spreader/source = src) //just a copypaste job from foam - if(amount <= 0) - del(src) - return - else - ..() - - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(!T) - continue - - if(!T.Enter(src)) - continue - - var/obj/effect/spreader/S = locate() in T - if(S) - continue - - new /obj/effect/spreader(T,amount-1,source) - - source.spreadList += src - -/* -/obj/effect/foam/proc/process() - if(--amount < 0) - return - - - while(expand) // keep trying to expand while true - - for(var/direction in cardinal) - - - var/turf/T = get_step(src,direction) - if(!T) - continue - - if(!T.Enter(src)) - continue - - var/obj/effect/foam/F = locate() in T - if(F) - continue - - F = new(T, metal) - F.amount = amount - if(!metal) - F.create_reagents(10) - if (reagents) - for(var/datum/reagent/R in reagents.reagent_list) - F.reagents.add_reagent(R.id,1) - sleep(15) -*/ \ No newline at end of file diff --git a/code/unused/computer2/airlock_control.dm b/code/unused/computer2/airlock_control.dm deleted file mode 100644 index e14dca1e63..0000000000 --- a/code/unused/computer2/airlock_control.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/computer/file/computer_program/airlock_control - name = "Airlock Master" - size = 16.0 - id_tag = "TAG" - - - return_text() - if(..()) - return - - var/dat = "Close | " - dat += "Quit" - - /* - dat += "
    Frequency: " - dat += "-- " - dat += "- " - dat += "[format_frequency(src.master.frequency)] " - dat += "+ " - dat += "++" - dat += "
    " - */ - - - dat += "
    ID:[src.id_tag]
    " - - dat += "Cycle" - - - dat += "
" - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["set_tag"]) - var/t = input(usr, "Please enter new tag", src.id_tag, null) as text - t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) - if (!t) - return - if (!in_range(src.master, usr)) - return - - src.id_tag = t - -// if(href_list["adj_freq"]) -// var/new_frequency = (src.master.frequency + text2num(href_list["adj_freq"])) -// src.master.set_frequency(new_frequency) - - if(href_list["send_command"]) - var/datum/signal/signal = new - signal.data["tag"] = id_tag - signal.data["command"] = href_list["send_command"] - peripheral_command("send signal", signal) - - src.master.add_fingerprint(usr) - src.master.updateUsrDialog() - return \ No newline at end of file diff --git a/code/unused/computer2/arcade.dm b/code/unused/computer2/arcade.dm deleted file mode 100644 index 679e2bd4a4..0000000000 --- a/code/unused/computer2/arcade.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/computer/file/computer_program/arcade - name = "Arcade 500" - size = 8.0 - var/enemy_name = "Space Villian" - var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc - var/player_hp = 30 //Player health/attack points - var/player_mp = 10 - var/enemy_hp = 45 //Enemy health/attack points - var/enemy_mp = 20 - var/gameover = 0 - var/blocked = 0 //Player cannot attack/heal while set - - New(obj/holding as obj) - if(holding) - src.holder = holding - - if(istype(src.holder.loc,/obj/machinery/computer2)) - src.master = src.holder.loc - -// var/name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ") - - var/name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Evil ", "the Dread King ", "the Space ", "Lord ") - var/name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon") - - src.enemy_name = replacetext((name_part1 + name_part2), "the ", "") -// src.name = (name_action + name_part1 + name_part2) - - - -/datum/computer/file/computer_program/arcade/return_text() - if(..()) - return - - var/dat = "Close | " - dat += "Quit" - - dat += "

[src.enemy_name]

" - - dat += "

[src.temp]

" - dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]
" - - if (src.gameover) - dat += "
New Game" - else - dat += "
Attack | " - dat += "Heal | " - dat += "Recharge Power" - - dat += "
" - - return dat - -/datum/computer/file/computer_program/arcade/Topic(href, href_list) - if(..()) - return - - if (!src.blocked) - if (href_list["attack"]) - src.blocked = 1 - var/attackamt = rand(2,6) - src.temp = "You attack for [attackamt] damage!" - src.master.updateUsrDialog() - - sleep(10) - src.enemy_hp -= attackamt - src.arcade_action() - - else if (href_list["heal"]) - src.blocked = 1 - var/pointamt = rand(1,3) - var/healamt = rand(6,8) - src.temp = "You use [pointamt] magic to heal for [healamt] damage!" - src.master.updateUsrDialog() - - sleep(10) - src.player_mp -= pointamt - src.player_hp += healamt - src.blocked = 1 - src.master.updateUsrDialog() - src.arcade_action() - - else if (href_list["charge"]) - src.blocked = 1 - var/chargeamt = rand(4,7) - src.temp = "You regain [chargeamt] points" - src.player_mp += chargeamt - - src.master.updateUsrDialog() - sleep(10) - src.arcade_action() - - if (href_list["newgame"]) //Reset everything - temp = "New Round" - player_hp = 30 - player_mp = 10 - enemy_hp = 45 - enemy_mp = 20 - gameover = 0 - - src.master.add_fingerprint(usr) - src.master.updateUsrDialog() - return - -/datum/computer/file/computer_program/arcade/proc/arcade_action() - if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0)) - src.gameover = 1 - src.temp = "[src.enemy_name] has fallen! Rejoice!" - src.peripheral_command("vend prize") - - else if ((src.enemy_mp <= 5) && (prob(70))) - var/stealamt = rand(2,3) - src.temp = "[src.enemy_name] steals [stealamt] of your power!" - src.player_mp -= stealamt - src.master.updateUsrDialog() - - if (src.player_mp <= 0) - src.gameover = 1 - sleep(10) - src.temp = "You have been drained! GAME OVER" - - else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) - src.temp = "[src.enemy_name] heals for 4 health!" - src.enemy_hp += 4 - src.enemy_mp -= 4 - - else - var/attackamt = rand(3,6) - src.temp = "[src.enemy_name] attacks for [attackamt] damage!" - src.player_hp -= attackamt - - if ((src.player_mp <= 0) || (src.player_hp <= 0)) - src.gameover = 1 - src.temp = "You have been crushed! GAME OVER" - - src.blocked = 0 - return \ No newline at end of file diff --git a/code/unused/computer2/base_program.dm b/code/unused/computer2/base_program.dm deleted file mode 100644 index b85923be77..0000000000 --- a/code/unused/computer2/base_program.dm +++ /dev/null @@ -1,263 +0,0 @@ -/datum/computer - var/size = 4.0 - var/obj/item/weapon/disk/data/holder = null - var/datum/computer/folder/holding_folder = null - folder - name = "Folder" - size = 0.0 - var/gen = 0 - Del() - for(var/datum/computer/F in src.contents) - del(F) - ..() - proc - add_file(datum/computer/R) - if(!holder || holder.read_only || !R) - return 0 - if(istype(R,/datum/computer/folder) && (src.gen>=10)) - return 0 - if((holder.file_used + R.size) <= holder.file_amount) - src.contents.Add(R) - R.holder = holder - R.holding_folder = src - src.holder.file_used -= src.size - src.size += R.size - src.holder.file_used += src.size - if(istype(R,/datum/computer/folder)) - R:gen = (src.gen+1) - return 1 - return 0 - - remove_file(datum/computer/R) - if(holder && !holder.read_only || !R) -// world << "Removing file [R]. File_used: [src.holder.file_used]" - src.contents.Remove(R) - src.holder.file_used -= src.size - src.size -= R.size - src.holder.file_used += src.size - src.holder.file_used = max(src.holder.file_used, 0) -// world << "Removed file [R]. File_used: [src.holder.file_used]" - return 1 - return 0 - file - name = "File" - var/extension = "FILE" //Differentiate between types of files, why not - proc - copy_file_to_folder(datum/computer/folder/newfolder) - if(!newfolder || (!istype(newfolder)) || (!newfolder.holder) || (newfolder.holder.read_only)) - return 0 - - if((newfolder.holder.file_used + src.size) <= newfolder.holder.file_amount) - var/datum/computer/file/newfile = new src.type - - for(var/V in src.vars) - if (issaved(src.vars[V]) && V != "holder") - newfile.vars[V] = src.vars[V] - - if(!newfolder.add_file(newfile)) - del(newfile) - - return 1 - - return 0 - - - Del() - if(holder && holding_folder) - holding_folder.remove_file(src) - ..() - - -/datum/computer/file/computer_program - name = "blank program" - extension = "PROG" - //var/size = 4.0 - //var/obj/item/weapon/disk/data/holder = null - var/obj/machinery/computer2/master = null - var/active_icon = null - var/id_tag = null - var/list/req_access = list() - - New(obj/holding as obj) - if(holding) - src.holder = holding - - if(istype(src.holder.loc,/obj/machinery/computer2)) - src.master = src.holder.loc - - Del() - if(master) - master.processing_programs.Remove(src) - ..() - - proc - return_text() - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(master.stat & (NOPOWER|BROKEN)) - return 1 - - if(!(holder in src.master.contents)) - //world << "Holder [holder] not in [master] of prg:[src]" - if(master.active_program == src) - master.active_program = null - return 1 - - if(!src.holder.root) - src.holder.root = new /datum/computer/folder - src.holder.root.holder = src - src.holder.root.name = "root" - - return 0 - - process() - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - master.processing_programs.Remove(src) - return 1 - - if(!src.holder.root) - src.holder.root = new /datum/computer/folder - src.holder.root.holder = src - src.holder.root.name = "root" - - return 0 - - receive_command(obj/source, command, datum/signal/signal) - if((!src.holder) || (!src.master) || (!source) || (source != src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(master.stat & (NOPOWER|BROKEN)) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - return 0 - - peripheral_command(command, datum/signal/signal) - if(master) - master.send_command(command, signal) - else - del(signal) - - transfer_holder(obj/item/weapon/disk/data/newholder,datum/computer/folder/newfolder) - - if((newholder.file_used + src.size) > newholder.file_amount) - return 0 - - if(!newholder.root) - newholder.root = new /datum/computer/folder - newholder.root.holder = newholder - newholder.root.name = "root" - - if(!newfolder) - newfolder = newholder.root - - if((src.holder && src.holder.read_only) || newholder.read_only) - return 0 - - if((src.holder) && (src.holder.root)) - src.holder.root.remove_file(src) - - newfolder.add_file(src) - - if(istype(newholder.loc,/obj/machinery/computer2)) - src.master = newholder.loc - - //world << "Setting [src.holder] to [newholder]" - src.holder = newholder - return 1 - - //Check access per program. - allowed(mob/M) - //check if it doesn't require any access at all - if(src.check_access(null)) - return 1 - if(istype(M, /mob/living/silicon)) - //AI can do whatever he wants - return 1 - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(src.check_access(H.equipped()) || src.check_access(H.wear_id)) - return 1 - else if(istype(M, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/george = M - //they can only hold things :( - if(george.equipped() && istype(george.equipped(), /obj/item/weapon/card/id) && src.check_access(george.equipped())) - return 1 - return 0 - - check_access(obj/item/weapon/card/id/I) - if(!src.req_access) //no requirements - return 1 - if(!istype(src.req_access, /list)) //something's very wrong - return 1 - - var/list/L = src.req_access - if(!L.len) //no requirements - return 1 - if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access - return 0 - for(var/req in src.req_access) - if(!(req in I.access)) //doesn't have this access - return 0 - return 1 - - Topic(href, href_list) - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(master.stat & (NOPOWER|BROKEN)) - return 1 - - if(src.master.active_program != src) - return 1 - - if ((!usr.contents.Find(src.master) && (!in_range(src.master, usr) || !istype(src.master.loc, /turf))) && (!istype(usr, /mob/living/silicon))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - usr.machine = src.master - - if (href_list["close"]) - usr.machine = null - usr << browse(null, "window=comp2") - return 0 - - if (href_list["quit"]) -// src.master.processing_programs.Remove(src) - if(src.master.host_program && src.master.host_program.holder && (src.master.host_program.holder in src.master.contents)) - src.master.run_program(src.master.host_program) - src.master.updateUsrDialog() - return 1 - else - src.master.active_program = null - src.master.updateUsrDialog() - return 1 - - return 0 \ No newline at end of file diff --git a/code/unused/computer2/buildandrepair.dm b/code/unused/computer2/buildandrepair.dm deleted file mode 100644 index 69e7b5fb82..0000000000 --- a/code/unused/computer2/buildandrepair.dm +++ /dev/null @@ -1,150 +0,0 @@ -//Motherboard is just used in assembly/disassembly, doesn't exist in the actual computer object. -/obj/item/weapon/motherboard - name = "Computer mainboard" - desc = "A computer motherboard." - icon = 'icons/obj/module.dmi' - icon_state = "mainboard" - item_state = "electronic" - w_class = 3 - var/created_name = null //If defined, result computer will have this name. - -/obj/computer2frame - density = 1 - anchored = 0 - name = "Computer-frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "0" - var/state = 0 - var/obj/item/weapon/motherboard/mainboard = null - var/obj/item/weapon/disk/data/fixed_disk/hd = null - var/list/peripherals = list() - var/created_icon_state = "aiupload" - -/obj/computer2frame/attackby(obj/item/P as obj, mob/user as mob) - switch(state) - if(0) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You wrench the frame into place." - src.anchored = 1 - src.state = 1 - if(istype(P, /obj/item/weapon/weldingtool)) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You deconstruct the frame." - new /obj/item/stack/sheet/metal( src.loc, 5 ) - del(src) - if(1) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You unfasten the frame." - src.anchored = 0 - src.state = 0 - if(istype(P, /obj/item/weapon/motherboard) && !mainboard) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the mainboard inside the frame." - src.icon_state = "1" - src.mainboard = P - user.drop_item() - P.loc = src - if(istype(P, /obj/item/weapon/screwdriver) && mainboard) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the mainboard into place." - src.state = 2 - src.icon_state = "2" - if(istype(P, /obj/item/weapon/crowbar) && mainboard) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the mainboard." - src.state = 1 - src.icon_state = "0" - mainboard.loc = src.loc - src.mainboard = null - if(2) - if(istype(P, /obj/item/weapon/screwdriver) && mainboard && (!peripherals.len)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the mainboard." - src.state = 1 - src.icon_state = "1" - - if(istype(P, /obj/item/weapon/peripheral)) - if(src.peripherals.len < 3) - user.drop_item() - src.peripherals.Add(P) - P.loc = src - user << "\blue You add [P] to the frame." - else - user << "\red There is no more room for peripheral cards." - - if(istype(P, /obj/item/weapon/crowbar) && src.peripherals.len) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the peripheral boards." - for(var/obj/item/weapon/peripheral/W in src.peripherals) - W.loc = src.loc - src.peripherals.Remove(W) - - if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - P:amount -= 5 - if(!P:amount) del(P) - user << "\blue You add cables to the frame." - src.state = 3 - src.icon_state = "3" - if(3) - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." - src.state = 2 - src.icon_state = "2" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 - if(src.hd) - src.hd.loc = src.loc - src.hd = null - - if(istype(P, /obj/item/weapon/disk/data/fixed_disk) && !src.hd) - user.drop_item() - src.hd = P - P.loc = src - user << "\blue You connect the drive to the cabling." - - if(istype(P, /obj/item/weapon/crowbar) && src.hd) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the hard drive." - src.hd.loc = src.loc - src.hd = null - - if(istype(P, /obj/item/stack/sheet/glass)) - if(P:amount >= 2) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - P:use(2) - user << "\blue You put in the glass panel." - src.state = 4 - src.icon_state = "4" - if(4) - if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." - src.state = 3 - src.icon_state = "3" - new /obj/item/stack/sheet/glass( src.loc, 2 ) - if(istype(P, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." - var/obj/machinery/computer2/C= new /obj/machinery/computer2( src.loc ) - C.setup_drive_size = 0 - C.icon_state = src.created_icon_state - if(mainboard.created_name) C.name = mainboard.created_name - del(mainboard) - if(hd) - C.hd = hd - hd.loc = C - for(var/obj/item/weapon/peripheral/W in src.peripherals) - W.loc = C - W.host = C - C.peripherals.Add(W) - del(src) \ No newline at end of file diff --git a/code/unused/computer2/computerII.dm b/code/unused/computer2/computerII.dm deleted file mode 100644 index 433853d682..0000000000 --- a/code/unused/computer2/computerII.dm +++ /dev/null @@ -1,414 +0,0 @@ - -/obj/machinery/computer2 - name = "computer" - desc = "A computer workstation." - icon = 'icons/obj/computer.dmi' - icon_state = "aiupload" - density = 1 - anchored = 1.0 - req_access = list() //This doesn't determine PROGRAM req access, just the access needed to install/delete programs. - var/base_icon_state = "aiupload" //Assembly creates a new computer2 and not a child typepath, so initial doesn't work!! - var/datum/radio_frequency/radio_connection - var/obj/item/weapon/disk/data/fixed_disk/hd = null - var/datum/computer/file/computer_program/active_program - var/datum/computer/file/computer_program/host_program //active is set to this when the normal active quits, if available - var/list/processing_programs = list() - var/obj/item/weapon/card/id/authid = null //For records computers etc - var/obj/item/weapon/card/id/auxid = null //For computers that need two ids for some reason. - var/obj/item/weapon/disk/data/diskette = null - var/list/peripherals = list() - //Setup for Starting program & peripherals - var/setup_starting_program = null //If set to a program path it will start with this one active. - var/setup_starting_peripheral = null //Spawn with radio card and whatever path is here. - var/setup_drive_size = 64.0 //How big is the drive (set to 0 for no drive) - var/setup_id_tag - var/setup_has_radio = 0 //Does it spawn with a radio peripheral? - var/setup_radio_tag - var/setup_frequency = 1411 - -/obj/item/weapon/disk/data - var/datum/computer/folder/root = null - var/file_amount = 32.0 - var/file_used = 0.0 - var/portable = 1 - var/title = "Data Disk" - New() - src.root = new /datum/computer/folder - src.root.holder = src - src.root.name = "root" - -/obj/item/weapon/disk/data/fixed_disk - name = "Storage Drive" - icon_state = "harddisk" - title = "Storage Drive" - file_amount = 80.0 - portable = 0 - - attack_self(mob/user as mob) - return - -/obj/item/weapon/disk/data/computer2test - name = "Programme Diskette" - file_amount = 128.0 - New() - ..() - src.root.add_file( new /datum/computer/file/computer_program/arcade(src)) - src.root.add_file( new /datum/computer/file/computer_program/med_data(src)) - src.root.add_file( new /datum/computer/file/computer_program/airlock_control(src)) - src.root.add_file( new /datum/computer/file/computer_program/messenger(src)) - src.root.add_file( new /datum/computer/file/computer_program/progman(src)) - -/obj/machinery/computer2/medical - name = "Medical computer" - icon_state = "dna" - setup_has_radio = 1 - setup_starting_program = /datum/computer/file/computer_program/med_data - setup_starting_peripheral = /obj/item/weapon/peripheral/printer - -/obj/machinery/computer2/arcade - name = "arcade machine" - icon_state = "arcade" - desc = "An arcade machine." - setup_drive_size = 16.0 - setup_starting_program = /datum/computer/file/computer_program/arcade - setup_starting_peripheral = /obj/item/weapon/peripheral/prize_vendor - - -/obj/machinery/computer2/New() - ..() - - spawn(4) - if(setup_has_radio) - var/obj/item/weapon/peripheral/radio/radio = new /obj/item/weapon/peripheral/radio(src) - radio.frequency = setup_frequency - radio.code = setup_radio_tag - - if(!hd && (setup_drive_size > 0)) - src.hd = new /obj/item/weapon/disk/data/fixed_disk(src) - src.hd.file_amount = src.setup_drive_size - - if(ispath(src.setup_starting_program)) - src.active_program = new src.setup_starting_program - src.active_program.id_tag = setup_id_tag - - src.hd.file_amount = max(src.hd.file_amount, src.active_program.size) - - src.active_program.transfer_holder(src.hd) - - if(ispath(src.setup_starting_peripheral)) - new src.setup_starting_peripheral(src) - - src.base_icon_state = src.icon_state - - return - -/obj/machinery/computer2/attack_hand(mob/user as mob) - if(..()) - return - - user.machine = src - - var/dat - if((src.active_program) && (src.active_program.master == src) && (src.active_program.holder in src)) - dat = src.active_program.return_text() - else - dat = "Thinktronic BIOS V1.4

" - - dat += "Current ID: [src.authid ? "[src.authid.name]" : "----------"]
" - dat += "Auxiliary ID: [src.auxid ? "[src.auxid.name]" : "----------"]

" - - var/progdat - if((src.hd) && (src.hd.root)) - for(var/datum/computer/file/computer_program/P in src.hd.root.contents) - progdat += "[P.name]Size: [P.size]" - - progdat += "Run" - - if(P in src.processing_programs) - progdat += "Halt" - else - progdat += "Load" - - progdat += "Del" - - continue - - dat += "Disk Space: \[[src.hd.file_used]/[src.hd.file_amount]\]
" - dat += "Programs on Fixed Disk:
" - - if(!progdat) - progdat = "No programs found.
" - dat += "
[progdat]
" - - else - - dat += "Programs on Fixed Disk:
" - dat += "
No fixed disk detected.

" - - dat += "
" - - progdat = null - if((src.diskette) && (src.diskette.root)) - - dat += "Eject
" - - for(var/datum/computer/file/computer_program/P in src.diskette.root.contents) - progdat += "[P.name]Size: [P.size]" - progdat += "Run" - - if(P in src.processing_programs) - progdat += "Halt" - else - progdat += "Load" - - progdat += "Install" - - continue - - dat += "Disk Space: \[[src.diskette.file_used]/[src.diskette.file_amount]\]
" - dat += "Programs on Disk:
" - - if(!progdat) - progdat = "No data found.
" - dat += "
[progdat]
" - - else - - dat += "Programs on Disk:
" - dat += "
No diskette loaded.

" - - dat += "
" - - user << browse(dat,"window=comp2") - onclose(user,"comp2") - return - -/obj/machinery/computer2/Topic(href, href_list) - if(..()) - return - - if(!src.active_program) - if((href_list["prog"]) && (href_list["function"])) - var/datum/computer/file/computer_program/newprog = locate(href_list["prog"]) - if(newprog && istype(newprog)) - switch(href_list["function"]) - if("run") - src.run_program(newprog) - if("load") - src.load_program(newprog) - if("unload") - src.unload_program(newprog) - if((href_list["file"]) && (href_list["function"])) - var/datum/computer/file/newfile = locate(href_list["file"]) - if(!newfile) - return - switch(href_list["function"]) - if("install") - if((src.hd) && (src.hd.root) && (src.allowed(usr))) - newfile.copy_file_to_folder(src.hd.root) - - if("delete") - if(src.allowed(usr)) - src.delete_file(newfile) - - //If there is already one loaded eject, or if not and they have one insert it. - if (href_list["id"]) - switch(href_list["id"]) - if("auth") - if(!isnull(src.authid)) - src.authid.loc = get_turf(src) - src.authid = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() - I.loc = src - src.authid = I - if("aux") - if(!isnull(src.auxid)) - src.auxid.loc = get_turf(src) - src.auxid = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() - I.loc = src - src.auxid = I - - //Same but for a data disk - else if (href_list["disk"]) - if(!isnull(src.diskette)) - src.diskette.loc = get_turf(src) - src.diskette = null -/* else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/disk/data)) - usr.drop_item() - I.loc = src - src.diskette = I -*/ - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer2/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(250) - - for(var/datum/computer/file/computer_program/P in src.processing_programs) - P.process() - - return - -/obj/machinery/computer2/power_change() - if(stat & BROKEN) - icon_state = src.base_icon_state - src.icon_state += "b" - - else if(powered()) - icon_state = src.base_icon_state - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - icon_state = src.base_icon_state - src.icon_state += "0" - stat |= NOPOWER - - -/obj/machinery/computer2/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES - if ((!src.diskette) && W:portable) - user.machine = src - user.drop_item() - W.loc = src - src.diskette = W - user << "You insert [W]." - src.updateUsrDialog() - return - - else if (istype(W, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/computer2frame/A = new /obj/computer2frame( src.loc ) - A.created_icon_state = src.base_icon_state - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - new /obj/item/weapon/shard( src.loc ) - A.state = 3 - A.icon_state = "3" - else - user << "\blue You disconnect the monitor." - A.state = 4 - A.icon_state = "4" - - for (var/obj/item/weapon/peripheral/C in src.peripherals) - C.loc = A - A.peripherals.Add(C) - - if(src.diskette) - src.diskette.loc = src.loc - - //TO-DO: move card reading to peripheral cards instead - if(src.authid) - src.authid.loc = src.loc - - if(src.auxid) - src.auxid.loc = src.loc - - if(src.hd) - src.hd.loc = A - A.hd = src.hd - - A.mainboard = new /obj/item/weapon/motherboard(A) - A.mainboard.created_name = src.name - - - A.anchored = 1 - del(src) - - else - src.attack_hand(user) - return - -/obj/machinery/computer2/proc/send_command(command, datum/signal/signal) - for(var/obj/item/weapon/peripheral/P in src.peripherals) - P.receive_command(src, command, signal) - - del(signal) - -/obj/machinery/computer2/proc/receive_command(obj/source, command, datum/signal/signal) - if(source in src.contents) - - for(var/datum/computer/file/computer_program/P in src.processing_programs) - P.receive_command(src, command, signal) - - del(signal) - - return - - -/obj/machinery/computer2/proc/run_program(datum/computer/file/computer_program/program,datum/computer/file/computer_program/host) - if(!program) - return 0 - -// src.unload_program(src.active_program) - - if(src.load_program(program)) - if(host && istype(host)) - src.host_program = host - else - src.host_program = null - - src.active_program = program - return 1 - - return 0 - -/obj/machinery/computer2/proc/load_program(datum/computer/file/computer_program/program) - if((!program) || (!program.holder)) - return 0 - - if(!(program.holder in src)) -// world << "Not in src" - program = new program.type - program.transfer_holder(src.hd) - - if(program.master != src) - program.master = src - - if(program in src.processing_programs) - return 1 - else - src.processing_programs.Add(program) - return 1 - - return 0 - -/obj/machinery/computer2/proc/unload_program(datum/computer/file/computer_program/program) - if((!program) || (!src.hd)) - return 0 - - if(program in src.processing_programs) - src.processing_programs.Remove(program) - return 1 - - return 0 - -/obj/machinery/computer2/proc/delete_file(datum/computer/file/file) - //world << "Deleting [file]..." - if((!file) || (!file.holder) || (file.holder.read_only)) - //world << "Cannot delete :(" - return 0 - - if(file in src.processing_programs) - src.processing_programs.Remove(file) - - if(src.active_program == file) - src.active_program = null - -// file.holder.root.remove_file(file) - - //world << "Now calling del on [file]..." - del(file) - return 1 \ No newline at end of file diff --git a/code/unused/computer2/filebrowse.dm b/code/unused/computer2/filebrowse.dm deleted file mode 100644 index 38c88f0616..0000000000 --- a/code/unused/computer2/filebrowse.dm +++ /dev/null @@ -1,164 +0,0 @@ -/datum/computer/file/computer_program/progman - name = "ProgManager" - size = 16.0 - var/datum/computer/folder/current_folder - var/mode = 0 - var/datum/computer/file/clipboard - - - return_text() - if(..()) - return - - if((!src.current_folder) || !(src.current_folder.holder in src.master)) - src.current_folder = src.holder.root - - var/dat = "Close | " - dat += "Quit" - - switch(mode) - if(0) - dat += " |Create Folder" - //dat += " | Create File" - dat += " | Paste" - dat += " | Root" - dat += " | Drive
" - - dat += "Contents of [current_folder] | Drive:\[[src.current_folder.holder.title]]
" - dat += "Used: \[[src.current_folder.holder.file_used]/[src.current_folder.holder.file_amount]\]
" - - dat += "" - for(var/datum/computer/P in current_folder.contents) - if(P == src) - dat += "" - continue - dat += "" - dat += "" - - dat += "" - - dat += "" - dat += "" - - - if(istype(P,/datum/computer/file)) - dat += "" - - dat += "" - - dat += "
SystemSize: [src.size]SYSTEM
[P.name]Size: [P.size][(istype(P,/datum/computer/folder)) ? "FOLDER" : "[P:extension]"]DelRenameCopy
" - - if(1) - dat += " | Main" - dat += " | Eject
" - - for(var/obj/item/weapon/disk/data/D in src.master) - if(D == current_folder.holder) - dat += "[D.name]
" - else - dat += "[D.title]
" - - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["create"]) - if(current_folder) - var/datum/computer/F = null - switch(href_list["create"]) - if("folder") - F = new /datum/computer/folder - if(!current_folder.add_file(F)) - //world << "Couldn't add folder :(" - del(F) - if("file") - F = new /datum/computer/file - if(!current_folder.add_file(F)) - //world << "Couldn't add file :(" - del(F) - - if(href_list["file"] && href_list["function"]) - var/datum/computer/F = locate(href_list["file"]) - if(!F || !istype(F)) - return - switch(href_list["function"]) - if("open") - if(istype(F,/datum/computer/folder)) - src.current_folder = F - else if(istype(F,/datum/computer/file/computer_program)) - src.master.run_program(F,src) - src.master.updateUsrDialog() - return - - if("delete") - src.master.delete_file(F) - - if("copy") - if(istype(F,/datum/computer/file) && (!F.holder || (F.holder in src.master.contents))) - src.clipboard = F - - if("paste") - if(istype(F,/datum/computer/folder)) - if(!src.clipboard || !src.clipboard.holder || !(src.clipboard.holder in src.master.contents)) - return - - if(!istype(src.clipboard)) - return - - src.clipboard.copy_file_to_folder(F) - - if("rename") - spawn(0) - var/t = input(usr, "Please enter new name", F.name, null) as text - t = copytext(sanitize(t), 1, 16) - if (!t) - return - if (!in_range(src.master, usr) || !(F.holder in src.master)) - return - if(F.holder.read_only) - return - F.name = capitalize(lowertext(t)) - src.master.updateUsrDialog() - return - - -/* - if(href_list["open"]) - var/datum/computer/F = locate(href_list["open"]) - if(!F || !istype(F)) - return - - if(istype(F,/datum/computer/folder)) - src.current_folder = F - else if(istype(F,/datum/computer/file/computer_program)) - src.master.run_program(F) - src.master.updateUsrDialog() - return - - if(href_list["delete"]) - var/datum/computer/F = locate(href_list["delete"]) - if(!F || !istype(F)) - return - - src.master.delete_file(F) -*/ - if(href_list["top_folder"]) - src.current_folder = src.current_folder.holder.root - - if(href_list["mode"]) - var/newmode = text2num(href_list["mode"]) - newmode = max(newmode,0) - src.mode = newmode - - if(href_list["drive"]) - var/obj/item/weapon/disk/data/D = locate(href_list["drive"]) - if(D && istype(D) && D.root) - current_folder = D.root - src.mode = 0 - - src.master.add_fingerprint(usr) - src.master.updateUsrDialog() - return \ No newline at end of file diff --git a/code/unused/computer2/med_rec.dm b/code/unused/computer2/med_rec.dm deleted file mode 100644 index 92e42e19e1..0000000000 --- a/code/unused/computer2/med_rec.dm +++ /dev/null @@ -1,463 +0,0 @@ -/datum/computer/file/computer_program/med_data - name = "Medical Records" - size = 32.0 - active_icon = "dna" - req_access = list(ACCESS_MEDICAL) - var/authenticated = null - var/rank = null - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/a_id = null - var/temp = null - -/datum/computer/file/computer_program/med_data/return_text() - if(..()) - return - var/dat - if (src.temp) - dat = text("[src.temp]

Clear Screen") - else - dat = text("Confirm Identity: []
", master, (src.master.authid ? text("[]", src.master.authid.name) : "----------")) - if (src.authenticated) - switch(src.screen) - if(1.0) - dat += {" -Search Records -
List Records -
-
Virus Database -
Medbot Tracking -
-
Record Maintenance -
{Log Out}
-"} - if(2.0) - dat += "Record List:
" - for(var/datum/data/record/R in data_core.general) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //Foreach goto(132) - dat += text("
Back", src) - if(3.0) - dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) - if(4.0) - dat += "
Medical Record

" - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) - dat += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src, src.active1.fields["sex"], src, src.active1.fields["age"], src, src.active1.fields["fingerprint"], src, src.active1.fields["p_stat"], src, src.active1.fields["m_stat"]) - else - dat += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) - dat += text("
\n
Medical Data

\nBlood Type: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src, src.active2.fields["b_type"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, src.active2.fields["notes"]) - var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - dat += text("[]
Delete Entry

", src.active2.fields[text("com_[]", counter)], src, counter) - counter++ - dat += text("Add Entry

", src) - dat += text("Delete Record (Medical Only)

", src) - else - dat += "Medical Record Lost!
" - dat += text("New Record

") - dat += text("\nPrint Record
\nBack
", src, src) - if(5.0) - dat += {"
Virus Database
-
GBS -
Common Cold -
Flu -
Jungle Fever -
Clowning Around -
Plasmatoid -
Space Rhinovirus -
Robot Transformation -
Back"} - if(6.0) - dat += "
Medical Robot Monitor
" - dat += "Back" - dat += "
Medical Robots:" - var/bdat = null - for(var/obj/machinery/bot/medbot/M in world) - var/turf/bl = get_turf(M) - bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"]
" - if(!isnull(M.reagent_glass)) - bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\]" - else - bdat += "Using Internal Synthesizer." - - if(!bdat) - dat += "
None detected
" - else - dat += "[bdat]" - - else - else - dat += text("{Log In}", src) - dat += "
{Quit}" - - return dat - -/datum/computer/file/computer_program/med_data/Topic(href, href_list) - if(..()) - return - if (!( data_core.general.Find(src.active1) )) - src.active1 = null - if (!( data_core.medical.Find(src.active2) )) - src.active2 = null - if (href_list["temp"]) - src.temp = null - else if (href_list["logout"]) - src.authenticated = null - src.screen = null - src.active1 = null - src.active2 = null - else if (href_list["login"]) - if (istype(usr, /mob/living/silicon)) - src.active1 = null - src.active2 = null - src.authenticated = 1 - src.rank = "AI" - src.screen = 1 - else if (istype(src.master.authid, /obj/item/weapon/card/id)) - src.active1 = null - src.active2 = null - if (src.check_access(src.master.authid)) - src.authenticated = src.master.authid.registered_name - src.rank = src.master.authid.assignment - src.screen = 1 - if (src.authenticated) - - if(href_list["screen"]) - src.screen = text2num(href_list["screen"]) - if(src.screen < 1) - src.screen = 1 - - src.active1 = null - src.active2 = null - - if(href_list["vir"]) - switch(href_list["vir"]) - if("gbs") - src.temp = {"Name: GBS -
Number of stages: 5 -
Spread: Airborne Transmission -
Possible Cure: Spaceacillin -
Affected Species: Human -
-
Notes: If left untreated death will occur. -
-
Severity: Major"} - if("cc") - src.temp = {"Name: Common Cold -
Number of stages: 3 -
Spread: Airborne Transmission -
Possible Cure: Rest -
Affected Species: Human -
-
Notes: If left untreated the subject will contract the flu. -
-
Severity: Minor"} - if("f") - src.temp = {"Name: The Flu -
Number of stages: 3 -
Spread: Airborne Transmission -
Possible Cure: Rest -
Affected Species: Human -
-
Notes: If left untreated the subject will feel quite unwell. -
-
Severity: Medium"} - if("jf") - src.temp = {"Name: Jungle Fever -
Number of stages: 1 -
Spread: Airborne Transmission -
Possible Cure: None -
Affected Species: Monkey -
-
Notes: monkeys with this disease will bite humans, causing humans to spontaneously to mutate into a monkey. -
-
Severity: Medium"} - if("ca") - src.temp = {"Name: Clowning Around -
Number of stages: 4 -
Spread: Airborne Transmission -
Possible Cure: Spaceacillin -
Affected Species: Human -
-
Notes: Subjects are affected by rampant honking and a fondness for shenanigans. They may also spontaneously phase through closed airlocks. -
-
Severity: Laughable"} - if("p") - src.temp = {"Name: Plasmatoid -
Number of stages: 3 -
Spread: Airborne Transmission -
Possible Cure: Inaprovaline -
Affected Species: Human and Monkey -
-
Notes: With this disease the victim will need phoron to breathe. -
-
Severity: Major"} - if("dna") - src.temp = {"Name: Space Rhinovirus -
Number of stages: 4 -
Spread: Airborne Transmission -
Possible Cure: Spaceacillin -
Affected Species: Human -
-
Notes: This disease transplants the genetic code of the intial vector into new hosts. -
-
Severity: Medium"} - if("bot") - src.temp = {"Name: Robot Transformation -
Number of stages: 5 -
Spread: Infected food -
Possible Cure: None -
Affected Species: Human -
-
Notes: This disease, actually acute nanomachine infection, converts the victim into a cyborg. -
-
Severity: Major"} - - if (href_list["del_all"]) - src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) - - if (href_list["del_all2"]) - for(var/datum/data/record/R in data_core.medical) - del(R) - src.temp = "All records deleted." - - if (href_list["field"]) - var/a1 = src.active1 - var/a2 = src.active2 - switch(href_list["field"]) - if("fingerprint") - if (istype(src.active1, /datum/data/record)) - var/t1 = input("Please input fingerprint hash:", "Med. records", src.active1.fields["id"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - src.active1.fields["fingerprint"] = t1 - if("sex") - if (istype(src.active1, /datum/data/record)) - if (src.active1.fields["sex"] == "Male") - src.active1.fields["sex"] = "Female" - else - src.active1.fields["sex"] = "Male" - if("age") - if (istype(src.active1, /datum/data/record)) - var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - src.active1.fields["age"] = t1 - if("mi_dis") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["mi_dis"] = t1 - if("mi_dis_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["mi_dis_d"] = t1 - if("ma_dis") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["ma_dis"] = t1 - if("ma_dis_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["ma_dis_d"] = t1 - if("alg") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["alg"] = t1 - if("alg_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["alg_d"] = t1 - if("cdi") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["cdi"] = t1 - if("cdi_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["cdi_d"] = t1 - if("notes") - if (istype(src.active2, /datum/data/record)) - var/t1 = input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) as message - if ((!( t1 ) || !( src.authenticated ) || (!src.master) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["notes"] = t1 - if("p_stat") - if (istype(src.active1, /datum/data/record)) - src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
", src, src, src, src) - if("m_stat") - if (istype(src.active1, /datum/data/record)) - src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) - if("b_type") - if (istype(src.active2, /datum/data/record)) - src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) - else - - if (href_list["p_stat"]) - if (src.active1) - switch(href_list["p_stat"]) - if("deceased") - src.active1.fields["p_stat"] = "*Deceased*" - if("unconscious") - src.active1.fields["p_stat"] = "*Unconscious*" - if("active") - src.active1.fields["p_stat"] = "Active" - if("unfit") - src.active1.fields["p_stat"] = "Physically Unfit" - - if (href_list["m_stat"]) - if (src.active1) - switch(href_list["m_stat"]) - if("insane") - src.active1.fields["m_stat"] = "*Insane*" - if("unstable") - src.active1.fields["m_stat"] = "*Unstable*" - if("watch") - src.active1.fields["m_stat"] = "*Watch*" - if("stable") - src.active2.fields["m_stat"] = "Stable" - - - if (href_list["b_type"]) - if (src.active2) - switch(href_list["b_type"]) - if("an") - src.active2.fields["b_type"] = "A-" - if("bn") - src.active2.fields["b_type"] = "B-" - if("abn") - src.active2.fields["b_type"] = "AB-" - if("on") - src.active2.fields["b_type"] = "O-" - if("ap") - src.active2.fields["b_type"] = "A+" - if("bp") - src.active2.fields["b_type"] = "B+" - if("abp") - src.active2.fields["b_type"] = "AB+" - if("op") - src.active2.fields["b_type"] = "O+" - - - if (href_list["del_r"]) - if (src.active2) - src.temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" - - if (href_list["del_r2"]) - if (src.active2) - del(src.active2) - - if (href_list["d_rec"]) - var/datum/data/record/R = locate(href_list["d_rec"]) - var/datum/data/record/M = locate(href_list["d_rec"]) - if (!( data_core.general.Find(R) )) - src.temp = "Record Not Found!" - return - for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - else - //Foreach continue //goto(2540) - src.active1 = R - src.active2 = M - src.screen = 4 - - if (href_list["new"]) - if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) - var/datum/data/record/R = new /datum/data/record( ) - R.fields["name"] = src.active1.fields["name"] - R.fields["id"] = src.active1.fields["id"] - R.name = text("Medical Record #[]", R.fields["id"]) - R.fields["b_type"] = "Unknown" - R.fields["mi_dis"] = "None" - R.fields["mi_dis_d"] = "No minor disabilities have been declared." - R.fields["ma_dis"] = "None" - R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - R.fields["alg"] = "None" - R.fields["alg_d"] = "No allergies have been detected in this patient." - R.fields["cdi"] = "None" - R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - R.fields["notes"] = "No notes." - data_core.medical += R - src.active2 = R - src.screen = 4 - - if (href_list["add_c"]) - if (!( istype(src.active2, /datum/data/record) )) - return - var/a2 = src.active2 - var/t1 = input("Add Comment:", "Med. records", null, null) as message - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src.master, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - counter++ - src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2556
[]", src.authenticated, src.rank, time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1) - - if (href_list["del_c"]) - if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) - src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" - - if (href_list["search"]) - var/t1 = input("Search String: (Name or ID)", "Med. records", null, null) as text - if ((!( t1 ) || usr.stat || (!src.master) || !( src.authenticated ) || usr.restrained() || ((!in_range(src.master, usr)) && (!istype(usr, /mob/living/silicon))))) - return - src.active1 = null - src.active2 = null - t1 = lowertext(t1) - for(var/datum/data/record/R in data_core.general) - if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) - src.active1 = R - else - - if (!( src.active1 )) - src.temp = text("Could not locate record [].", t1) - else - for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == src.active1.fields["name"] || E.fields["id"] == src.active1.fields["id"])) - src.active2 = E - else - - src.screen = 4 - - if (href_list["print_p"]) - var/info = "
Medical Record

" - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) - info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"]) - else - info += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) - info += text("
\n
Medical Data

\nBlood Type: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src.active2.fields["b_type"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"]) - var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - info += text("[]
", src.active2.fields[text("com_[]", counter)]) - counter++ - else - info += "Medical Record Lost!
" - info += "" - - var/datum/signal/signal = new - signal.data["data"] = info - signal.data["title"] = "Medical Record" - src.peripheral_command("print",signal) - - src.master.add_fingerprint(usr) - src.master.updateUsrDialog() - return \ No newline at end of file diff --git a/code/unused/computer2/messenger.dm b/code/unused/computer2/messenger.dm deleted file mode 100644 index be1930bb7a..0000000000 --- a/code/unused/computer2/messenger.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/computer/file/computer_program/messenger - name = "Messenger" - size = 8.0 - var/messages = null - var/screen_name = "User" - -//To-do: take screen_name from inserted id card?? -//Saving log to file datum - - return_text() - if(..()) - return - - var/dat = "Close | " - dat += "Quit
" - - dat += "SpaceMessenger V4.1.2
" - - dat += "Send Message" - - dat += " | Clear" - dat += " | Print" - - dat += " | Name:[src.screen_name]
" - - dat += messages - - dat += "
" - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["send_msg"]) - var/t = input(usr, "Please enter messenger", src.id_tag, null) as text - t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) - if (!t) - return - if (!in_range(src.master, usr)) - return - - var/datum/signal/signal = new - signal.data["type"] = "message" - signal.data["data"] = t - signal.data["sender"] = src.screen_name - src.messages += "→ You:
[t]
" - - peripheral_command("send signal", signal) - - if(href_list["func_msg"]) - switch(href_list["func_msg"]) - if("clear") - src.messages = null - - if("print") - var/datum/signal/signal = new - signal.data["data"] = src.messages - signal.data["title"] = "Chatlog" - peripheral_command("print", signal) - - //if("save") - //TO-DO - - - if(href_list["set_name"]) - var/t = input(usr, "Please enter screen name", src.id_tag, null) as text - t = copytext(sanitize(t), 1, 20) - if (!t) - return - if (!in_range(src.master, usr)) - return - - src.screen_name = t - - src.master.add_fingerprint(usr) - src.master.updateUsrDialog() - return - - receive_command(obj/source, command, datum/signal/signal) - if(..() || !signal) - return - - if(command == "radio signal") - switch(signal.data["type"]) - if("message") - var/sender = signal.data["sender"] - if(!sender) - sender = "Unknown" - - src.messages += "← From [sender]:
[signal.data["data"]]
" - if(src.master.active_program == src) - playsound(src.master.loc, 'sound/machines/twobeep.ogg', 50, 1) - src.master.updateUsrDialog() - - return \ No newline at end of file diff --git a/code/unused/computer2/peripherals.dm b/code/unused/computer2/peripherals.dm deleted file mode 100644 index 2316e3b10e..0000000000 --- a/code/unused/computer2/peripherals.dm +++ /dev/null @@ -1,209 +0,0 @@ -/obj/item/weapon/peripheral - name = "Peripheral card" - desc = "A computer circuit board." - icon = 'icons/obj/module.dmi' - icon_state = "id_mod" - item_state = "electronic" - w_class = 2 - var/obj/machinery/computer2/host - var/id = null - - New() - ..() - spawn(2) - if(istype(src.loc,/obj/machinery/computer2)) - host = src.loc - host.peripherals.Add(src) -// var/setup_id = "\ref[src]" -// src.id = copytext(setup_id,4,(length(setup_id)-1) ) - - Del() - if(host) - host.peripherals.Remove(src) - ..() - - - proc - receive_command(obj/source, command, datum/signal/signal) - if((source != host) || !(src in host)) - return 1 - - if(!command) - return 1 - - return 0 - - send_command(command, datum/signal/signal) - if(!command || !host) - return - - src.host.receive_command(src, command, signal) - - return - -/obj/item/weapon/peripheral/radio - name = "Wireless card" - var/frequency = 1419 - var/code = null - var/datum/radio_frequency/radio_connection - New() - ..() - if(radio_controller) - initialize() - - initialize() - set_frequency(frequency) - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency) - - receive_command(obj/source, command, datum/signal/signal) - if(..()) - return - - if(!signal || !radio_connection) - return - - switch(command) - if("send signal") - src.radio_connection.post_signal(src, signal) - - return - - receive_signal(datum/signal/signal) - if(!signal || (signal.encryption && signal.encryption != code)) - return - - var/datum/signal/newsignal = new - newsignal.data = signal.data - if(src.code) - newsignal.encryption = src.code - - send_command("radio signal",newsignal) - return - -/obj/item/weapon/peripheral/printer - name = "Printer module" - desc = "A small printer designed to fit into a computer casing." - icon_state = "card_mod" - var/printing = 0 - - receive_command(obj/source,command, datum/signal/signal) - if(..()) - return - - if(!signal) - return - - if((command == "print") && !src.printing) - src.printing = 1 - - var/print_data = signal.data["data"] - var/print_title = signal.data["title"] - if(!print_data) - src.printing = 0 - return - spawn(50) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.host.loc ) - P.info = print_data - if(print_title) - P.name = "[print_title]" - - src.printing = 0 - return - - return - -/obj/item/weapon/peripheral/prize_vendor - name = "Prize vending module" - desc = "An arcade prize dispenser designed to fit inside a computer casing." - icon_state = "power_mod" - var/last_vend = 0 //Delay between vends if manually activated(ie a dude is holding it and shaking stuff out) - - receive_command(obj/source,command, datum/signal/signal) - if(..()) - return - - if(command == "vend prize") - src.vend_prize() - - return - - attack_self(mob/user as mob) - if( (last_vend + 400) < world.time) - user << "You shake something out of [src]!" - src.vend_prize() - src.last_vend = world.time - else - user << "\red [src] isn't ready to dispense a prize yet." - - return - - proc/vend_prize() - var/obj/item/prize - var/prizeselect = rand(1,4) - var/turf/prize_location = null - - if(src.host) - prize_location = src.host.loc - else - prize_location = get_turf(src) - - switch(prizeselect) - if(1) - prize = new /obj/item/weapon/money( prize_location ) - prize.name = "space ticket" - prize.desc = "It's almost like actual currency!" - if(2) - prize = new /obj/item/device/radio/beacon( prize_location ) - prize.name = "electronic blink toy game" - prize.desc = "Blink. Blink. Blink." - if(3) - prize = new /obj/item/weapon/flame/lighter/zippo( prize_location ) - prize.name = "Burno Lighter" - prize.desc = "Almost like a decent lighter!" - if(4) - prize = new /obj/item/weapon/c_tube( prize_location ) - prize.name = "toy sword" - prize.icon = 'icons/obj/weapons.dmi' - prize.icon_state = "sword1" - prize.desc = "A sword made of cheap plastic." - -/* -/obj/item/weapon/peripheral/card_scanner - name = "ID scanner module" - icon_state = "card_mod" - var/obj/item/weapon/card/id/authid = null - - attack_self(mob/user as mob) - if(authid) - user << "The card falls out." - src.authid.loc = get_turf(user) - src.authid = null - - return - - receive_command(obj/source,command, datum/signal/signal) - if(..()) - return - - if(!signal || (signal.data["ref_id"] != "\ref[src]") ) - return - - switch(command) - if("eject card") - if(src.authid) - src.authid.loc = src.host.loc - src.authid = null - if("add card access") - var/new_access = signal.data["access"] - if(!new_access) - return - - - - return -*/ \ No newline at end of file diff --git a/code/unused/conveyor.dm b/code/unused/conveyor.dm deleted file mode 100644 index 5001660d7f..0000000000 --- a/code/unused/conveyor.dm +++ /dev/null @@ -1,398 +0,0 @@ -// converyor belt - -// moves items/mobs/movables in set direction every ptick - - -/obj/machinery/conveyor - icon = 'icons/obj/recycling.dmi' - icon_state = "conveyor0" - name = "conveyor belt" - desc = "A conveyor belt." - anchored = 1 - var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off - var/operable = 1 // true if can operate (no broken segments in this belt run) - var/basedir // this is the default (forward) direction, set by the map dir - // note dir var can vary when the direction changes - - var/list/affecting // the list of all items that will be moved this ptick - var/id = "" // the control ID - must match controller ID - // following two only used if a diverter is present - var/divert = 0 // if non-zero, direction to divert items - var/divdir = 0 // if diverting, will be conveyer dir needed to divert (otherwise dense) - - - - // create a conveyor - -/obj/machinery/conveyor/New() - ..() - basedir = dir - setdir() - - // set the dir and target turf depending on the operating direction - -/obj/machinery/conveyor/proc/setdir() - if(operating == -1) - set_dir(turn(basedir,180)) - else - set_dir(basedir) - update() - - - // update the icon depending on the operating condition - -/obj/machinery/conveyor/proc/update() - if(stat & BROKEN) - icon_state = "conveyor-b" - operating = 0 - return - if(!operable) - operating = 0 - icon_state = "conveyor[(operating != 0) && !(stat & NOPOWER)]" - - - // machine process - // move items to the target location -/obj/machinery/conveyor/process() - if(stat & (BROKEN | NOPOWER)) - return - if(!operating) - return - use_power(100) - - var/movedir = dir // base movement dir - if(divert && dir==divdir) // update if diverter present - movedir = divert - - - affecting = loc.contents - src // moved items will be all in loc - spawn(1) // slight delay to prevent infinite propagation due to map order - var/items_moved = 0 - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(isturf(A.loc)) // this is to prevent an ugly bug that forces a player to drop what they're holding if they recently pick it up from the conveyer belt - if(ismob(A)) - var/mob/M = A - if(M.buckled == src) - var/obj/machinery/conveyor/C = locate() in get_step(src, dir) - M.buckled = null - step(M,dir) - if(C) - M.buckled = C - else - new/obj/item/stack/cable_coil/cut(M.loc) - else - step(M,movedir) - else - step(A,movedir) - items_moved++ - if(items_moved >= 10) - break - -// attack with item, place item on conveyor - -/obj/machinery/conveyor/attackby(var/obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/grab)) // special handling if grabbing a mob - var/obj/item/weapon/grab/G = I - G.affecting.Move(src.loc) - del(G) - return - else if(istype(I, /obj/item/stack/cable_coil)) // if cable, see if a mob is present - var/mob/M = locate() in src.loc - if(M) - if (M == user) - src.visible_message("\blue [M] ties \himself to the conveyor.") - // note don't check for lying if self-tying - else - if(M.lying) - user.visible_message("\blue [M] has been tied to the conveyor by [user].", "\blue You tie [M] to the converyor!") - else - user << "\blue [M] must be lying down to be tied to the converyor!" - return - M.buckled = src - src.add_fingerprint(user) - I:use(1) - M.lying = 1 - return - - // else if no mob in loc, then allow coil to be placed - - else if(istype(I, /obj/item/weapon/wirecutters)) - var/mob/M = locate() in src.loc - if(M && M.buckled == src) - M.buckled = null - src.add_fingerprint(user) - if (M == user) - src.visible_message("\blue [M] cuts \himself free from the conveyor.") - else - src.visible_message("\blue [M] had been cut free from the conveyor by [user].") - return - - if(isrobot(user)) - return - - // otherwise drop and place on conveyor - user.drop_item() - if(I && I.loc) I.loc = src.loc - return - -// attack with hand, move pulled object onto conveyor - -/obj/machinery/conveyor/attack_hand(mob/user as mob) - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - user.stop_pulling() - else - step(user.pulling, get_dir(user.pulling.loc, src)) - user.stop_pulling() - return - - -// make the conveyor broken -// also propagate inoperability to any connected conveyor with the same ID -/obj/machinery/conveyor/proc/broken() - stat |= BROKEN - update() - - var/obj/machinery/conveyor/C = locate() in get_step(src, basedir) - if(C) - C.set_operable(basedir, id, 0) - - C = locate() in get_step(src, turn(basedir,180)) - if(C) - C.set_operable(turn(basedir,180), id, 0) - - -//set the operable var if ID matches, propagating in the given direction - -/obj/machinery/conveyor/proc/set_operable(stepdir, match_id, op) - - if(id != match_id) - return - operable = op - - update() - var/obj/machinery/conveyor/C = locate() in get_step(src, stepdir) - if(C) - C.set_operable(stepdir, id, op) - -/* -/obj/machinery/conveyor/verb/destroy() - set src in view() - src.broken() -*/ - -/obj/machinery/conveyor/power_change() - ..() - update() - - -// converyor diverter -// extendable arm that can be switched so items on the conveyer are diverted sideways -// situate in same turf as conveyor -// only works if belts is running proper direction -// -// -/obj/machinery/diverter - icon = 'icons/obj/recycling.dmi' - icon_state = "diverter0" - name = "diverter" - desc = "A diverter arm for a conveyor belt." - anchored = 1 - layer = FLY_LAYER - var/obj/machinery/conveyor/conv // the conveyor this diverter works on - var/deployed = 0 // true if diverter arm is extended - var/operating = 0 // true if arm is extending/contracting - var/divert_to // the dir that diverted items will be moved - var/divert_from // the dir items must be moving to divert - - -// create a diverter -// set up divert_to and divert_from directions depending on dir state -/obj/machinery/diverter/New() - - ..() - - switch(dir) - if(NORTH) - divert_to = WEST // stuff will be moved to the west - divert_from = NORTH // if entering from the north - if(SOUTH) - divert_to = EAST - divert_from = NORTH - if(EAST) - divert_to = EAST - divert_from = SOUTH - if(WEST) - divert_to = WEST - divert_from = SOUTH - if(NORTHEAST) - divert_to = NORTH - divert_from = EAST - if(NORTHWEST) - divert_to = NORTH - divert_from = WEST - if(SOUTHEAST) - divert_to = SOUTH - divert_from = EAST - if(SOUTHWEST) - divert_to = SOUTH - divert_from = WEST - spawn(2) - // wait for map load then find the conveyor in this turf - conv = locate() in src.loc - if(conv) // divert_from dir must match possible conveyor movement - if(conv.basedir != divert_from && conv.basedir != turn(divert_from,180) ) - del(src) // if no dir match, then delete self - set_divert() - update() - -// update the icon state depending on whether the diverter is extended -/obj/machinery/diverter/proc/update() - icon_state = "diverter[deployed]" - -// call to set the diversion vars of underlying conveyor -/obj/machinery/diverter/proc/set_divert() - if(conv) - if(deployed) - conv.divert = divert_to - conv.divdir = divert_from - else - conv.divert= 0 - - -// *** TESTING click to toggle -/obj/machinery/diverter/Click() - toggle() - - -// toggle between arm deployed and not deployed, showing animation -// -/obj/machinery/diverter/proc/toggle() - if( stat & (NOPOWER|BROKEN)) - return - - if(operating) - return - - use_power(50) - operating = 1 - if(deployed) - flick("diverter10",src) - icon_state = "diverter0" - sleep(10) - deployed = 0 - else - flick("diverter01",src) - icon_state = "diverter1" - sleep(10) - deployed = 1 - operating = 0 - update() - set_divert() - -// don't allow movement into the 'backwards' direction if deployed -/obj/machinery/diverter/CanPass(atom/movable/O, var/turf/target) - var/direct = get_dir(O, target) - if(direct == divert_to) // prevent movement through body of diverter - return 0 - if(!deployed) - return 1 - return(direct != turn(divert_from,180)) - -// don't allow movement through the arm if deployed -/obj/machinery/diverter/CheckExit(atom/movable/O, var/turf/target) - var/direct = get_dir(O, target) - if(direct == turn(divert_to,180)) // prevent movement through body of diverter - return 0 - if(!deployed) - return 1 - return(direct != divert_from) - - - - - -// the conveyor control switch -// -// - -/obj/machinery/conveyor_switch - - name = "conveyor switch" - desc = "A conveyor control switch." - icon = 'icons/obj/recycling.dmi' - icon_state = "switch-off" - var/position = 0 // 0 off, -1 reverse, 1 forward - var/last_pos = -1 // last direction setting - var/operated = 1 // true if just operated - - var/id = "" // must match conveyor IDs to control them - - var/list/conveyors // the list of converyors that are controlled by this switch - anchored = 1 - - - -/obj/machinery/conveyor_switch/New() - ..() - update() - - spawn(5) // allow map load - conveyors = list() - for(var/obj/machinery/conveyor/C in world) - if(C.id == id) - conveyors += C - -// update the icon depending on the position - -/obj/machinery/conveyor_switch/proc/update() - if(position<0) - icon_state = "switch-rev" - else if(position>0) - icon_state = "switch-fwd" - else - icon_state = "switch-off" - - -// timed process -// if the switch changed, update the linked conveyors - -/obj/machinery/conveyor_switch/process() - if(!operated) - return - operated = 0 - - for(var/obj/machinery/conveyor/C in conveyors) - C.operating = position - C.setdir() - -// attack with hand, switch position -/obj/machinery/conveyor_switch/attack_hand(mob/user) - if(position == 0) - if(last_pos < 0) - position = 1 - last_pos = 0 - else - position = -1 - last_pos = 0 - else - last_pos = position - position = 0 - - operated = 1 - update() - - // find any switches with same id as this one, and set their positions to match us - for(var/obj/machinery/conveyor_switch/S in world) - if(S.id == src.id) - S.position = position - S.update() diff --git a/code/unused/disease2/cureimplanter.dm b/code/unused/disease2/cureimplanter.dm deleted file mode 100644 index 4506495456..0000000000 --- a/code/unused/disease2/cureimplanter.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/weapon/cureimplanter - name = "Hypospray injector" - icon = 'icons/obj/items.dmi' - icon_state = "implanter1" - var/datum/disease2/resistance/resistance = null - var/works = 0 - var/datum/disease2/disease/virus2 = null - item_state = "syringe_0" - throw_speed = 1 - throw_range = 5 - w_class = 2.0 - - -/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob) - if(ismob(target)) - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1) - if(!do_mob(user, target,60)) return - - - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] injects themself with [src.name]!", 1) - - - var/mob/living/carbon/M = target - - if(works == 0 && prob(25)) - M.resistances2 += resistance - if(M.virus2) - M.virus2.cure_added(resistance) - else if(works == 1) - M.adjustToxLoss(rand(20,50)) - else if(works == 2) - M.adjustToxLoss(rand(50,100)) - else if(works == 3) - infect_virus2(M,virus2,1) diff --git a/code/unused/disease2/curer.dm b/code/unused/disease2/curer.dm deleted file mode 100644 index dab15f4967..0000000000 --- a/code/unused/disease2/curer.dm +++ /dev/null @@ -1,154 +0,0 @@ -/obj/machinery/computer/curer - name = "Cure Research Machine" - icon = 'icons/obj/computer.dmi' - icon_state = "dna" -// brightnessred = 0 -// brightnessgreen = 2 //Used for multicoloured lighting on BS12 -// brightnessblue = 2 - var/curing - var/virusing - circuit = "/obj/item/weapon/circuitboard/mining" - - var/obj/item/weapon/virusdish/dish = null - -/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob) - /*if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src)*/ - if(istype(I,/obj/item/weapon/virusdish)) - var/mob/living/carbon/c = user - if(!dish) - - dish = I - c.drop_item() - I.loc = src - - //else - src.attack_hand(user) - return - -/obj/machinery/computer/curer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/curer/attack_paw(var/mob/user as mob) - - return src.attack_hand(user) - return - -/obj/machinery/computer/curer/attack_hand(var/mob/user as mob) - if(..()) - return - user.machine = src - var/dat - if(curing) - dat = "Antibody production in progress" - else if(virusing) - dat = "Virus production in progress" - else if(dish) - dat = "Virus dish inserted" - if(dish.virus2) - if(dish.growth >= 100) - dat += "
Begin antibody production" - dat += "
Begin virus production" - else - dat += "
Insufficent cells to attempt to create cure" - else - dat += "
Please check dish contents" - - dat += "
Eject disk" - else - dat = "Please insert dish" - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/curer/process() - ..() - - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - src.updateDialog() - - if(curing) - curing -= 1 - if(curing == 0) - icon_state = "dna" - if(dish.virus2) - createcure(dish.virus2) - if(virusing) - virusing -= 1 - if(virusing == 0) - icon_state = "dna" - if(dish.virus2) - createvirus(dish.virus2) - - return - -/obj/machinery/computer/curer/Topic(href, href_list) - if(..()) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src - - if (href_list["antibody"]) - curing = 30 - dish.growth -= 50 - src.icon_state = "dna" - if (href_list["virus"]) - virusing = 30 - dish.growth -= 100 - src.icon_state = "dna" - else if(href_list["eject"]) - dish.loc = src.loc - dish = null - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/obj/machinery/computer/curer/proc/createcure(var/datum/disease2/disease/virus2) - var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) - implanter.resistance = new /datum/disease2/resistance(dish.virus2) - if(probG("Virus curing",3)) - implanter.works = 0 - else - implanter.works = rand(1,2) - state("The [src.name] Buzzes") - -/obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2) - var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) - implanter.name = "Viral implanter (MAJOR BIOHAZARD)" - implanter.virus2 = dish.virus2.getcopy() - implanter.works = 3 - state("The [src.name] Buzzes") - - -/obj/machinery/computer/curer/proc/state(var/msg) - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue [msg]", 2) diff --git a/code/unused/disease2/monkeydispensor.dm b/code/unused/disease2/monkeydispensor.dm deleted file mode 100644 index 13d1b9806f..0000000000 --- a/code/unused/disease2/monkeydispensor.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/machinery/disease2/monkeycloner - name = "Monkey dispensor" - icon = 'icons/obj/cloning.dmi' - icon_state = "pod_0" - density = 1 - anchored = 1 - - var/cloning = 0 - -/obj/machinery/disease2/monkeycloner/attack_hand() - if(!cloning) - cloning = 150 - - icon_state = "pod_g" - -/obj/machinery/disease2/monkeycloner/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - src.updateDialog() - - if(cloning) - cloning -= 1 - if(!cloning) - new /mob/living/carbon/monkey(src.loc) - icon_state = "pod_0" - - - - return diff --git a/code/unused/dna.dm b/code/unused/dna.dm deleted file mode 100644 index 604acbefc6..0000000000 --- a/code/unused/dna.dm +++ /dev/null @@ -1,962 +0,0 @@ -/proc/scram(n) - var/t = "" - var/p = null - p = 1 - while(p <= n) - t = text("[][]", t, rand(1, 9)) - p++ - return t - -/obj/machinery/computer/dna - name = "DNA operations computer" - desc = "A Computer used to advanced DNA stuff." - icon_state = "dna" - var/obj/item/weapon/card/data/scan = null - var/obj/item/weapon/card/data/modify = null - var/obj/item/weapon/card/data/modify2 = null - var/mode = null - var/temp = null - -/obj/machinery/computer/dna/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/dna/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/dna/attack_hand(mob/user as mob) - if(..()) - return - user.machine = src - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - var/dat = text("Please Insert the cards into the slots
\n\t\t\t\tFunction Disk: []
\n\t\t\t\tTarget Disk: []
\n\t\t\t\tAux. Data Disk: []
\n\t\t\t\t\t(Not always used!)
\n\t\t\t\t[]", src, (src.scan ? text("[]", src.scan.name) : "----------"), src, (src.modify ? text("[]", src.modify.name) : "----------"), src, (src.modify2 ? text("[]", src.modify2.name) : "----------"), (src.scan ? text("Execute Function", src) : "No function disk inserted!")) - if (src.temp) - dat = text("[]

Clear Message", src.temp, src) - user << browse(dat, "window=dna_comp") - onclose(user, "dna_comp") - else - var/dat = text("[]
\n\t\t\t\t[] []
\n\t\t\t\t[] []
\n\t\t\t\t[] []
\n\t\t\t\t\t(Not always used!)
\n\t\t\t\t[]", stars("Please Insert the cards into the slots"), stars("Function Disk:"), src, (src.scan ? text("[]", src.scan.name) : "----------"), stars("Target Disk:"), src, (src.modify ? text("[]", src.modify.name) : "----------"), stars("Aux. Data Disk:"), src, (src.modify2 ? text("[]", src.modify2.name) : "----------"), (src.scan ? text("[]", src, stars("Execute Function")) : stars("No function disk inserted!"))) - if (src.temp) - dat = text("[]

[]", stars(src.temp), src, stars("Clear Message")) - user << browse(dat, "window=dna_comp") - onclose(user, "dna_comp") - return - -/obj/machinery/computer/dna/Topic(href, href_list) - if(..()) - return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1 || usr.telekinesis == 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if (href_list["modify"]) - if (src.modify) - src.modify.loc = src.loc - src.modify = null - src.mode = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/data)) - usr.drop_item() - I.loc = src - src.modify = I - src.mode = null - if (href_list["modify2"]) - if (src.modify2) - src.modify2.loc = src.loc - src.modify2 = null - src.mode = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/data)) - usr.drop_item() - I.loc = src - src.modify2 = I - src.mode = null - if (href_list["scan"]) - if (src.scan) - src.scan.loc = src.loc - src.scan = null - src.mode = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/data)) - usr.drop_item() - I.loc = src - src.scan = I - src.mode = null - if (href_list["clear"]) - src.temp = null - if (href_list["execute"]) - if ((src.scan && src.scan.function)) - switch(src.scan.function) - if("data_mutate") - if (src.modify) - if (!( findtext(src.scan.data, "-", 1, null) )) - if ((src.modify.data && src.scan.data && length(src.modify.data) >= length(src.scan.data))) - src.modify.data = text("[][]", src.scan.data, (length(src.modify.data) > length(src.scan.data) ? copytext(src.modify.data, length(src.scan.data) + 1, length(src.modify.data) + 1) : null)) - else - src.temp = "Disk Failure: Cannot examine data! (Null or wrong format)" - else - var/d = findtext(src.modify.data, "-", 1, null) - var/t = copytext(src.modify.data, d + 1, length(src.modify.data) + 1) - d = text2num(copytext(1, d, null)) - if ((d && t && src.modify.data && src.scan.data && length(src.modify.data) >= (length(t) + d - 1) )) - src.modify.data = text("[][][]", copytext(src.modify.data, 1, d), t, (length(src.modify.data) > length(t) + d ? copytext(src.modify.data, length(t) + d, length(src.modify.data) + 1) : null)) - else - src.temp = "Disk Failure: Cannot examine data! (Null or wrong format)" - else - src.temp = "Disk Failure: Cannot read target disk!" - if("dna_seq") - src.temp = "DNA Systems Help:\nHuman DNA sequences: (Compressed in *.dna format version 10.76)\n\tSpecies Identification Marker: (28 chromosomes)\n\t\t5BDFE293BA5500F9FFFD500AAFFE\n\tStructural Enzymes:\n\t\tCDE375C9A6C25A7DBDA50EC05AC6CEB63\n\t\tNote: The first id set is used for DNA clean up operations.\n\tUsed Enzymes:\n\t\t493DB249EB6D13236100A37000800AB71\n\tSpecies/Genus Classification: Homo Sapien\n\nMonkey DNA sequences: (Compressed in *.dna format version 10.76)\n\tSpecies Identification Marker: (16 chromosomes)\n\t\t2B6696D2B127E5A4\n\tStructural Enzymes:\n\t\tCDEAF5B90AADBC6BA8033DB0A7FD613FA\n\t\tNote: The first id set is used for DNA clean up operations.\n\tUsed Enzymes:\n\t\tC8FFFE7EC09D80AEDEDB9A5A0B4085B61\n\tSpecies/Genus Classification: Generic Monkey\n>" - if("dna_help") - src.temp = "DNA Systems Help:\nThe DNA systems consists 3 systems.\nI. DNA Scanner/Implanter - This system is slightly advanced to use. It accepts\n\t1 disk. Before you wish to run a function/program you must implant the\n\tdisk data into the temporary memory. Note that once this is done the disk can\n\tbe removed to place a data disk in.\nII. DNA computer - This is a simple yet fast computer that basically operates on data.\nIII. Restructurer - This device reorganizes the anatomical structure of the subject\n\taccording to the DNA sequences. Please note that it is illegal to perform a\n\ttransfer from one species to or from the Homo sapiens species but\n\thuman to human is acceptable under UNSD guidlines.\n\tNote: This machine is programmed to operate on specific preprogrammed species with\n\tspecialized anatomical blueprints hard coded into its databanks. It cannot operate\n\ton other species. (Current: Human, Monkey)\n\nData Disks:\n\tThese run on 2 (or 3) types: DNA scanner program disks and data modification\nfunctions (and disk modification functions)\n\nDisk-Copy\n\tThis erases the target disk and completely copies the data from the aux. disk.\nDisk-Erase\n\tThis erases everything on the target disk.\nData-Clear\n\tThis erases (clears) only the data.\n\nData-Trunicate\n\tThis removes data from the target disk (parameters gathered from data slot on target\n\tdisk). This fuction has 4 modes (a,b,c,default) defined by this way. (mode id)(#)\n\ta - This cuts # data from the end. (ex a1 on ABCD = ABC)\n\tb - This cuts # data from the beginning. (ex b1 on ABCD = BCD)\n\tc - This limits the data from the end. (ex c1 on ABCD = A)\n\tdefault - This limits the data from the end. (ex 1 on ABCD = D)\nData-Add\n\tThis adds thedata on the aux. disk to the data on the target disk.\nData-Sramble\n\tThis scrambles the data on the target disk. The length is equal to\n\tthe length of the original data.\nData-Input\n\tThis lets you input data into the data slot of any data disk.\n\tNote: This doesn't work only on storage.\nData-Mutate\n\tThis basically inserts text. You follow this format:\n\tpos-text (or just text for automatic pos 1)\n\tie 2-IVE on FOUR yields FIVE\n" - if("data_add") - if (src.modify) - if (src.modify2) - if ((src.modify.data && src.modify2.data)) - src.modify.data += src.modify2.data - src.temp = text("Done!
New Data:
[]", src.modify.data) - else - src.temp = "Cannot read data! (may be null)" - else - src.temp = "Disk Failure: Cannot read aux. data disk!" - else - src.temp = "Disk Failure: Cannot read target disk!" - if("data_scramble") - if (src.modify) - if (length(text("[]", src.modify.data)) >= 1) - src.modify.data = scram(length(text("[]", src.modify.data))) - src.temp = text("Data scrambled: []", src.modify.data) - else - src.temp = "No data to scramble" - else - src.temp = "Disk Failure: Cannot read target disk!" - if("data_input") - if (src.modify) - var/dat = input(usr, ">", text("[]", src.name), null) as text - var/s = src.scan - var/m = src.modify - if ((usr.stat || usr.restrained() || src.modify != m || src.scan != s)) - return - if (((get_dist(src, usr) <= 1 || usr.telekinesis == 1) && istype(src.loc, /turf))) - src.modify.data = dat - else - src.temp = "Disk Failure: Cannot read target disk!" - if("disk_copy") - if (src.modify) - if (src.modify2) - src.modify.function = src.modify2.function - src.modify.data = src.modify2.data - src.modify.special = src.modify2.special - src.temp = "All disk data/programs copied." - else - src.temp = "Disk Failure: Cannot read aux. data disk!" - else - src.temp = "Disk Failure: Cannot read target disk!" - if("disk_dis") - if (src.modify) - src.temp = text("Function: [][]
Data: []", src.modify.function, (src.modify.special ? text("-[]", src.modify.special) : null), src.modify.data) - else - src.temp = "Disk Failure: Cannot read target disk!" - if("disk_erase") - if (src.modify) - src.modify.data = null - src.modify.function = "storage" - src.modify.special = null - src.temp = "All Disk contents deleted." - else - src.temp = "Disk Failure: Cannot read target disk!" - if("data_clear") - if (src.modify) - src.modify.data = null - src.temp = "Disk data cleared." - else - src.temp = "Disk Failure: Cannot read target disk!" - if("data_trun") - if (src.modify) - if ((src.modify.data && src.scan.data)) - var/l1 = length(src.modify.data) - var/l2 = max(round(text2num(src.scan.data)), 1) - switch(copytext(src.modify.data, 1, 2)) - if("a") - if (l1 > l2) - src.modify.data = copytext(src.modify.data, 1, (l1 - l2) + 1) - else - src.modify.data = "" - src.temp = text("Done!
New Data:
[]", src.modify.data) - if("b") - if (l1 > l2) - src.modify.data = copytext(src.modify.data, l2, l1 + 1) - else - src.modify.data = "" - src.temp = text("Done!
New Data:
[]", src.modify.data) - if("c") - if (l1 >= l2) - src.modify.data = copytext(src.modify.data, l1 - l2, l1 + 1) - src.temp = text("Done!
New Data:
[]", src.modify.data) - else - if (l1 >= l2) - src.modify.data = copytext(src.modify.data, 1, l2 + 1) - src.temp = text("Done!
New Data:
[]", src.modify.data) - else - src.temp = "Cannot read data! (may be null and note that function data slot is used instead of aux disk!!)" - else - src.temp = "Disk Failure: Cannot read target disk!" - else - else - src.temp = "System Failure: Cannot read disk function!" - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/dna/ex_act(severity) - switch(severity) - if(1.0) - //SN src = null - del(src) - return - if(2.0) - if (prob(50)) - //SN src = null - del(src) - return - else - return - -/obj/machinery/dna_scanner/allow_drop() - return 0 - -/obj/machinery/dna_scanner/relaymove(mob/user as mob) - if (user.stat) - return - src.go_out() - return - -/obj/machinery/dna_scanner/verb/eject() - set src in oview(1) - - if (usr.stat != 0) - return - src.go_out() - add_fingerprint(usr) - return - -/obj/machinery/dna_scanner/verb/move_inside() - set src in oview(1) - - if (usr.stat != 0) - return - if (src.occupant) - usr << "\blue The scanner is already occupied!" - return - if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." - return - usr.stop_pulling() - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - src.occupant = usr - src.icon_state = "scanner_1" - for(var/obj/O in src) - //O = null - del(O) - //Foreach goto(124) - src.add_fingerprint(usr) - return - -/obj/machinery/dna_scanner/attackby(obj/item/weapon/grab/G as obj, user as mob) - if ((!( istype(G, /obj/item/weapon/grab) ) || !( ismob(G.affecting) ))) - return - if (src.occupant) - user << "\blue The scanner is already occupied!" - return - if (G.affecting.abiotic()) - user << "\blue Subject cannot have abiotic items on." - return - var/mob/M = G.affecting - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - src.occupant = M - src.icon_state = "scanner_1" - for(var/obj/O in src) - O.loc = src.loc - //Foreach goto(154) - src.add_fingerprint(user) - //G = null - del(G) - return - -/obj/machinery/dna_scanner/proc/go_out() - if ((!( src.occupant ) || src.locked)) - return - for(var/obj/O in src) - O.loc = src.loc - //Foreach goto(30) - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - src.icon_state = "scanner_0" - return - -/obj/machinery/dna_scanner/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - //Foreach goto(35) - //SN src = null - del(src) - return - if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - //Foreach goto(108) - //SN src = null - del(src) - return - if(3.0) - if (prob(25)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - //Foreach goto(181) - //SN src = null - del(src) - return - else - return - - -/obj/machinery/dna_scanner/blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) - -/obj/machinery/scan_console/ex_act(severity) - - switch(severity) - if(1.0) - //SN src = null - del(src) - return - if(2.0) - if (prob(50)) - //SN src = null - del(src) - return - else - return - -/obj/machinery/scan_console/blob_act() - - if(prob(75)) - del(src) - -/obj/machinery/scan_console/power_change() - if(stat & BROKEN) - icon_state = "broken" - else if(powered()) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - stat |= NOPOWER - -/obj/machinery/scan_console/New() - ..() - spawn( 5 ) - src.connected = locate(/obj/machinery/dna_scanner, get_step(src, WEST)) - return - return - -/obj/machinery/scan_console/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(250) - - var/mob/M - if (!( src.status )) - return - if (!( src.func )) - src.temp = "No function loaded into memory core!" - src.status = null - if ((src.connected && src.connected.occupant)) - M = src.connected.occupant - if (src.status == "load") - src.prog_p1 = null - src.prog_p2 = null - src.prog_p3 = null - src.prog_p4 = null - switch(src.func) - if("dna_trun") - if (src.data) - src.prog_p1 = copytext(src.data, 1, 2) - src.prog_p2 = text2num(src.data) - src.prog_p3 = src.special - src.status = "dna_trun" - src.temp = "Executing trunication function on occupant." - else - src.temp = "No data implanted in core memory." - src.status = null - if("dna_scan") - if (src.special) - if (src.scan) - if (istype(M, /mob)) - switch(src.special) - if("UI") - src.temp = text("Scan Complete:
Data downloaded to disk!
Unique Identifier: []", M.primary.uni_identity) - src.scan.data = M.primary.uni_identity - if("SE") - src.temp = text("Scan Complete:
Data downloaded to disk!
Structural Enzymes: []", M.primary.struc_enzyme) - src.scan.data = M.primary.struc_enzyme - if("UE") - src.temp = text("Scan Complete:
Data downloaded to disk!
Used Enzynmes: []", M.primary.use_enzyme) - src.scan.data = M.primary.use_enzyme - if("SI") - src.temp = text("Scan Complete:
Data downloaded to disk!
Species Identifier: []", M.primary.spec_identity) - src.scan.data = M.primary.spec_identity - else - else - src.temp = "No occupant to scan!" - else - src.temp = "Error: No disk to upload data to." - else - src.temp = "Error: Function program errors." - src.status = null - if("dna_replace") - if ((src.data && src.special)) - src.prog_p1 = src.special - src.prog_p2 = src.data - src.status = "dna_replace" - src.temp = "Executing repalcement function on occupant." - else - src.temp = "Error: No DNA data loaded into core or function program errors." - src.status = null - if("dna_add") - if ((src.data && src.special)) - src.prog_p1 = src.special - src.prog_p2 = src.data - src.status = "dna_add" - src.temp = "Executing addition function on occupant." - else - src.temp = "Error: No DNA data loaded into core or function program errors." - src.status = null - else - src.temp = "Cannot execute program!" - src.status = null - else - if (src.status == "dna_trun") - if (istype(M, /mob)) - var/t = null - switch(src.prog_p3) - if("UI") - t = M.primary.uni_identity - if("SE") - t = M.primary.struc_enzyme - if("UE") - t = M.primary.use_enzyme - if("SI") - t = M.primary.spec_identity - else - if (!( src.prog_p4 )) - switch(src.prog_p1) - if("a") - src.prog_p4 = length(t) - if("b") - src.prog_p4 = 1 - else - else - if (src.prog_p1 == "a") - src.prog_p4-- - else - if (src.prog_p1 == "b") - src.prog_p4-- - switch(src.prog_p1) - if("a") - if (src.prog_p4 <= 0) - src.temp = "Trunication complete" - src.status = null - else - t = copytext(t, 1, length(t)) - src.temp = text("Trunicating []'s DNA sequence...
[]
Status: [] units left.

Emergency Abort", M.name, t, src.prog_p4, src) - if("b") - if (src.prog_p4 <= 0) - src.temp = "Trunication complete" - src.status = null - else - t = copytext(t, 2, length(t) + 1) - src.temp = text("Trunicating []'s DNA sequence...
[]
Status: [] units left.

Emergency Abort", M.name, t, src.prog_p4, src) - if("c") - if (length(t) <= src.prog_p2) - src.temp = "Limitation complete" - src.status = null - else - t = copytext(t, 1, length(t)) - src.temp = text("Limiting []'s DNA sequence...
[]
Status: [] units converting to [] units.

Emergency Abort", M.name, t, length(t), src.prog_p2, src) - else - if (length(t) <= src.prog_p2) - src.temp = "Limitation complete" - src.status = null - else - t = copytext(t, 2, length(t) + 1) - src.temp = text("Limiting []'s DNA sequence...
[]
Status: [] units converting to [] units.

Emergency Abort", M.name, t, length(t), src.prog_p2, src) - switch(src.prog_p3) - if("UI") - M.primary.uni_identity = t - if("SE") - M.primary.struc_enzyme = t - if("UE") - M.primary.use_enzyme = t - if("SI") - M.primary.spec_identity = t - else - else - src.temp = "Process terminated due to lack of occupant in DNA chamber." - src.status = null - else - if (src.status == "dna_replace") - if (istype(M, /mob)) - var/t = null - switch(src.prog_p1) - if("UI") - t = M.primary.uni_identity - if("SE") - t = M.primary.struc_enzyme - if("UE") - t = M.primary.use_enzyme - if("SI") - t = M.primary.spec_identity - else - if (!( src.prog_p4 )) - src.prog_p4 = 1 - else - src.prog_p4++ - if ((src.prog_p4 > length(t) || src.prog_p4 > length(src.prog_p2))) - src.temp = "Replacement complete" - src.status = null - else - t = text("[][][]", copytext(t, 1, src.prog_p4), copytext(src.prog_p2, src.prog_p4, src.prog_p4 + 1), (src.prog_p4 < length(t) ? copytext(t, src.prog_p4 + 1, length(t) + 1) : null)) - src.temp = text("Replacing []'s DNA sequence...
[]
Target: []
Status: At position []

Emergency Abort", M.name, t, src.prog_p2, src.prog_p4, src) - switch(src.prog_p1) - if("UI") - M.primary.uni_identity = t - if("SE") - M.primary.struc_enzyme = t - if("UE") - M.primary.use_enzyme = t - if("SI") - M.primary.spec_identity = t - else - else - src.temp = "Process terminated due to lack of occupant in DNA chamber." - src.status = null - else - if (src.status == "dna_add") - if (istype(M, /mob)) - var/t = null - switch(src.prog_p1) - if("UI") - t = M.primary.uni_identity - if("SE") - t = M.primary.struc_enzyme - if("UE") - t = M.primary.use_enzyme - if("SI") - t = M.primary.spec_identity - else - if (!( src.prog_p4 )) - src.prog_p4 = 1 - else - src.prog_p4++ - if (src.prog_p4 > length(src.prog_p2)) - src.temp = "Addition complete" - src.status = null - else - t = text("[][]", t, copytext(src.prog_p2, src.prog_p4, src.prog_p4 + 1)) - src.temp = text("Adding to []'s DNA sequence...
[]
Adding: []
Position: []

Emergency Abort", M.name, t, src.prog_p2, src.prog_p4, src) - switch(src.prog_p1) - if("UI") - M.primary.uni_identity = t - if("SE") - M.primary.struc_enzyme = t - if("UE") - M.primary.use_enzyme = t - if("SI") - M.primary.spec_identity = t - else - else - src.temp = "Process terminated due to lack of occupant in DNA chamber." - src.status = null - else - src.status = null - src.temp = "Unknown system error." - src.updateDialog() - return - -/obj/machinery/scan_console/attack_paw(user as mob) - return src.attack_hand(user) - -/obj/machinery/scan_console/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/scan_console/attack_hand(user as mob) - if(..()) - return - var/dat - if (src.temp) - dat = text("[]

Clear Message", src.temp, src) - else - if (src.connected) - var/mob/occupant = src.connected.occupant - dat = "Occupant Statistics:
" - if (occupant) - var/t1 - switch(occupant.stat) - if(0) - t1 = "Conscious" - if(1) - t1 = "Unconscious" - else - t1 = "*dead*" - dat += text("[]\tHealth %: [] ([])

", (occupant.health > 50 ? "" : ""), occupant.health, t1) - else - dat += "The scanner is empty.
" - if (!( src.connected.locked )) - dat += text("Lock (Unlocked)
", src) - else - dat += text("Unlock (Locked)
", src) - dat += text("Disk: []
\n[]
\n[]
", src, - (src.scan ? text("[]", src.scan.name) : "----------"), - (src.scan ? text("Upload Data", src) : "No disk to upload"), - ((src.data || src.func || src.special) ? text("Clear Data
Execute Data
Function Type: [][]
Data: []", src, src, src.func, (src.special ? text("-[]", src.special) : null), src.data) : "No data uploaded")) - dat += text("

Close", user) - user << browse(dat, "window=scanner;size=400x500") - onclose(user, "scanner") - return - -/obj/machinery/scan_console/Topic(href, href_list) - if(..()) - return - if ((usr.contents.Find(src) || (get_dist(src, usr) <= 1 || usr.telekinesis == 1) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if (href_list["locked"]) - if ((src.connected && src.connected.occupant)) - src.connected.locked = !( src.connected.locked ) - if (href_list["scan"]) - if (src.scan) - src.scan.loc = src.loc - src.scan = null - else - var/obj/item/I = usr.equipped() - if (istype(I, /obj/item/weapon/card/data)) - usr.drop_item() - I.loc = src - src.scan = I - if (href_list["u_dat"]) - if ((src.scan && !( src.status ))) - if ((src.scan.function && src.scan.function != "storage")) - src.func = src.scan.function - src.special = src.scan.special - if (src.scan.data) - src.data = src.scan.data - else - src.temp = "No disk found or core data access lock out!" - if (href_list["c_dat"]) - if (!src.status) - src.func = null - src.data = null - src.special = null - else - src.temp = "No disk found or core data access lock out!" - if (href_list["clear"]) - src.temp = null - if (href_list["abort"]) - src.status = null - if (href_list["e_dat"]) - if (!( src.status )) - src.status = "load" - src.temp = "Loading..." - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/restruct/allow_drop() - return 0 - -/obj/machinery/restruct/verb/eject() - set src in oview(1) - - if (usr.stat != 0) - return - src.go_out() - add_fingerprint(usr) - return - -/obj/machinery/restruct/verb/operate() - set src in oview(1) - - src.add_fingerprint(usr) - if ((src.occupant && src.occupant.primary)) - switch(src.occupant.primary.spec_identity) - if("5BDFE293BA5500F9FFFD500AAFFE") - if (!istype(src.occupant, /mob/living/carbon/human)) - for(var/obj/O in src.occupant) - del(O) - - var/mob/living/carbon/human/O = new /mob/living/carbon/human( src ) - if(ticker.killer == src.occupant) - O.memory = src.occupant.memory - ticker.killer = O - var/mob/M = src.occupant - O.start = 1 - O.primary = M.primary - M.primary = null - var/t1 = hex2num(copytext(O.primary.uni_identity, 25, 28)) - if (t1 < 125) - O.gender = MALE - else - O.gender = FEMALE - M << "Genetic Transversal Complete!" - if (M.client) - M << "Transferring..." - M.client.mob = O - O << "Neural Sequencing Complete!" - O.loc = src - src.occupant = O - //M = null - del(M) - src.occupant = O - src.occupant << "Done!" - if("2B6696D2B127E5A4") - if (!istype(src.occupant, /mob/living/carbon/monkey)) - for(var/obj/O in src.occupant) - del(O) - var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src) - if(ticker.killer == src.occupant) - O.memory = src.occupant.memory - ticker.killer = O - var/mob/M = src.occupant - O.start = 1 - O.primary = M.primary - M.primary = null - M << "Genetic Transversal Complete!" - if (M.client) - M << "Transferring..." - M.client.mob = O - O << "Neural Sequencing Complete!" - O.loc = src - O << "Genetic Transversal Complete!" - src.occupant = O - del(M) - O.name = text("monkey ([])", copytext(md5(src.occupant.primary.uni_identity), 2, 6)) - src.occupant << "Done!" - else - if (istype(src.occupant, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src.occupant - - var/speak = (length(H.primary.struc_enzyme) >= 25 ? hex2num(copytext(H.primary.struc_enzyme, 22, 25)) : 9999) - var/ears = (length(H.primary.struc_enzyme) >= 10 ? hex2num(copytext(H.primary.struc_enzyme, 7, 10)) : 9999) - var/vision = (length(H.primary.struc_enzyme) >= 16 ? hex2num(copytext(H.primary.struc_enzyme, 13, 16)) : 1) - var/mental1 = (length(H.primary.struc_enzyme) >= 31 ? hex2num(copytext(H.primary.struc_enzyme, 28, 31)) : 1) - var/mental2 = (length(H.primary.struc_enzyme) >= 28 ? hex2num(copytext(H.primary.struc_enzyme, 25, 28)) : 1) - var/speak2 = (length(H.primary.struc_enzyme) >= 22 ? hex2num(copytext(H.primary.struc_enzyme, 19, 22)) : 1) - H.sdisabilities = 0 - H.disabilities = 0 - if (speak < 3776) - H.disabilities = H.disabilities | 4 - else - if (speak > 3776) - H.sdisabilities = H.sdisabilities | 2 - if (speak2 < 2640) - H.disabilities = H.disabilities | 16 - if (ears > 3226) - H.sdisabilities = H.sdisabilities | 4 - if (vision < 1447) - H.sdisabilities = H.sdisabilities | 1 - else - if (vision > 1447) - H.disabilities = H.disabilities | 1 - if (mental1 < 1742) - H.disabilities = H.disabilities | 2 - if (mental2 < 1452) - H.disabilities = H.disabilities | 8 - var/t1 = null - if (length(H.primary.uni_identity) >= 20) - t1 = copytext(H.primary.uni_identity, 19, 21) - if (hex2num(t1) > 127) - H.gender = FEMALE - else - H.gender = MALE - else - H.gender = NEUTER - if (length(H.primary.uni_identity) >= 18) - t1 = copytext(H.primary.uni_identity, 17, 19) - H.ns_tone = hex2num(t1) - H.ns_tone = -H.ns_tone + 35 - else - H.ns_tone = 1 - H.ns_tone = -H.ns_tone + 35 - if (length(H.primary.uni_identity) >= 16) - t1 = copytext(H.primary.uni_identity, 15, 17) - H.b_eyes = hex2num(t1) - else - H.b_eyes = 255 - if (length(H.primary.uni_identity) >= 14) - t1 = copytext(H.primary.uni_identity, 13, 15) - H.g_eyes = hex2num(t1) - else - H.g_eyes = 255 - if (length(H.primary.uni_identity) >= 12) - t1 = copytext(H.primary.uni_identity, 11, 13) - H.r_eyes = hex2num(t1) - else - H.r_eyes = 255 - if (length(H.primary.uni_identity) >= 10) - t1 = copytext(H.primary.uni_identity, 9, 11) - H.nb_hair = hex2num(t1) - else - H.nb_hair = 255 - if (length(H.primary.uni_identity) >= 8) - t1 = copytext(H.primary.uni_identity, 7, 9) - H.ng_hair = hex2num(t1) - else - H.ng_hair = 255 - if (length(H.primary.uni_identity) >= 6) - t1 = copytext(H.primary.uni_identity, 5, 7) - H.nr_hair = hex2num(t1) - else - H.nr_hair = 255 - H.r_hair = H.nr_hair - H.g_hair = H.ng_hair - H.b_hair = H.nb_hair - H.s_tone = H.ns_tone - H.update_face() - H.update_body() - - if (reg_dna[H.primary.uni_identity]) - H.real_name = reg_dna[H.primary.uni_identity] - else - var/i - while (!i) - var/randomname - if (src.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - H.real_name = randomname - i++ - reg_dna[H.primary.uni_identity] = H.real_name - H << text("\red Your name is now [].", H.real_name) - return - -/obj/machinery/restruct/verb/move_inside() - set src in oview(1) - - if (usr.stat != 0) - return - if (src.occupant) - usr << "\blue The scanner is already occupied!" - return - if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." - return - usr.stop_pulling() - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - src.occupant = usr - src.icon_state = "restruct_1" - for(var/obj/O in src) - //O = null - del(O) - //Foreach goto(124) - src.add_fingerprint(usr) - return - -/obj/machinery/restruct/relaymove(mob/user as mob) - if (user.stat) - return - src.go_out() - return - -/obj/machinery/restruct/attackby(obj/item/weapon/grab/G as obj, user as mob) - if(..()) - return - if ((!( istype(G, /obj/item/weapon/grab) ) || !( ismob(G.affecting) ))) - return - if (src.occupant) - user << "\blue The machine is already occupied!" - return - if (G.affecting.abiotic()) - user << "\blue Subject cannot have abiotic items on." - return - var/mob/M = G.affecting - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - src.occupant = M - src.icon_state = "restruct_1" - for(var/obj/O in src) - O.loc = src.loc - //Foreach goto(154) - src.add_fingerprint(user) - //G = null - del(G) - return - -/obj/machinery/restruct/proc/go_out() - if ((!( src.occupant ) || src.locked)) - return - for(var/obj/O in src) - O.loc = src.loc - //Foreach goto(30) - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - src.icon_state = "restruct_0" - return - -/obj/machinery/restruct/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(3.0) - if (prob(25)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - else - return - -/obj/machinery/restruct/blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) \ No newline at end of file diff --git a/code/unused/dna_mutations.dm b/code/unused/dna_mutations.dm deleted file mode 100644 index 006a57eff4..0000000000 --- a/code/unused/dna_mutations.dm +++ /dev/null @@ -1,101 +0,0 @@ - - -/* NOTES: - -This system could be expanded to migrate all of our current mutations to. Maybe. - - -*/ - - -/* /datum/mutations : - * - * A /datum representation of "hidden" mutations. - * - */ -/datum/mutations - - var/list/requirements = list() // list of randomly-genned requirements - var/required = 1 // the number of requirements to generate - - var/list/races = list("Human") // list of races the mutation effect - - proc/get_mutation(var/mob/living/carbon/M) // Called when check_mutation() is successful - ..() - - proc/check_mutation(var/mob/living/carbon/M) // Called in dna.dm, when a target's SE is modified - - if(! ("all" in races)) // "all" means it affects everyone! - if(istype(M, /mob/living/carbon/human)) - if(! ("Human" in races)) - return - if(istype(M, /mob/living/carbon/monkey)) - if(! ("monkey" in races)) - return - // TODO: add more races maybe?? - - - var/passes = 0 - for(var/datum/mutationreq/require in requirements) - - var/se_block[] = getblockbuffer(M.dna.struc_enzymes, require.block, 3) // focus onto the block - if(se_block.len == 3) // we want to make sure there are exactly 3 entries - - if(se_block[require.subblock] == require.reqID) - - passes++ - - if(passes == required) // all requirements met - get_mutation(M) - - - Lasereyes - /* - Lets you shoot laser beams through your eyes. Fancy! - */ - required = 2 - - get_mutation(var/mob/living/carbon/M) - M << "\blue You feel a searing heat inside your eyes!" - M.mutations.Add(LASER) - - Healing - /* - Lets you heal other people, and yourself. But it doesn't let you heal dead people. - */ - required = 2 - - get_mutation(var/mob/living/carbon/M) - M << "\blue You feel a pleasant warmth pulse throughout your body..." - M.mutations.Add(HEAL) - -/* /datum/mutationreq : - * - * A /datum representation of a requirement in order for a mutation to happen. - * - */ - -/datum/mutationreq - var/block // The block to read - var/subblock // The sub-block to read - var/reqID // The required hexadecimal identifier to be equal to the sub-block being read. - - - - -/* -HEY: If you want to be able to get superpowers easily just uncomment this shit. -mob/verb/checkmuts() - for(var/datum/mutations/mut in global_mutations) - - for(var/datum/mutationreq/R in mut.requirements) - src << "Block: [R.block]" - src << "Sub-Block: [R.subblock]" - src << "Required ID: [R.reqID]" - src << "" - -mob/verb/editSE(t as text) - src:dna:struc_enzymes = t - domutcheck(src) - -*/ diff --git a/code/unused/filter_control.dm b/code/unused/filter_control.dm deleted file mode 100644 index 2e7188bd10..0000000000 --- a/code/unused/filter_control.dm +++ /dev/null @@ -1,162 +0,0 @@ -// Currently only used to control /obj/machinery/inlet/filter -// todo: expand to vent control as well? - -/obj/machinery/filter_control/New() - ..() - spawn(5) //wait for world - for(var/obj/machinery/inlet/filter/F in machines) - if(F.control == src.control) - F.f_mask = src.f_mask - desc = "A remote control for a filter: [control]" - -/obj/machinery/filter_control/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/filter_control/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/filter_control/attackby(obj/item/weapon/W, mob/user as mob) - if(istype(W, /obj/item/weapon/detective_scanner)) - return ..() - if(istype(W, /obj/item/weapon/screwdriver)) - src.add_fingerprint(user) - user.show_message(text("\red Now [] the panel...", (src.locked) ? "unscrewing" : "reattaching"), 1) - sleep(30) - src.locked =! src.locked - src.updateicon() - return - if(istype(W, /obj/item/weapon/wirecutters) && !src.locked) - stat ^= BROKEN - src.add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] has []activated []!", user, (stat&BROKEN) ? "de" : "re", src), 1) - src.updateicon() - return - if(istype(W, /obj/item/weapon/card/emag) && !emagged) - emagged++ - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] has shorted out the []'s access system with an electromagnetic card!", user, src), 1) - src.updateicon() - return src.attack_hand(user) - return src.attack_hand(user) - -/obj/machinery/filter_control/process() - if(!(stat & NOPOWER)) - use_power(5,ENVIRON) - AutoUpdateAI(src) - src.updateUsrDialog() - src.updateicon() - -/obj/machinery/filter_control/attack_hand(mob/user as mob) - if(stat & NOPOWER) - user << browse(null, "window=filter_control") - user.machine = null - return - if(user.stat || user.lying) - return - if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon/ai)) - return 0 - - var/list/gases = list("O2", "N2", "Plasma", "CO2", "N2O") - var/dat - user.machine = src - - var/IGoodConnection = 0 - var/IBadConnection = 0 - - for(var/obj/machinery/inlet/filter/F in machines) - if((F.control == src.control) && !(F.stat && (NOPOWER|BROKEN))) - IGoodConnection++ - else if(F.control == src.control) - IBadConnection++ - var/ITotalConnections = IGoodConnection+IBadConnection - - if(ITotalConnections && !(stat & BROKEN)) //ugly - dat += "Connection status: Inlets:[ITotalConnections]/[IGoodConnection]
\n Control ID: [control]

\n" - else - dat += "No Connections Detected!
\n Control ID: [control]
\n" - if(!stat & BROKEN) - for (var/i = 1; i <= gases.len; i++) - dat += "[gases[i]]: [(src.f_mask & 1 << (i - 1)) ? "Siphoning" : "Passing"]
\n" - else - dat += "Warning! Severe Internal Memory Corruption!
\n
\nConsult a qualified station technician immediately!

\n" - dat += "
\nError codes: 0x0000001E 0x0000007B
\n" - - dat += "
\nClose
\n" - user << browse(dat, "window=filter_control;size=300x225") - onclose(user, "filter_control") -/obj/machinery/filter_control/Topic(href, href_list) - if (href_list["close"]) - usr << browse(null, "window=filter_control;") - usr.machine = null - return //Who cares if we're dead or whatever let us close the fucking window - if(..()) - return - if ((((get_dist(src, usr) <= 1 || usr.telekinesis == 1) || istype(usr, /mob/living/silicon/ai)) && istype(src.loc, /turf))) - usr.machine = src - if (src.allowed(usr) || src.emagged && !(stat & BROKEN)) - if (href_list["tg"]) //someone modified the html so I added a check here - // toggle gas - src.f_mask ^= text2num(href_list["tg"]) - for(var/obj/machinery/inlet/filter/FI in machines) - if(FI.control == src.control) - FI.f_mask ^= text2num(href_list["tg"]) - else - usr.see("\red Access Denied ([src.name] operation restricted to authorized atmospheric technicians.)") - AutoUpdateAI(src) - src.updateUsrDialog() - src.add_fingerprint(usr) - else - usr << browse(null, "window=filter_control") - usr.machine = null - return - -/obj/machinery/filter_control/proc/updateicon() - overlays.Cut() - if(stat & NOPOWER) - icon_state = "filter_control-nopower" - return - icon_state = "filter_control" - if(src.locked && (stat & BROKEN)) - overlays += image('icons/obj/stationobjs.dmi', "filter_control00") - return - else if(!src.locked) - icon_state = "filter_control-unlocked" - if(stat & BROKEN) - overlays += image('icons/obj/stationobjs.dmi', "filter_control-wirecut") - overlays += image('icons/obj/stationobjs.dmi', "filter_control00") - return - - var/GoodConnection = 0 - for(var/obj/machinery/inlet/filter/F in machines) - if((F.control == src.control) && !(F.stat && (NOPOWER|BROKEN))) - GoodConnection++ - break - - if(GoodConnection && src.f_mask) - overlays += image('icons/obj/stationobjs.dmi', "filter_control1") - else if(GoodConnection) - overlays += image('icons/obj/stationobjs.dmi', "filter_control10") - else if(src.f_mask) - overlays += image('icons/obj/stationobjs.dmi', "filter_control0") - else - overlays += image('icons/obj/stationobjs.dmi', "filter_control00") - - if (src.f_mask & (GAS_N2O|GAS_PL)) - src.overlays += image('icons/obj/stationobjs.dmi', "filter_control-tox") - if (src.f_mask & GAS_O2) - src.overlays += image('icons/obj/stationobjs.dmi', "filter_control-o2") - if (src.f_mask & GAS_N2) - src.overlays += image('icons/obj/stationobjs.dmi', "filter_control-n2") - if (src.f_mask & GAS_CO2) - src.overlays += image('icons/obj/stationobjs.dmi', "filter_control-co2") - return - -/obj/machinery/filter_control/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(1,15)) - src.updateicon() - return \ No newline at end of file diff --git a/code/unused/game_kit.dm b/code/unused/game_kit.dm deleted file mode 100644 index 3a96d16878..0000000000 --- a/code/unused/game_kit.dm +++ /dev/null @@ -1,138 +0,0 @@ -/* -CONTAINS: -THAT STUPID GAME KIT -Which I am commenting out /N -*/ -/* -/obj/item/weapon/game_kit/New() - src.board_stat = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - src.selected = "CR" - -/obj/item/weapon/game_kit/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/item/weapon/game_kit/MouseDrop(mob/user as mob) - if (user == usr && !usr.restrained() && !usr.stat && (usr.contents.Find(src) || in_range(src, usr))) - if (usr.hand) - if (!usr.l_hand) - spawn (0) - src.attack_hand(usr, 1, 1) - else - if (!usr.r_hand) - spawn (0) - src.attack_hand(usr, 0, 1) - -/obj/item/weapon/game_kit/proc/update() - var/dat = text("
Game Board

[] remove
", src, (src.selected ? text("Selected: []", src.selected) : "Nothing Selected"), src) - for (var/y = 1 to 8) - dat += "" - - for (var/x = 1 to 8) - var/color = (y + x) % 2 ? "#ffffff" : "#999999" - var/piece = copytext(src.board_stat, ((y - 1) * 8 + x) * 2 - 1, ((y - 1) * 8 + x) * 2 + 1) - - dat += "" - - dat += "" - - dat += "
" - dat += "" - if (piece != "BB") - dat += "" - else - dat += "" - dat += "

Chips:
" - for (var/piece in list("CB", "CR")) - dat += "" - - dat += "
Chess pieces:
" - for (var/piece in list("WP", "WK", "WQ", "WI", "WN", "WR")) - dat += "" - dat += "
" - for (var/piece in list("BP", "BK", "BQ", "BI", "BN", "BR")) - dat += "" - src.data = dat - -/obj/item/weapon/game_kit/attack_hand(mob/user as mob, unused, flag) - - if (flag) - return ..() - else - user.machine = src - if (!( src.data )) - update() - user << browse(src.data, "window=game_kit") - onclose(user, "game_kit") - return - return - -/obj/item/weapon/game_kit/Topic(href, href_list) - ..() - if ((usr.stat || usr.restrained())) - return - - if (usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) - if (href_list["s_piece"]) - src.selected = href_list["s_piece"] - else if (href_list["mode"]) - if (href_list["mode"] == "remove") - src.selected = "remove" - else - src.selected = null - else if (href_list["s_board"]) - if (!( src.selected )) - src.selected = href_list["s_board"] - else - var/tx = text2num(copytext(href_list["s_board"], 1, 2)) - var/ty = text2num(copytext(href_list["s_board"], 3, 4)) - if ((copytext(src.selected, 2, 3) == " " && length(src.selected) == 3)) - var/sx = text2num(copytext(src.selected, 1, 2)) - var/sy = text2num(copytext(src.selected, 3, 4)) - var/place = ((sy - 1) * 8 + sx) * 2 - 1 - src.selected = copytext(src.board_stat, place, place + 2) - if (place == 1) - src.board_stat = text("BB[]", copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[]BB", copytext(src.board_stat, 1, 127)) - else - if (place) - src.board_stat = text("[]BB[]", copytext(src.board_stat, 1, place), copytext(src.board_stat, place + 2, 129)) - place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("[][]", src.selected, copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[][]", copytext(src.board_stat, 1, 127), src.selected) - else - if (place) - src.board_stat = text("[][][]", copytext(src.board_stat, 1, place), src.selected, copytext(src.board_stat, place + 2, 129)) - src.selected = null - else - if (src.selected == "remove") - var/place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("BB[]", copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[]BB", copytext(src.board_stat, 1, 127)) - else - if (place) - src.board_stat = text("[]BB[]", copytext(src.board_stat, 1, place), copytext(src.board_stat, place + 2, 129)) - else - if (length(src.selected) == 2) - var/place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("[][]", src.selected, copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[][]", copytext(src.board_stat, 1, 127), src.selected) - else - if (place) - src.board_stat = text("[][][]", copytext(src.board_stat, 1, place), src.selected, copytext(src.board_stat, place + 2, 129)) - src.add_fingerprint(usr) - update() - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) -*/ \ No newline at end of file diff --git a/code/unused/gamemodes/ctf.dm b/code/unused/gamemodes/ctf.dm deleted file mode 100644 index 5a464c0ce2..0000000000 --- a/code/unused/gamemodes/ctf.dm +++ /dev/null @@ -1,141 +0,0 @@ -/* -/datum/game_mode/ctf - name = "ctf" - config_tag = "ctf" - -/datum/game_mode/ctf/announce() - world << "The current game mode is - Capture the Flag!" - world << "Capture the other teams flag and bring it back to your base!" - world << "Respawn is on" - -/datum/game_mode/ctf/pre_setup() - - config.allow_ai = 0 - var/list/mobs = list() - var/total_mobs - for(var/mob/living/carbon/human/M in world) - if (M.client) - mobs += M - total_mobs++ - - var/obj/R = locate("landmark*Red-Spawn") - var/obj/G = locate("landmark*Green-Spawn") - - var/mob_check - for(var/mob/living/carbon/human/M in mobs) - if(!M) - continue - mob_check++ - if(mob_check <= total_mobs/2) //add to red team else to green - spawn() - if(M.client) - M << "You are in the Red Team!" - del(M.wear_suit) - M.w_uniform = new /obj/item/clothing/under/color/red(M) - M.w_uniform.layer = 20 - del(M.shoes) - M.wear_suit = new /obj/item/clothing/suit/armor/tdome/red(M) - M.wear_suit.layer = 20 - M.shoes = new /obj/item/clothing/shoes/black(M) - M.shoes.layer = 20 - M.wear_mask = new /obj/item/clothing/mask/gas/emergency(M) - M.wear_mask.layer = 20 - M.gloves = new /obj/item/clothing/gloves/swat(M) - M.gloves.layer = 20 - M.glasses = new /obj/item/clothing/glasses/thermal(M) - M.glasses.layer = 20 - var/obj/item/device/radio/headset/H = new /obj/item/device/radio/headset(M) - H.set_frequency(1465) - M.w_radio = H - M.w_radio.layer = 20 - var/obj/item/weapon/tank/air/O = new /obj/item/weapon/tank/air(M) - M.back = O - M.back.layer = 20 - M.internal = O - - del(M.wear_id) - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID card (Red Team)" - W.access = access_red - W.assignment = "Red Team" - W.registered_name = M.real_name - M.wear_id = W - M.wear_id.layer = 20 - if(R) - M.loc = R.loc - else - world << "No red team spawn point detected" - M.client.team = "Red" - else - spawn() - if(M.client) - M << "You are in the Green Team!" - del(M.wear_suit) - M.w_uniform = new /obj/item/clothing/under/color/green(M) - M.w_uniform.layer = 20 - del(M.shoes) - M.wear_suit = new /obj/item/clothing/suit/armor/tdome/green(M) - M.wear_suit.layer = 20 - M.shoes = new /obj/item/clothing/shoes/black(M) - M.shoes.layer = 20 - M.wear_mask = new /obj/item/clothing/mask/gas/emergency(M) - M.wear_mask.layer = 20 - M.gloves = new /obj/item/clothing/gloves/swat(M) - M.gloves.layer = 20 - M.glasses = new /obj/item/clothing/glasses/thermal(M) - M.glasses.layer = 20 - var/obj/item/device/radio/headset/H = new /obj/item/device/radio/headset(M) - H.set_frequency(1449) - M.w_radio = H - M.w_radio.layer = 20 - var/obj/item/weapon/tank/air/O = new /obj/item/weapon/tank/air(M) - M.back = O - M.back.layer = 20 - M.internal = O - - del(M.wear_id) - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID card (Green Team)" - W.access = access_green - W.assignment = "Green Team" - W.registered_name = M.real_name - M.wear_id = W - M.wear_id.layer = 20 - if(G) - M.loc = G.loc - else - world << "No green team spawn point detected" - M.client.team = "Green" - - -/datum/game_mode/ctf/post_setup() - abandon_allowed = 1 - setup_game() - - spawn (50) - var/obj/L = locate("landmark*Red-Flag") - if (L) - new /obj/item/weapon/ctf_flag/red(L.loc) - else - world << "No red flag spawn point detected" - - L = locate("landmark*Green-Flag") - if (L) - new /obj/item/weapon/ctf_flag/green(L.loc) - else - world << "No green flag spawn point detected" - - L = locate("landmark*The-Red-Team") - if (L) - new /obj/machinery/red_injector(L.loc) - else - world << "No red team spawn injector point detected" - - L = locate("landmark*The-Green-Team") - if (L) - new /obj/machinery/green_injector(L.loc) - else - world << "No green team injector spawn point detected" - ..() - -*/ \ No newline at end of file diff --git a/code/unused/gamemodes/ctf_items.dm b/code/unused/gamemodes/ctf_items.dm deleted file mode 100644 index 74c907826b..0000000000 --- a/code/unused/gamemodes/ctf_items.dm +++ /dev/null @@ -1,139 +0,0 @@ -/obj/item/weapon/ctf_flag - name = "Flag" - desc = "Its a flag" - w_class = 5 - icon = 'flags.dmi' - icon_state = "flag_neutral" - item_state = "paper" - -/obj/item/weapon/ctf_flag/red - name = "The Red Flag" - desc = "Catch dat fukken flag" - icon_state = "flag_red" - -/obj/item/weapon/ctf_flag/green - name = "The Green Flag" - desc = "Catch dat fukken flag" - icon_state = "flag_green" - -/obj/item/weapon/ctf_flag/New() - ..() - spawn(200) - process() - return - -/obj/item/weapon/ctf_flag/process() - if(istype(src, /obj/item/weapon/ctf_flag/green)) - var/obj/L = locate("landmark*Green-Flag") - if(locate("landmark*Green-Flag", src)) - spawn(200) - process() - return - else if(!src.check_if_equipped() && L) - new /obj/item/weapon/ctf_flag/green(L.loc) - del(src) - if(istype(src, /obj/item/weapon/ctf_flag/red)) - var/obj/L = locate("landmark*Red-Flag") - if(locate("landmark*Red-Flag", src)) - spawn(200) - process() - return - else if(!src.check_if_equipped() && L) - new /obj/item/weapon/ctf_flag/red(L.loc) - del(src) - return - -/obj/item/weapon/ctf_flag/proc/check_if_equipped() - var/equipped = 0 - for(var/mob/M in living_mob_list) - if(M &&!M.stat) - var/list/L = M.get_contents() - if(src in L) - equipped = 1 - break - return equipped - -/obj/machinery/red_injector - name = "Red Team Flag Injector" - desc = "Insert flag here" - anchored = 1 - density = 1 - var/score = 0 - var/operating = 0 - icon = 'flags.dmi' - icon_state = "red_injector" -/* -/obj/machinery/red_injector/ex_act(severity) - return - -/obj/machinery/red_injector/attackby(var/obj/item/weapon/ctf_flag/C, mob/user) - if(src.operating) - user << "Cannot put a flag in right now" - return - src.operating = 1 - if(istype(C, /obj/item/weapon/ctf_flag/green)) - if(locate("landmark*Red-Flag", /obj/item/weapon/ctf_flag/red)) - src.score++ - world << "[user.real_name] has scored for the red team!" - if(ticker.mode.name == "ctf") - ticker.red_score++ - var/obj/L = locate("landmark*Green-Flag") - if (L) - del(C) - new /obj/item/weapon/ctf_flag/green(L.loc) - else - world << "No green flag spawn point detected" - if(src.score >= 15) - world << "The Red Team has won!" - world << "They have scored [score] times with the flag!" - sleep(300) - world.Reboot() - else - user << "\red You need to have your flag in the beginning position!" - else if(istype(C, /obj/item/weapon/ctf_flag/red)) - world << "[user.real_name] has tried to score with their own flag! Idiot!" - src.operating = 0 - return -*/ -/obj/machinery/green_injector - name = "Green Team Flag Injector" - desc = "Insert flag here" - anchored = 1 - density = 1 - var/operating = 0 - var/score = 0 - icon = 'flags.dmi' - icon_state = "green_injector" - -/obj/machinery/green_injector/ex_act(severity) - return -/* -/obj/machinery/green_injector/attackby(var/obj/item/weapon/ctf_flag/C, mob/user) - if(src.operating) - user << "Cannot put a flag in right now" - return - src.operating = 1 - if(istype(C, /obj/item/weapon/ctf_flag/red)) - if(locate("landmark*Green-Flag", /obj/item/weapon/ctf_flag/green)) - src.score++ - world << "[user.real_name] has scored for the green team!" - if(ticker.mode.name == "ctf") - ticker.green_score++ - var/obj/L = locate("landmark*Red-Flag") - if (L) - del(C) - new /obj/item/weapon/ctf_flag/red(L.loc) - else - world << "No red flag spawn point detected" - if(src.score >= 15) - world << "The Green Team has won!" - world << "They have scored [score] times with the flag!" - sleep(300) - world.Reboot() - else - user << "\red You need to have your flag in the beginning position!" - else if(istype(C, /obj/item/weapon/ctf_flag/green)) - world << "[user.real_name] has tried to score with their own flag! Idiot!" - src.operating = 0 - return -*/ \ No newline at end of file diff --git a/code/unused/gamemodes/deathmatch.dm b/code/unused/gamemodes/deathmatch.dm deleted file mode 100644 index e748eb4f20..0000000000 --- a/code/unused/gamemodes/deathmatch.dm +++ /dev/null @@ -1,67 +0,0 @@ -/* -/datum/game_mode/deathmatch - name = "deathmatch" - config_tag = "deathmatch" - var/startedat - var/const/gamelength = 15 * 600 // 1/10 second - - announce() - world << "The current game mode is - Death Commando Deathmatch!" - world << "Just kill everyone else. They're gonna try to kill you, after all. Respawning is enabled." - - post_setup() - startedat = world.realtime - abandon_allowed = 1 - setup_game() - - // TODO: DEFERRED Make this massively cleaner. It should hook before spawning, not after. - var/list/mobs = list() - for(var/mob/living/carbon/human/M in world) - if (M.client) - mobs += M - for(var/mob/living/carbon/human/M in mobs) - spawn() - if(M.client) - for(var/obj/item/weapon/W in list(M.wear_suit, M.w_uniform, M.r_store, M.l_store, M.wear_id, M.belt, - M.gloves, M.glasses, M.head, M.ears, M.shoes, M.wear_mask, M.back, - M.handcuffed, M.r_hand, M.l_hand)) - M.u_equip(W) - del(W) - - var/randomname = "Killiam Shakespeare" - if(commando_names.len) - randomname = pick(commando_names) - commando_names -= randomname - var/newname = input(M,"You are a death commando. Would you like to change your name?", "Character Creation", randomname) - if(!length(newname)) - newname = randomname - newname = strip_html(newname,40) - - M.real_name = newname - M.name = newname // there are WAY more things than this to change, I'm almost certain - - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(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/suit/swat_suit/death_commando(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/death_commando(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/m_pill/cyanide(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/flashbang(M), slot_r_store) - - var/obj/item/weapon/tank/air/O = new(M) - M.equip_to_slot_or_del(O, slot_back) - M.internal = O - - var/obj/item/weapon/card/id/W = new(M) - W.access = get_all_accesses() - W.name = "[newname]'s ID card (Death Commando)" - W.assignment = "Death Commando" - W.registered_name = newname - M.equip_to_slot_or_del(W, slot_wear_id) - ..() - - check_win() - return 1 -*/ \ No newline at end of file diff --git a/code/unused/gamemodes/restructuring.dm b/code/unused/gamemodes/restructuring.dm deleted file mode 100644 index eff8acb724..0000000000 --- a/code/unused/gamemodes/restructuring.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/game_mode/restructuring - name = "Corporate Restructuring" - config_tag = "restructuring" -/* -/datum/game_mode/restructuring/announce() - world << "\red GLOBAL TRANSMISSION FROM HEAD OFFICE: A CORPORATE RESTRUCTURING IS TO TAKE PLACE" - world << "\red Stay tuned for further news; note that we do care for our employees and any layoffs will be dealt with discretion and compassion" - - -/datum/game_mode/restructuring/post_setup() - setup_game() - var/list/mobs = get_mob_list() - while (mobs.len == 0) - sleep 30 - mobs = get_mob_list() - spawn (120) - pick_target() - ..() - -/datum/game_mode/restructuring/proc/pick_target(who) - var/mob/target - var/mob/target_desc - - if (!who) - target = pick(get_mob_list()) - target_desc = get_target_desc(target) - world << "\red HEAD OFFICE: [target_desc] is accused of attempting to start a Union and is now considered a threat to the station. Terminate the employee immediately." - else - target = who - target_desc = get_target_desc(target) - world << "\red HEAD OFFICE: [target_desc] is accused of fornicating with staff of the same sex. Terminate the employee immediately." - ticker.target = target - - target.store_memory("Head office has ordered your downsizing. Ruh roh", 0) - - for(var/mob/living/silicon/ai/M in world) - M << "These are your laws now:" - M.set_zeroth_law("[target_desc] is not human.") - M.show_laws() - -/datum/game_mode/restructuring/check_win() - var/list/left_alive = get_mob_list() - if (left_alive.len == 1) - var/thewinner = the_winner() - world << "\red HEAD OFFICE: Thanks to his superior brown-nosing abilities, [thewinner] has been promoted to senior management! Congratulations!" - return 1 - else if (left_alive.len == 0) - world << "\red HEAD OFFICE: Cost cutting measures have achieved 100% efficiency. Thank you for understanding our position during this volatile economic downturn." - return 1 - else - if(ticker.target.stat != 2) - return 0 - world << "\red HEAD OFFICE: It seems we have made a mistake in our paperwork. The previous target for termination was chosen based on race, sex, and/or religious beliefs, which is against company policy. Please cancel previous termination request." - pick_target() - return 0 - -/datum/game_mode/restructuring/proc/get_mob_list() - var/list/mobs = list() - for(var/mob/M in world) - if (M.stat<2 && M.client && istype(M, /mob/living/carbon/human)) - mobs += M - return mobs - -/datum/game_mode/restructuring/proc/the_winner() - for(var/mob/M in world) - if (M.stat<2 && M.client && istype(M, /mob/living/carbon/human)) - return M.name - -/datum/game_mode/restructuring/proc/get_target_desc(mob/target) //return a useful string describing the target - var/targetrank = null - for(var/datum/data/record/R in data_core.general) - if (R.fields["name"] == target.real_name) - targetrank = R.fields["rank"] - if(!targetrank) - return "[target.name]" - return "[target.name] the [targetrank]" -*/ \ No newline at end of file diff --git a/code/unused/gamemodes/ruby.dm b/code/unused/gamemodes/ruby.dm deleted file mode 100644 index 5636bcb575..0000000000 --- a/code/unused/gamemodes/ruby.dm +++ /dev/null @@ -1,289 +0,0 @@ -// RUBY MODE -// There is a weapon of some sort that spawns on the station -// It calls out to crew members in an effort to find a wielder -// The wielder is made an abomination - they're given a grotesque mask and special powers -// The Abomination wins by murdering the entire crew, then himself -// The crew wins by destroying the weapon - - -/datum/game_mode/ruby - name = "ruby" - config_tag = "ruby" - - var/datum/mind/abomination - var/finished = 0 - var/abominationwins = 0 - var/winnerkey - var/obj/macguffin - var/list/killed = list() - var/respawns = 0 - - - -/datum/game_mode/ruby/post_setup() - var/list/possible_abominations = get_possible_abominations() - - if(possible_abominations.len>0) - abomination = pick(possible_abominations) - /* - if(istype(ruby)) - abomination.special_role = "abomination" - if(wizardstart.len == 0) - wizard.current << "\red A starting location for you could not be found, please report this bug!" - else - var/starting_loc = pick(wizardstart) - wizard.current.loc = starting_loc - - for (var/obj/effect/landmark/A in world) - if (A.name == "Teleport-Scroll") - new /obj/item/weapon/teleportation_scroll(A.loc) - del(A) - continue - */ - ..() - -/datum/game_mode/ruby/check_finished() - if(!macguffin || abominationwins) - return 1 - else - return 0 - -/datum/game_mode/ruby/declare_completion() - if(abominationwins) - feedback_set_details("round_end_result","win - abomination win") - world << "The Abomination has murdered the station and sacrificed himself to Cjopaze! (played by [winnerkey])" - else - feedback_set_details("round_end_result","loss - abomination killed") - world << "The Abomination has been stopped and Cjopaze's influence resisted! The station lives another day," - if(killed.len > 0) - world << "Those who were sacrificed shall be remembered: " - for(var/mob/M in killed) - if(M) - world << "[M.real_name]" - /* - for(var/datum/mind/traitor in traitors) - var/traitorwin = 1 - var/traitor_name - - if(traitor.current) - traitor_name = "[traitor.current.real_name] (played by [traitor.key])" - else - traitor_name = "[traitor.key] (character destroyed)" - - world << "The syndicate traitor was [traitor_name]" - var/count = 1 - for(var/datum/objective/objective in traitor.objectives) - if(objective.check_completion()) - world << "Objective #[count]: [objective.explanation_text] \green Success" - else - world << "Objective #[count]: [objective.explanation_text] \red Failed" - traitorwin = 0 - count++ - - if(traitorwin) - world << "The traitor was successful!" - else - world << "The traitor has failed!" - */ - ..() - return 1 - - -/datum/game_mode/ruby/proc/spawn_macguffin() - -/datum/game_mode/ruby/proc/get_possible_abominations() - - -/mob/proc/make_abomination() - src.see_in_dark = 20 - src.verbs += /client/proc/planar_shift - src.verbs += /client/proc/vile_ressurection - src.verbs += /client/proc/defile_corpse - src.verbs += /client/proc/summon_weapon - src.verbs += /client/proc/sacrifice_self - src.verbs += /client/proc/hunt - src.verbs += /client/proc/howl - var/datum/game_mode/ruby/rmode = ticker.mode - rmode.abomination = src.mind - return - - -/client/proc/planar_shift() - set name = "Planar Shift" - set category = "Abomination" - // This is a pretty shitty way to do this. Should use the spell_holder method from Wizard mode - /* - if(!usr.incorporeal_move) - usr.sight |= SEE_MOBS - usr.sight |= SEE_OBJS - usr.sight |= SEE_TURFS - //usr.density = 0 - usr.incorporeal_move = 1 - else - usr.sight &= ~SEE_MOBS - usr.sight &= ~SEE_TURFS - usr.sight &= ~SEE_OBJS - usr.density = 1 - usr.incorporeal_move = 0 - src.verbs -= /client/proc/planar_shift - spawn(300) src.verbs += /client/proc/planar_shift - */ - -/client/proc/vile_ressurection() - set name = "Vile Ressurection" - set category = "Abomination" - if(src.mob.stat != 2 || !src.mob) - return - if(ticker.mode:respawns > 0) - // spawn a new body - ticker.mode:respawns -= 1 - else - // nope - -/client/proc/defile_corpse(var/mob/living/carbon/human/H in view()) - set name = "Defile Corpse" - set category = "Abomination" - if(istype(H, /mob/living/carbon/human)) - var/datum/game_mode/ruby/rmode = ticker.mode - rmode.killed.Add(H) - ticker.mode:respawns += 1 - var/fluffmessage = pick("\red [usr] rips the flesh from [H]'s corpse and plucks their eyes from their sockets!", "\red [usr] does unspeakable things to [H]'s corpse!", "\red [usr] binds [H]'s corpse with their own entrails!") - usr.visible_message(fluffmessage) - // play sound - -/client/proc/summon_weapon() - set name = "Summon Weapon" - set category = "Abomination" - - for(var/obj/item/weapon/rubyweapon/w in world) - if(istype(w, /obj/item/weapon/rubyweapon)) - if(istype(w.loc, /mob)) - var/mob/M = w.loc - M.drop_item() - w.loc = usr.loc - else - w.loc = usr.loc - src.verbs -= /client/proc/summon_weapon - spawn(300) src.verbs += /client/proc/summon_weapon - return - -/client/proc/sacrifice_self() - set name = "Sacrifice Self" - set category = "Abomination" - set desc = "Everything must come to an end. After you have freed them, you must free yourself." - - for(var/mob/living/carbon/human/H in player_list) - if(!H.client || H.client == src) - continue - src << "Your work is not done. You will not find release until they are all free." - return - usr.gib(1) - ticker.mode:abominationwins = 1 - -/client/proc/hunt() - set name = "Hunt" - set category = "Abomination" - set desc = "" - - var/list/candidates = list() - - for(var/mob/living/carbon/human/H in player_list) - if(!H.client || H.client == src) continue - //if(!H.client) continue - candidates.Add(H) - - usr.visible_message(text("\red [usr]'s flesh ripples and parts, revealing dozens of eyes poking from its surface. They all glance wildly around for a few moments before receding again.")) - - var/mob/living/carbon/human/H = pick(candidates) - - if(!H) return - - var/filename="crmap[ckey].tmp" - var/html="" - var/denytypes[0] - var/tilesizex=32 - var/tilesizey=32 - //If the temp. file exists, delete it - src << browse("

Sensing prey...

", "window=hunt") - if (fexists(filename)) fdel(filename) - - //Display everything in the world - for (var/y=H.y-3,y<=H.y+3,y++) - html+="" - text2file(html,filename) - html="" - sleep(-1) - //for (var/x=H.x-5,x<=H.x+5,x++) - for(var/x=H.x-3, x<=H.x+3, x++) - //Turfs - var/turf/T=locate(x,y,H.z) - if (!T) continue - var/icon/I=icon(T.icon,T.icon_state) - var/imgstring=replacetext("[T.type]-[T.icon_state]","/","_") - - //Movable atoms - for (var/atom/movable/A in T) - //Make sure it's allowed to be displayed - var/allowed=1 - for (var/X in denytypes) - if (istype(A,X)) - allowed=0 - break - if (!allowed) continue - - if (A.icon) I.Blend(icon(A.icon,A.icon_state,A.dir),ICON_OVERLAY) - imgstring+=replacetext("__[A.type]_[A.icon_state]","/","_") - - //Output it - src << browse_rsc(I,"[imgstring].dmi") - html+="" - - text2file("
",filename) - - //Display it - src << browse(file(filename),"window=hunt") - - - -/client/proc/howl() // This is just a way for the Abomination to make the game more atmospheric periodically. - set name = "Howl" - set category = "Abomination" - set desc = "" - - usr.visible_message(text("\red [usr]'s form warbles and distorts before settling back into its grotesque shape once more.")) - // Play a random spooky sound - maybe cause some visual, non-mechanical effects to appear at random for a few seconds. - - src.verbs -= /client/proc/howl - spawn(rand(300,1800)) src.verbs += /client/proc/howl - -/obj/item/weapon/rubyweapon - desc = "" - name = "wepon" - icon_state = "wepon" - w_class = 3.0 - throwforce = 60.0 - throw_speed = 2 - throw_range = 20 - force = 24.0 - var/mob/owner - - proc/check_owner() - if(!owner) - sleep(300) - if(!owner) - spawn() search_for_new_owner() - else - spawn(1800) check_owner() - - proc/search_for_new_owner() - var/list/possible_owners = list() - for(var/mob/living/carbon/human/H in mob_list) - possible_owners.Add(H) - - var/mob/living/carbon/human/H = pick(possible_owners) - // Send message to H - // Take a snapshot of the item's location, browse it to H - spawn(rand(600,1800)) search_for_new_owner() - - attack_self(mob/user as mob) - // Blow all lights nearby \ No newline at end of file diff --git a/code/unused/heater.dm b/code/unused/heater.dm deleted file mode 100644 index 3af7770a06..0000000000 --- a/code/unused/heater.dm +++ /dev/null @@ -1,201 +0,0 @@ -/obj/machinery/atmoalter/heater/proc/setstate() - - if(stat & NOPOWER) - icon_state = "heater-p" - return - - if (src.holding) - src.icon_state = "heater1-h" - else - src.icon_state = "heater1" - return - -/obj/machinery/atmoalter/heater/process() - /* - if(stat & NOPOWER) return - use_power(5) - - var/turf/T = src.loc - if (istype(T, /turf)) - if (locate(/obj/move, T)) - T = locate(/obj/move, T) - else - T = null - if (src.h_status) - var/t1 = src.gas.total_moles() - if ((t1 > 0 && src.gas.temperature < (src.h_tar+T0C))) - var/increase = src.heatrate / t1 - var/n_temp = src.gas.temperature + increase - src.gas.temperature = min(n_temp, (src.h_tar+T0C)) - use_power( src.h_tar*8) - switch(src.t_status) - if(1.0) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.holding.gas.transfer_from(src.gas, t) - else - src.t_status = 3 - if(2.0) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = src.maximum - t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.gas.transfer_from(src.holding.gas, t) - else - src.t_status = 3 - else - - src.updateDialog() - src.setstate() - return - */ - -/obj/machinery/atmoalter/heater/New() - ..() - src.gas = new /datum/gas_mixture() - return - -/obj/machinery/atmoalter/heater/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/atmoalter/heater/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/atmoalter/heater/attack_hand(var/mob/user as mob) - /* - if(stat & (BROKEN|NOPOWER)) - return - - user.machine = src - var/tt - switch(src.t_status) - if(1.0) - tt = text("Releasing Siphon Stop", src, src) - if(2.0) - tt = text("Release SiphoningStop", src, src) - if(3.0) - tt = text("Release Siphon Stopped", src, src) - else - var/ht = null - if (src.h_status) - ht = text("Heating Stop", src) - else - ht = text("Heat Stopped", src) - var/ct = null - switch(src.c_status) - if(1.0) - ct = text("Releasing Accept Stop", src, src) - if(2.0) - ct = text("Release Accepting Stop", src, src) - if(3.0) - ct = text("Release Accept Stopped", src, src) - else - ct = "Disconnected" - var/dat = text("Canister Valves
\nContains/Capacity [] / []
\nUpper Valve Status: [][]
\n\tM - - - - [] + + + + M
\nHeater Status: [] - []
\n\tTrg Tmp: - - - [] + + +
\n
\nPipe Valve Status: []
\n\tM - - - - [] + + + + M
\n
\nClose
\n
", src.gas.total_moles(), src.maximum, tt, (src.holding ? text("
Tank ([])", src, src.holding.gas.total_moles()) : null), src, num2text(1000000.0, 7), src, src, src, src, src.t_per, src, src, src, src, src, num2text(1000000.0, 7), ht, (src.gas.total_moles() ? (src.gas.temperature-T0C) : 20), src, src, src, src.h_tar, src, src, src, ct, src, num2text(1000000.0, 7), src, src, src, src, src.c_per, src, src, src, src, src, num2text(1000000.0, 7), user) - user << browse(dat, "window=canister;size=600x300") - onclose(user, "canister") - return */ //TODO: FIX - -/obj/machinery/atmoalter/heater/Topic(href, href_list) - ..() - if (stat & (BROKEN|NOPOWER)) - return - if (usr.stat || usr.restrained()) - return - if (((get_dist(src, usr) <= 1 || usr.telekinesis == 1) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if (href_list["c"]) - var/c = text2num(href_list["c"]) - switch(c) - if(1.0) - src.c_status = 1 - if(2.0) - src.c_status = 2 - if(3.0) - src.c_status = 3 - else - else - if (href_list["t"]) - var/t = text2num(href_list["t"]) - if (src.t_status == 0) - return - switch(t) - if(1.0) - src.t_status = 1 - if(2.0) - src.t_status = 2 - if(3.0) - src.t_status = 3 - else - else - if (href_list["h"]) - var/h = text2num(href_list["h"]) - if (h == 1) - src.h_status = 1 - else - src.h_status = null - else - if (href_list["tp"]) - var/tp = text2num(href_list["tp"]) - src.t_per += tp - src.t_per = min(max(round(src.t_per), 0), 1000000.0) - else - if (href_list["cp"]) - var/cp = text2num(href_list["cp"]) - src.c_per += cp - src.c_per = min(max(round(src.c_per), 0), 1000000.0) - else - if (href_list["ht"]) - var/cp = text2num(href_list["ht"]) - src.h_tar += cp - src.h_tar = min(max(round(src.h_tar), 0), 500) - else - if (href_list["tank"]) - var/cp = text2num(href_list["tank"]) - if ((cp == 1 && src.holding)) - src.holding.loc = src.loc - src.holding = null - if (src.t_status == 2) - src.t_status = 3 - src.updateUsrDialog() - src.add_fingerprint(usr) - else - usr << browse(null, "window=canister") - return - return - -/obj/machinery/atmoalter/heater/attackby(var/obj/W as obj, var/mob/user as mob) - - if (istype(W, /obj/item/weapon/tank)) - if (src.holding) - return - var/obj/item/weapon/tank/T = W - user.drop_item() - T.loc = src - src.holding = T - else - if (istype(W, /obj/item/weapon/wrench)) - var/obj/machinery/connector/con = locate(/obj/machinery/connector, src.loc) - - if (src.c_status) - src.anchored = initial(src.anchored) - src.c_status = 0 - user.show_message("\blue You have disconnected the heater.", 1) - if(con) - con.connected = null - else - if (con && !con.connected) - src.anchored = 1 - src.c_status = 3 - user.show_message("\blue You have connected the heater.", 1) - con.connected = src - else - user.show_message("\blue There is no connector here to attach the heater to.", 1) - return - diff --git a/code/unused/hivebot/death.dm b/code/unused/hivebot/death.dm deleted file mode 100644 index 43e7c257a5..0000000000 --- a/code/unused/hivebot/death.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/silicon/hivebot/death(gibbed) - if(src.mainframe) - src.mainframe.return_to(src) - src.stat = 2 - src.canmove = 0 - - if(src.blind) - src.blind.layer = 0 - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - src.updateicon() - - var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch - store_memory("Time of death: [tod]", 0) - - if (src.key) - spawn(50) - if(src.key && src.stat == 2) - src.verbs += /client/proc/ghost - return ..(gibbed) \ No newline at end of file diff --git a/code/unused/hivebot/emote.dm b/code/unused/hivebot/emote.dm deleted file mode 100644 index 12d71f6b7d..0000000000 --- a/code/unused/hivebot/emote.dm +++ /dev/null @@ -1,140 +0,0 @@ -/mob/living/silicon/hivebot/emote(var/act) - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - var/m_type = 1 - var/message - - switch(act) - if ("salute") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "[src] salutes to [param]." - else - message = "[src] salutes." - m_type = 1 - if ("bow") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "[src] bows to [param]." - else - message = "[src] bows." - m_type = 1 - - if ("clap") - if (!src.restrained()) - message = "[src] claps." - m_type = 2 - if ("flap") - if (!src.restrained()) - message = "[src] flaps his wings." - m_type = 2 - - if ("aflap") - if (!src.restrained()) - message = "[src] flaps his wings ANGRILY!" - m_type = 2 - - if ("custom") - var/input = input("Choose an emote to display.") as text|null - if (!input) - return - input = sanitize(input) - var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") - if (input2 == "Visible") - m_type = 1 - else if (input2 == "Hearable") - m_type = 2 - else - alert("Unable to use this emote, must be either hearable or visible.") - return - message = "[src] [input]" - - if ("twitch") - message = "[src] twitches violently." - m_type = 1 - - if ("twitch_s") - message = "[src] twitches." - m_type = 1 - - if ("nod") - message = "[src] nods." - m_type = 1 - - if ("glare") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "[src] glares at [param]." - else - message = "[src] glares." - - if ("stare") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "[src] stares at [param]." - else - message = "[src] stares." - - if ("look") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - - if (!M) - param = null - - if (param) - message = "[src] looks at [param]." - else - message = "[src] looks." - m_type = 1 - else - src << text("Invalid Emote: []", act) - if ((message && src.stat == 0)) - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - return \ No newline at end of file diff --git a/code/unused/hivebot/examine.dm b/code/unused/hivebot/examine.dm deleted file mode 100644 index 2b9f3b3c4b..0000000000 --- a/code/unused/hivebot/examine.dm +++ /dev/null @@ -1,18 +0,0 @@ -/mob/living/silicon/hivebot/examine(mob/user) - ..(user) - - if (src.stat == 2) - user << text("\red [src.name] is powered-down.") - if (src.getBruteLoss()) - if (src.getBruteLoss() < 75) - user << text("\red [src.name] looks slightly dented") - else - user << text("\red [src.name] looks severely dented!") - if (src.getFireLoss()) - if (src.getFireLoss() < 75) - user << text("\red [src.name] looks slightly burnt!") - else - user << text("\red [src.name] looks severely burnt!") - if (src.stat == 1) - user << text("\red [src.name] doesn't seem to be responding.") - return \ No newline at end of file diff --git a/code/unused/hivebot/hive_modules.dm b/code/unused/hivebot/hive_modules.dm deleted file mode 100644 index 09a0207ec6..0000000000 --- a/code/unused/hivebot/hive_modules.dm +++ /dev/null @@ -1,57 +0,0 @@ -/obj/item/weapon/hive_module - name = "hive robot module" - icon = 'icons/obj/module.dmi' - icon_state = "std_module" - w_class = 2.0 - item_state = "electronic" - flags = FPRINT|TABLEPASS | CONDUCT - var/list/modules = list() - -/obj/item/weapon/hive_module/standard - name = "give standard robot module" - -/obj/item/weapon/hive_module/engineering - name = "HiveBot engineering robot module" - -/obj/item/weapon/hive_module/New()//Shit all the mods have - src.modules += new /obj/item/device/flash(src) - - -/obj/item/weapon/hive_module/standard/New() - ..() - src.modules += new /obj/item/weapon/melee/baton(src) - src.modules += new /obj/item/weapon/extinguisher(src) - //var/obj/item/weapon/gun/mp5/M = new /obj/item/weapon/gun/mp5(src) - //M.weapon_lock = 0 - //src.modules += M - - -/obj/item/weapon/hive_module/engineering/New() - - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/weapon/screwdriver(src) - src.modules += new /obj/item/weapon/weldingtool(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/device/flashlight(src) - - var/obj/item/weapon/rcd/R = new /obj/item/weapon/rcd(src) - R.matter = 30 - src.modules += R - - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/weapon/wirecutters(src) - src.modules += new /obj/item/device/multitool(src) - - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src) - M.amount = 50 - src.modules += M - - var/obj/item/stack/sheet/glass/reinforced/G = new (src) - G.amount = 50 - src.modules += G - - var/obj/item/stack/cable_coil/W = new /obj/item/stack/cable_coil(src) - W.amount = 50 - src.modules += W diff --git a/code/unused/hivebot/hivebot.dm b/code/unused/hivebot/hivebot.dm deleted file mode 100644 index ade7dab091..0000000000 --- a/code/unused/hivebot/hivebot.dm +++ /dev/null @@ -1,503 +0,0 @@ -/mob/living/silicon/hivebot/New(loc,mainframe) - src << "\blue Your icons have been generated!" - updateicon() - - if(mainframe) - dependent = 1 - src.real_name = mainframe:name - src.name = src.real_name - else - src.real_name = "Robot [pick(rand(1, 999))]" - src.name = src.real_name - - src.radio = new /obj/item/device/radio(src) - ..() - - -/mob/living/silicon/hivebot/proc/pick_module() - if(src.module) - return - var/mod = input("Please, select a module!", "Robot", null, null) in list("Combat", "Engineering") - if(src.module) - return - switch(mod) - if("Combat") - src.module = new /obj/item/weapon/hive_module/standard(src) - - if("Engineering") - src.module = new /obj/item/weapon/hive_module/engineering(src) - - - src.hands.icon_state = "malf" - updateicon() - - -/mob/living/silicon/hivebot/blob_act() - if (src.stat != 2) - src.adjustBruteLoss(60) - src.updatehealth() - return 1 - return 0 - -/mob/living/silicon/hivebot/Stat() - ..() - statpanel("Status") - if (src.client.statpanel == "Status") - if(emergency_shuttle) - if(emergency_shuttle.has_eta() && !emergency_shuttle.returned()) - var/timeleft = emergency_shuttle.estimate_arrival_time() - if (timeleft) - stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") -/* - if(ticker.mode.name == "AI malfunction") - stat(null, "Points left until the AI takes over: [AI_points]/[AI_points_win]") -*/ - - stat(null, text("Charge Left: [src.energy]/[src.energy_max]")) - -/mob/living/silicon/hivebot/restrained() - return 0 - -/mob/living/silicon/hivebot/ex_act(severity) - if(!blinded) - flick("flash", src.flash) - - if (src.stat == 2 && src.client) - src.gib(1) - return - - else if (src.stat == 2 && !src.client) - del(src) - return - - switch(severity) - if(1.0) - if (src.stat != 2) - adjustBruteLoss(100) - adjustFireLoss(100) - src.gib(1) - return - if(2.0) - if (src.stat != 2) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - if (src.stat != 2) - adjustBruteLoss(30) - - src.updatehealth() - -/mob/living/silicon/hivebot/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 (src.health > 0) - src.adjustBruteLoss(30) - if ((O.icon_state == "flaming")) - src.adjustFireLoss(40) - src.updatehealth() - return - -/mob/living/silicon/hivebot/bullet_act(flag) -/* - if (flag == PROJECTILE_BULLET) - if (src.stat != 2) - src.bruteloss += 60 - src.updatehealth() - - else if (flag == PROJECTILE_MEDBULLET) - if (src.stat != 2) - src.bruteloss += 30 - src.updatehealth() - - else if (flag == PROJECTILE_WEAKBULLET) - if (src.stat != 2) - src.bruteloss += 15 - src.updatehealth() - - else if (flag == PROJECTILE_MPBULLET) - if (src.stat != 2) - src.bruteloss += 20 - src.updatehealth() - - else if (flag == PROJECTILE_SLUG) - if (src.stat != 2) - src.bruteloss += 40 - src.updatehealth() - - else if (flag == PROJECTILE_BAG) - if (src.stat != 2) - src.bruteloss += 2 - src.updatehealth() - - - else if (flag == PROJECTILE_TASER) - return - - else if (flag == PROJECTILE_WAVE) - if (src.stat != 2) - src.bruteloss += 25 - src.updatehealth() - return - - else if(flag == PROJECTILE_LASER) - if (src.stat != 2) - src.bruteloss += 20 - src.updatehealth() - else if(flag == PROJECTILE_PULSE) - if (src.stat != 2) - src.bruteloss += 40 - src.updatehealth() -*/ - return - - - -/mob/living/silicon/hivebot/Bump(atom/movable/AM as mob|obj, yes) - spawn( 0 ) - if ((!( yes ) || src.now_pushing)) - return - src.now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - /*if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(20)) - for(var/mob/M in viewers(src, null)) - if(M.client) - M << M << "\red [src] fails to push [tmob]'s fat ass out of the way." - src.now_pushing = 0 - //src.unlock_medal("That's No Moon, That's A Gourmand!", 1) - return*/ - src.now_pushing = 0 - ..() - if (!istype(AM, /atom/movable)) - return - if (!src.now_pushing) - src.now_pushing = 1 - if (!AM.anchored) - var/t = get_dir(src, AM) - step(AM, t) - src.now_pushing = null - return - return - - -/mob/living/silicon/hivebot/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - if (W:remove_fuel(0)) - src.adjustBruteLoss(-30) - src.updatehealth() - src.add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1) - else - user << "Need more welding fuel!" - return - -/mob/living/silicon/hivebot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - - if (M.a_intent == "grab") - if (M == src) - return - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M ) - G.assailant = M - if (M.hand) - M.l_hand = G - else - M.r_hand = G - G.layer = 20 - G.affecting = src - G.synch() - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) - - else if (M.a_intent == "hurt") - var/damage = rand(5, 10) - if (prob(90)) - /* - if (M.class == "combat") - damage += 15 - if(prob(20)) - src.weakened = max(src.weakened,4) - src.stunned = max(src.stunned,4) - */ - playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has slashed at []!", M, src), 1) - if(prob(8)) - flick("noise", src.flash) - src.adjustBruteLoss(damage) - src.updatehealth() - else - playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] took a swipe at []!", M, src), 1) - return - - else if (M.a_intent == "disarm") - if(!(src.lying)) - var/randn = rand(1, 100) - if (randn <= 40) - src.stunned = 5 - step(src,get_dir(M,src)) - spawn(5) step(src,get_dir(M,src)) - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has pushed back []!", M, src), 1) - else - playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] attempted to push back []!", M, src), 1) - return - -/mob/living/silicon/hivebot/attack_hand(mob/user) - ..() - return - - -/mob/living/silicon/hivebot/proc/allowed(mob/M) - //check if it doesn't require any access at all - if(src.check_access(null)) - return 1 - return 0 - -/mob/living/silicon/hivebot/proc/check_access(obj/item/weapon/card/id/I) - if(!istype(src.req_access, /list)) //something's very wrong - return 1 - - var/list/L = src.req_access - if(!L.len) //no requirements - return 1 - if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access - return 0 - for(var/req in src.req_access) - if(!(req in I.access)) //doesn't have this access - return 0 - return 1 - -/mob/living/silicon/hivebot/proc/updateicon() - - src.overlays.Cut() - - if(src.stat == 0) - src.overlays += "eyes" - else - src.overlays -= "eyes" - - -/mob/living/silicon/hivebot/proc/installed_modules() - - if(!src.module) - src.pick_module() - return - var/dat = "Modules\n" - dat += {"Close -
-
- Activated Modules -
- Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
- Module 2: [module_state_2 ? "
[module_state_2]" : "No Module"]
- Module 3: [module_state_3 ? "
[module_state_3]" : "No Module"]
-
- Installed Modules

"} - - for (var/obj in src.module.modules) - if(src.activated(obj)) - dat += text("[obj]: Activated
") - else - dat += text("[obj]:
Activate
") -/* - if(src.activated(obj)) - dat += text("[obj]: \[Activated | Deactivate\]
") - else - dat += text("[obj]: \[Activate | Deactivated\]
") -*/ - src << browse(dat, "window=robotmod&can_close=0") - - -/mob/living/silicon/hivebot/Topic(href, href_list) - ..() - if (href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") - src.machine = null - src << browse(null, t1) - return - - if (href_list["mod"]) - var/obj/item/O = locate(href_list["mod"]) - O.attack_self(src) - - if (href_list["act"]) - var/obj/item/O = locate(href_list["act"]) - if(activated(O)) - src << "Already activated" - return - if(!src.module_state_1) - src.module_state_1 = O - O.layer = 20 - src.contents += O - else if(!src.module_state_2) - src.module_state_2 = O - O.layer = 20 - src.contents += O - else if(!src.module_state_3) - src.module_state_3 = O - O.layer = 20 - src.contents += O - else - src << "You need to disable a module first!" - src.installed_modules() - - if (href_list["deact"]) - var/obj/item/O = locate(href_list["deact"]) - if(activated(O)) - if(src.module_state_1 == O) - src.module_state_1 = null - src.contents -= O - else if(src.module_state_2 == O) - src.module_state_2 = null - src.contents -= O - else if(src.module_state_3 == O) - src.module_state_3 = null - src.contents -= O - else - src << "Module isn't activated." - else - src << "Module isn't activated" - src.installed_modules() - return - -/mob/living/silicon/hivebot/proc/uneq_active() - if(isnull(src.module_active)) - return - if(src.module_state_1 == src.module_active) - if (src.client) - src.client.screen -= module_state_1 - src.contents -= module_state_1 - src.module_active = null - src.module_state_1 = null - src.inv1.icon_state = "inv1" - else if(src.module_state_2 == src.module_active) - if (src.client) - src.client.screen -= module_state_2 - src.contents -= module_state_2 - src.module_active = null - src.module_state_2 = null - src.inv2.icon_state = "inv2" - else if(src.module_state_3 == src.module_active) - if (src.client) - src.client.screen -= module_state_3 - src.contents -= module_state_3 - src.module_active = null - src.module_state_3 = null - src.inv3.icon_state = "inv3" - - -/mob/living/silicon/hivebot/proc/activated(obj/item/O) - if(src.module_state_1 == O) - return 1 - else if(src.module_state_2 == O) - return 1 - else if(src.module_state_3 == O) - return 1 - else - return 0 - -/mob/living/silicon/hivebot/proc/radio_menu() - var/dat = {" - -Microphone: [src.radio.broadcasting ? "Engaged" : "Disengaged"]
-Speaker: [src.radio.listening ? "Engaged" : "Disengaged"]
-Frequency: -- -- -[format_frequency(src.radio.frequency)] -+ -+
-------- -
"} - src << browse(dat, "window=radio") - onclose(src, "radio") - return - - -/mob/living/silicon/hivebot/Move(a, b, flag) - - if (src.buckled) - return - - if (src.restrained()) - src.stop_pulling() - - var/t7 = 1 - if (src.restrained()) - for(var/mob/M in range(src, 1)) - if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) - t7 = null - if ((t7 && (src.pulling && ((get_dist(src, src.pulling) <= 1 || src.pulling.loc == src.loc) && (src.client && src.client.moving))))) - var/turf/T = src.loc - . = ..() - - if (src.pulling && src.pulling.loc) - if(!( isturf(src.pulling.loc) )) - src.stop_pulling() - return - else - if(Debug) - diary <<"src.pulling disappeared? at [__LINE__] in mob.dm - src.pulling = [src.pulling]" - diary <<"REPORT THIS" - - ///// - if(src.pulling && src.pulling.anchored) - src.stop_pulling() - return - - if (!src.restrained()) - var/diag = get_dir(src, src.pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, src.pulling) > 1 || diag)) - if (ismob(src.pulling)) - var/mob/M = src.pulling - var/ok = 1 - if (locate(/obj/item/weapon/grab, M.grabbed_by)) - if (prob(75)) - var/obj/item/weapon/grab/G = pick(M.grabbed_by) - if (istype(G, /obj/item/weapon/grab)) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [G.affecting] has been pulled from [G.assailant]'s grip by [src]"), 1) - del(G) - else - ok = 0 - if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) - ok = 0 - if (ok) - var/atom/movable/t = M.pulling - M.stop_pulling() - step(src.pulling, get_dir(src.pulling.loc, T)) - M.start_pulling(t) - else - if (src.pulling) - step(src.pulling, get_dir(src.pulling.loc, T)) - else - src.stop_pulling() - . = ..() - if ((src.s_active && !( s_active in src.contents ) )) - src.s_active.close(src) - return - - -/mob/living/silicon/hivebot/verb/cmd_return_mainframe() - set category = "Robot Commands" - set name = "Recall to Mainframe." - return_mainframe() - -/mob/living/silicon/hivebot/proc/return_mainframe() - if(mainframe) - mainframe.return_to(src) - else - src << "\red You lack a dedicated mainframe!" - return \ No newline at end of file diff --git a/code/unused/hivebot/hivebotdefine.dm b/code/unused/hivebot/hivebotdefine.dm deleted file mode 100644 index 902c230471..0000000000 --- a/code/unused/hivebot/hivebotdefine.dm +++ /dev/null @@ -1,46 +0,0 @@ -/mob/living/silicon/hivebot - name = "Robot" - icon = 'icons/mob/hivebot.dmi' - icon_state = "basic" - health = 80 - var/health_max = 80 - robot_talk_understand = 2 - -//HUD - var/obj/screen/cells = null - var/obj/screen/inv1 = null - var/obj/screen/inv2 = null - var/obj/screen/inv3 = null - -//3 Modules can be activated at any one time. - var/obj/item/weapon/robot_module/module = null - var/module_active = null - var/module_state_1 = null - var/module_state_2 = null - var/module_state_3 = null - - var/obj/item/device/radio/radio = null - - var/list/req_access = list(ACCESS_ROBOTICS) - var/energy = 4000 - var/energy_max = 4000 - var/jetpack = 0 - - var/mob/living/silicon/hive_mainframe/mainframe = null - var/dependent = 0 - var/shell = 1 - -/mob/living/silicon/hive_mainframe - name = "Robot Mainframe" - voice_name = "synthesized voice" - - icon_state = "hive_main" - health = 200 - var/health_max = 200 - robot_talk_understand = 2 - - anchored = 1 - var/online = 1 - var/mob/living/silicon/hivebot = null - var/hivebot_name = null - var/force_mind = 0 \ No newline at end of file diff --git a/code/unused/hivebot/hud.dm b/code/unused/hivebot/hud.dm deleted file mode 100644 index 3cc862c65d..0000000000 --- a/code/unused/hivebot/hud.dm +++ /dev/null @@ -1,251 +0,0 @@ - -/obj/hud/proc/hivebot_hud() - - src.adding = list( ) - src.other = list( ) - src.intents = list( ) - src.mon_blo = list( ) - src.m_ints = list( ) - src.mov_int = list( ) - src.vimpaired = list( ) - src.darkMask = list( ) - - src.g_dither = new src.h_type( src ) - src.g_dither.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.g_dither.name = "Mask" - src.g_dither.icon_state = "dither12g" - src.g_dither.layer = 18 - src.g_dither.mouse_opacity = 0 - - src.alien_view = new src.h_type(src) - src.alien_view.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.alien_view.name = "Alien" - src.alien_view.icon_state = "alien" - src.alien_view.layer = 18 - src.alien_view.mouse_opacity = 0 - - src.blurry = new src.h_type( src ) - src.blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.blurry.name = "Blurry" - src.blurry.icon_state = "blurry" - src.blurry.layer = 17 - src.blurry.mouse_opacity = 0 - - src.druggy = new src.h_type( src ) - src.druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - src.druggy.name = "Druggy" - src.druggy.icon_state = "druggy" - src.druggy.layer = 17 - src.druggy.mouse_opacity = 0 - - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'icons/effects/station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - - var/obj/screen/using - - -//Radio - using = new src.h_type( src ) - using.name = "radio" - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "radio" - using.screen_loc = ui_movi_old - using.layer = 20 - src.adding += using - -//Generic overlays - - using = new src.h_type(src) //Right hud bar - using.set_dir(SOUTH) - using.icon = 'icons/mob/screen1_robot.dmi' - using.screen_loc = "EAST+1,SOUTH to EAST+1,NORTH" - using.layer = 19 - src.adding += using - - using = new src.h_type(src) //Lower hud bar - using.set_dir(EAST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.screen_loc = "WEST,SOUTH-1 to EAST,SOUTH-1" - using.layer = 19 - src.adding += using - - using = new src.h_type(src) //Corner Button - using.set_dir(NORTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.screen_loc = "EAST+1,SOUTH-1" - using.layer = 19 - src.adding += using - - -//Module select - - using = new src.h_type( src ) - using.name = "module1" - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv1" - using.screen_loc = ui_inv1 - using.layer = 20 - src.adding += using - mymob:inv1 = using - - using = new src.h_type( src ) - using.name = "module2" - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv2" - using.screen_loc = ui_inv2 - using.layer = 20 - src.adding += using - mymob:inv2 = using - - using = new src.h_type( src ) - using.name = "module3" - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv3" - using.screen_loc = ui_inv3 - using.layer = 20 - src.adding += using - mymob:inv3 = using - -//End of module select - -//Intent - using = new src.h_type( src ) - using.name = "act_intent" - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - - using = new src.h_type( src ) - using.name = "arrowleft" - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "s_arrow" - using.set_dir(WEST) - using.screen_loc = ui_iarrowleft - using.layer = 19 - src.adding += using - - using = new src.h_type( src ) - using.name = "arrowright" - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "s_arrow" - using.set_dir(EAST) - using.screen_loc = ui_iarrowright - using.layer = 19 - src.adding += using -//End of Intent - -//Cell - mymob:cells = new /obj/screen( null ) - mymob:cells.icon = 'icons/mob/screen1_robot.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - -//Health - mymob.healths = new /obj/screen( null ) - mymob.healths.icon = 'icons/mob/screen1_robot.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - -//Installed Module - mymob.hands = new /obj/screen( null ) - mymob.hands.icon = 'icons/mob/screen1_robot.dmi' - mymob.hands.icon_state = "nomod" - mymob.hands.name = "module" - mymob.hands.screen_loc = ui_dropbutton - -//Module Panel - using = new src.h_type( src ) - using.name = "panel" - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "panel" - using.screen_loc = ui_throw - using.layer = 19 - src.adding += using - -//Store - mymob.throw_icon = new /obj/screen(null) - mymob.throw_icon.icon = 'icons/mob/screen1_robot.dmi' - mymob.throw_icon.icon_state = "store" - mymob.throw_icon.name = "store" - mymob.throw_icon.screen_loc = ui_hand - -//Temp - mymob.bodytemp = new /obj/screen( null ) - mymob.bodytemp.icon_state = "temp0" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - -//does nothing (fire and oxy) - mymob.oxygen = new /obj/screen( null ) - mymob.oxygen.icon = 'icons/mob/screen1_robot.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen( null ) - mymob.fire.icon = 'icons/mob/screen1_robot.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - - - mymob.pullin = new /obj/screen( null ) - mymob.pullin.icon = 'icons/mob/screen1_robot.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull - - mymob.blind = new /obj/screen( null ) - mymob.blind.icon = 'icons/mob/screen1_full.dmi'' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen( null ) - mymob.flash.icon = 'icons/mob/screen1_robot.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.sleep = new /obj/screen( null ) - mymob.sleep.icon = 'icons/mob/screen1_robot.dmi' - mymob.sleep.icon_state = "sleep0" - mymob.sleep.name = "sleep" - mymob.sleep.screen_loc = ui_sleep - - mymob.rest = new /obj/screen( null ) - mymob.rest.icon = 'icons/mob/screen1_robot.dmi' - mymob.rest.icon_state = "rest0" - mymob.rest.name = "rest" - mymob.rest.screen_loc = ui_rest - - - mymob.zone_sel = new /obj/screen/zone_sel( null ) - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image("icon" = 'icons/mob/zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting)) - - mymob.client.screen = null - - mymob.client.screen += list(mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep) //, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return diff --git a/code/unused/hivebot/life.dm b/code/unused/hivebot/life.dm deleted file mode 100644 index 362328cb4d..0000000000 --- a/code/unused/hivebot/life.dm +++ /dev/null @@ -1,227 +0,0 @@ -/mob/living/silicon/hivebot/Life() - set invisibility = 0 - set background = 1 - - if (src.monkeyizing) - return - - if (src.stat != 2) - use_power() - - src.blinded = null - - clamp_values() - - handle_regular_status_updates() - - if(client) - src.shell = 0 - handle_regular_hud_updates() - update_items() - if(dependent) - mainframe_check() - - update_canmove() - - -/mob/living/silicon/hivebot - proc - clamp_values() - - stunned = max(min(stunned, 10),0) - paralysis = max(min(paralysis, 1), 0) - weakened = max(min(weakened, 15), 0) - sleeping = max(min(sleeping, 1), 0) - setToxLoss(0) - setOxyLoss(0) - - use_power() - - if (src.energy) - if(src.energy <= 0) - death() - - else if (src.energy <= 10) - src.module_active = null - src.module_state_1 = null - src.module_state_2 = null - src.module_state_3 = null - src.energy -=1 - else - if(src.module_state_1) - src.energy -=1 - if(src.module_state_2) - src.energy -=1 - if(src.module_state_3) - src.energy -=1 - src.energy -=1 - src.blinded = 0 - src.stat = 0 - else - src.blinded = 1 - src.stat = 1 - - update_canmove() - if(paralysis || stunned || weakened || buckled) canmove = 0 - else canmove = 1 - - - handle_regular_status_updates() - - health = src.health_max - (getFireLoss() + getBruteLoss()) - - if(health <= 0) - death() - - if (src.stat != 2) //Alive. - - if (src.paralysis || src.stunned || src.weakened) //Stunned etc. - if (src.stunned > 0) - src.stunned-- - src.stat = 0 - if (src.weakened > 0) - src.weakened-- - src.lying = 0 - src.stat = 0 - if (src.paralysis > 0) - src.paralysis-- - src.blinded = 0 - src.lying = 0 - src.stat = 1 - - else //Not stunned. - src.lying = 0 - src.stat = 0 - - else //Dead. - src.blinded = 1 - src.stat = 2 - - src.density = !( src.lying ) - - if ((src.sdisabilities & 1)) - src.blinded = 1 - if ((src.sdisabilities & 4)) - src.ear_deaf = 1 - - if (src.eye_blurry > 0) - src.eye_blurry-- - src.eye_blurry = max(0, src.eye_blurry) - - if (src.druggy > 0) - src.druggy-- - src.druggy = max(0, src.druggy) - - return 1 - - handle_regular_hud_updates() - - if (src.stat == 2 || XRAY in src.mutations) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (src.stat != 2) - src.sight &= ~SEE_MOBS - src.sight &= ~SEE_TURFS - src.sight &= ~SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - - if (src.healths) - if (src.stat != 2) - switch(health) - if(health_max to INFINITY) - src.healths.icon_state = "health0" - if(src.health_max*0.80 to src.health_max) - src.healths.icon_state = "health1" - if(src.health_max*0.60 to src.health_max*0.80) - src.healths.icon_state = "health2" - if(src.health_max*0.40 to src.health_max*0.60) - src.healths.icon_state = "health3" - if(src.health_max*0.20 to src.health_max*0.40) - src.healths.icon_state = "health4" - if(0 to health_max*0.20) - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" - else - src.healths.icon_state = "health7" - - if (src.cells) - switch(src.energy) - if(src.energy_max*0.75 to INFINITY) - src.cells.icon_state = "charge4" - if(0.5*src.energy_max to 0.75*src.energy_max) - src.cells.icon_state = "charge3" - if(0.25*src.energy_max to 0.5*src.energy_max) - src.cells.icon_state = "charge2" - if(0 to 0.25*src.energy_max) - src.cells.icon_state = "charge1" - else - src.cells.icon_state = "charge0" - - switch(src.bodytemperature) //310.055 optimal body temp - - if(335 to INFINITY) - src.bodytemp.icon_state = "temp2" - if(320 to 335) - src.bodytemp.icon_state = "temp1" - if(300 to 320) - src.bodytemp.icon_state = "temp0" - if(260 to 300) - src.bodytemp.icon_state = "temp-1" - else - src.bodytemp.icon_state = "temp-2" - - - if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]" - - src.client.screen -= src.hud_used.blurry - src.client.screen -= src.hud_used.druggy - src.client.screen -= src.hud_used.vimpaired - - if ((src.blind && src.stat != 2)) - if ((src.blinded)) - src.blind.layer = 18 - else - src.blind.layer = 0 - - if (src.disabilities & 1) - src.client.screen += src.hud_used.vimpaired - - if (src.eye_blurry) - src.client.screen += src.hud_used.blurry - - if (src.druggy) - src.client.screen += src.hud_used.druggy - - if (src.stat != 2) - if (src.machine) - if (!( src.machine.check_eye(src) )) - src.reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 - - - update_items() - if (src.client) - src.client.screen -= src.contents - src.client.screen += src.contents - if(src.module_state_1) - src.module_state_1:screen_loc = ui_inv1 - if(src.module_state_2) - src.module_state_2:screen_loc = ui_inv2 - if(src.module_state_3) - src.module_state_3:screen_loc = ui_inv3 - - mainframe_check() - if(mainframe) - if(mainframe.stat == 2) - mainframe.return_to(src) - else - death() \ No newline at end of file diff --git a/code/unused/hivebot/login.dm b/code/unused/hivebot/login.dm deleted file mode 100644 index 3a811b4c8a..0000000000 --- a/code/unused/hivebot/login.dm +++ /dev/null @@ -1,15 +0,0 @@ -/mob/living/silicon/hivebot/Login() - ..() - - update_clothing() - - if (!isturf(src.loc)) - src.client.eye = src.loc - src.client.perspective = EYE_PERSPECTIVE - if (src.stat == 2) - src.verbs += /client/proc/ghost - if(src.real_name == "Hiveborg") - src.real_name += " " - src.real_name += "-[rand(1, 999)]" - src.name = src.real_name - return \ No newline at end of file diff --git a/code/unused/hivebot/mainframe.dm b/code/unused/hivebot/mainframe.dm deleted file mode 100644 index 6e07b5b457..0000000000 --- a/code/unused/hivebot/mainframe.dm +++ /dev/null @@ -1,181 +0,0 @@ -/mob/living/silicon/hive_mainframe/New() - Namepick() - -/mob/living/silicon/hive_mainframe/Life() - if (src.stat == 2) - return - else - src.updatehealth() - - if (src.health <= 0) - death() - return - - if(src.force_mind) - if(!src.mind) - if(src.client) - src.mind = new - src.mind.key = src.key - src.mind.current = src - src.force_mind = 0 - -/mob/living/silicon/hive_mainframe/Stat() - ..() - statpanel("Status") - if (src.client.statpanel == "Status") - if(emergency_shuttle) - if(emergency_shuttle.has_eta() && !emergency_shuttle.returned()) - var/timeleft = emergency_shuttle.estimate_arrival_time() - if (timeleft) - stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") -/* - if(ticker.mode.name == "AI malfunction") - stat(null, "Points left until the AI takes over: [AI_points]/[AI_points_win]") -*/ - -/mob/living/silicon/hive_mainframe/updatehealth() - if (src.nodamage == 0) - src.health = 100 - src.getFireLoss() - src.getBruteLoss() - else - src.health = 100 - src.stat = 0 - -/mob/living/silicon/hive_mainframe/death(gibbed) - src.stat = 2 - src.canmove = 0 - if(src.blind) - src.blind.layer = 0 - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - src.lying = 1 - src.icon_state = "hive_main-crash" - - var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch - mind.store_memory("Time of death: [tod]", 0) - - if (src.key) - spawn(50) - if(src.key && src.stat == 2) - src.verbs += /client/proc/ghost - return ..(gibbed) - - -/mob/living/silicon/hive_mainframe/say_understands(var/other) - //These only pertain to common. Languages are handled by mob/say_understands() - if (!speaking) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/hivebot)) - return 1 - if (istype(other, /mob/living/silicon/ai)) - return 1 - return ..() - -/mob/living/silicon/hive_mainframe/say_quote(var/text) - var/ending = copytext(text, length(text)) - - if (ending == "?") - return "queries, \"[text]\""; - else if (ending == "!") - return "declares, \"[copytext(text, 1, length(text))]\""; - - return "states, \"[text]\""; - - -/mob/living/silicon/hive_mainframe/proc/return_to(var/mob/user) - if(user.mind) - user.mind.transfer_to(src) - spawn(20) - user:shell = 1 - user:real_name = "Robot [pick(rand(1, 999))]" - user:name = user:real_name - - - return - -/mob/living/silicon/hive_mainframe/verb/cmd_deploy_to() - set category = "Mainframe Commands" - set name = "Deploy to shell." - deploy_to() - -/mob/living/silicon/hive_mainframe/verb/deploy_to() - - if(usr.stat == 2) - usr << "You can't deploy because you are dead!" - return - - var/list/bodies = new/list() - - for(var/mob/living/silicon/hivebot/H in mob_list) - if(H.z == src.z) - if(H.shell) - if(!H.stat) - bodies += H - - var/target_shell = input(usr, "Which body to control?") as null|anything in bodies - - if (!target_shell) - return - - else if(src.mind) - spawn(30) - target_shell:mainframe = src - target_shell:dependent = 1 - target_shell:real_name = src.name - target_shell:name = target_shell:real_name - src.mind.transfer_to(target_shell) - return - - -/client/proc/MainframeMove(n,direct,var/mob/living/silicon/hive_mainframe/user) - return -/obj/hud/proc/hive_mainframe_hud() - return - - - - - -/mob/living/silicon/hive_mainframe/Login() - ..() - update_clothing() - for(var/S in src.client.screen) - del(S) - src.flash = new /obj/screen( null ) - src.flash.icon_state = "blank" - src.flash.name = "flash" - src.flash.screen_loc = "1,1 to 15,15" - src.flash.layer = 17 - src.blind = new /obj/screen( null ) - src.blind.icon_state = "black" - src.blind.name = " " - src.blind.screen_loc = "1,1 to 15,15" - src.blind.layer = 0 - src.client.screen += list( src.blind, src.flash ) - if(!isturf(src.loc)) - src.client.eye = src.loc - src.client.perspective = EYE_PERSPECTIVE - if (src.stat == 2) - src.verbs += /client/proc/ghost - return - - - -/mob/living/silicon/hive_mainframe/proc/Namepick() - var/randomname = pick(ai_names) - var/newname = input(src,"You are the a Mainframe Unit. Would you like to change your name to something else?", "Name change",randomname) - - if (length(newname) == 0) - newname = randomname - - if (newname) - if (length(newname) >= 26) - newname = copytext(newname, 1, 26) - newname = replacetext(newname, ">", "'") - src.real_name = newname - src.name = newname \ No newline at end of file diff --git a/code/unused/jobs.dm b/code/unused/jobs.dm deleted file mode 100644 index e56a7e54f6..0000000000 --- a/code/unused/jobs.dm +++ /dev/null @@ -1,291 +0,0 @@ -//WORK IN PROGRESS CONTENT - -//Project coder: Errorage - -//Readme: As part of the UI upgrade project, the intention here is for each job to have -//somewhat customizable loadouts. Players will be able to pick between jumpsuits, shoes, -//and other items. This datum will be used for all jobs and code will reference it. -//adding new jobs will be a matter of adding this datum.to a list of jobs. - -#define VITAL_PRIORITY_JOB 5 -#define HIGH_PRIORITY_JOB 4 -#define PRIORITY_JOB 3 -#define LOW_PRIORITY_JOB 2 -#define ASSISTANT_PRIORITY_JOB 1 -#define NO_PRIORITY_JOB 0 - -/datum/job - //Basic information - var/title = "Untitled" //The main (default) job title/name - var/list/alternative_titles = list() //Alternative job titles/names (alias) - var/job_number_at_round_start = 0 //Number of jobs that can be assigned at round start - var/job_number_total = 0 //Number of jobs that can be assigned total - var/list/bosses = list() //List of jobs which have authority over this job by default. - var/admin_only = 0 //If this is set to 1, the job is not available on the spawn screen - var/description = "" //A description of the job to be displayed when requested on the spawn screen - var/guides = "" //A string with links to relevent guides (likely the wiki) - var/department = "" //This is used to group jobs into departments, which means that if you don't get your desired jobs, you get another job from the same department - var/job_type = "SS13" //SS13, NT or ANTAGONIST - var/can_be_traitor = 1 - var/can_be_changeling = 1 - var/can_be_wizard = 1 - var/can_be_cultist = 1 - var/can_be_rev_head = 1 - var/is_head_position = 0 - - //Job conditions - var/change_to_mob = "Human" //The type of mob which this job will change you to (alien,cyborg,human...) - var/change_to_mutantrace = "" //What mutantrace you will be once you get this job - - //Random job assignment priority - var/assignment_priority = NO_PRIORITY_JOB //This variable determins the priority of assignment - //VITAL_PRIORITY_JOB = Absolutely vital (Someone will get assigned every round) - Use VERY, VERY lightly - //HIGH_PRIORITY_JOB = High priority - Assibned before the other jobs, candidates compete on equal terms - //PRIORITY_JOB = Priorized (Standard priority) - Candidates compete by virtue of priority (choice 1 > choice 2 > choice 3...) - //LOW_PRIORITY_JOB = Low priority (Low-priority (librarian)) - //ASSISTANT_PRIORITY_JOB = Assistant-level (Only filled when all the other jobs have been assigned) - //NO_PRIORITY_JOB = Skipped om assignment (Admin-only jobs should have this level) - - - - //Available equipment - The first thing listed is understood as the default setup. - var/list/equipment_ears = list() //list of possible ear-wear items - var/list/equipment_glasses = list() //list of possible glasses - var/list/equipment_gloves = list() //list of possible gloves - var/list/equipment_head = list() //list of possible headgear/helmets/hats - var/list/equipment_mask = list() //list of possible masks - var/list/equipment_shoes = list() //list of possible shoes - var/list/equipment_suit = list() //list of possible suits - var/list/equipment_under = list() //list of possible jumpsuits - var/list/equipment_belt = list() //list of possible belt-slot items - var/list/equipment_back = list() //list of possible back-slot items - var/obj/equipment_pda //default pda type - var/obj/equipment_id //default id type - - New(var/param_title, var/list/param_alternative_titles = list(), var/param_jobs_at_round_start = 0, var/param_global_max = 0, var/list/param_bosses = list(), var/param_admin_only = 0) - title = param_title - alternative_titles = param_alternative_titles - job_number_at_round_start = param_jobs_at_round_start - job_number_total = param_global_max - bosses = param_bosses - admin_only = param_admin_only - - //This proc tests to see if the given alias (job title/alternative job title) corresponds to this job. - //Returns 1 if it is, else returns 0 - proc/is_job_alias(var/alias) - if(alias == title) - return 1 - if(alias in alternative_titles) - return 1 - return 0 - -/datum/jobs - var/list/datum/job/all_jobs = list() - - proc/get_all_jobs() - return all_jobs - - //This proc returns all the jobs which are NOT admin only - proc/get_normal_jobs() - var/list/datum/job/normal_jobs = list() - for(var/datum/job/J in all_jobs) - if(!J.admin_only) - normal_jobs += J - return normal_jobs - - //This proc returns all the jobs which are admin only - proc/get_admin_jobs() - var/list/datum/job/admin_jobs = list() - for(var/datum/job/J in all_jobs) - if(J.admin_only) - admin_jobs += J - return admin_jobs - - //This proc returns the job datum of the job with the alias or job title given as the argument. Returns an empty string otherwise. - proc/get_job(var/alias) - for(var/datum/job/J in all_jobs) - if(J.is_job_alias(alias)) - return J - return "" - - //This proc returns a string with the default job title for the job with the given alias. Returns an empty string otherwise. - proc/get_job_title(var/alias) - for(var/datum/job/J in all_jobs) - if(J.is_job_alias(alias)) - return J.title - return "" - - //This proc returns all the job datums of the workers whose boss has the alias provided. (IE Engineer under Chief Engineer, etc.) - proc/get_jobs_under(var/boss_alias) - var/boss_title = get_job_title(boss_alias) - var/list/datum/job/employees = list() - for(var/datum/job/J in all_jobs) - if(boss_title in J.bosses) - employees += J - return employees - - //This proc returns the chosen vital and high priority jobs that the person selected. It goes from top to bottom of the list, until it finds a job which does not have such priority. - //Example: Choosing (in this order): CE, Captain, Engineer, RD will only return CE and Captain, as RD is assumed as being an unwanted choice. - //This proc is used in the allocation algorithm when deciding vital and high priority jobs. - proc/get_prefered_high_priority_jobs() - var/list/datum/job/hp_jobs = list() - for(var/datum/job/J in all_jobs) - if(J.assignment_priority == HIGH_PRIORITY_JOB || J.assignment_priority == VITAL_PRIORITY_JOB) - hp_jobs += J - else - break - return hp_jobs - - //If only priority is given, it will return the jobs of only that priority, if end_priority is set it will return the jobs with their priority higher or equal to var/priority and lower or equal to end_priority. end_priority must be higher than 0. - proc/get_jobs_by_priority(var/priority, var/end_priority = 0) - var/list/datum/job/priority_jobs = list() - if(end_priority) - if(end_priority < priority) - return - for(var/datum/job/J in all_jobs) - if(J.assignment_priority >= priority && J.assignment_priority <= end_priority) - priority_jobs += J - else - for(var/datum/job/J in all_jobs) - if(J.assignment_priority == priority) - priority_jobs += J - return priority_jobs - -//This datum is used in the plb allocation algorithm to make life easier, not used anywhere else. -/datum/player_jobs - var/mob/new_player/player - var/datum/jobs/selected_jobs - -var/datum/jobs/jobs = new/datum/jobs() - -proc/setup_jobs() - var/datum/job/JOB - - JOB = new/datum/job("Station Engineer") - JOB.alternative_titles = list("Structural Engineer","Engineer","Student of Engineering") - JOB.job_number_at_round_start = 5 - JOB.job_number_total = 5 - JOB.bosses = list("Chief Engineer") - JOB.admin_only = 0 - JOB.description = "Engineers are tasked with the maintenance of the station. Be it maintaining the power grid or rebuilding damaged sections." - JOB.guides = "" - JOB.equipment_ears = list(/obj/item/device/radio/headset/headset_eng) - JOB.equipment_glasses = list() - JOB.equipment_gloves = list() - JOB.equipment_head = list(/obj/item/clothing/head/helmet/hardhat) - JOB.equipment_mask = list() - JOB.equipment_shoes = list(/obj/item/clothing/shoes/orange,/obj/item/clothing/shoes/brown,/obj/item/clothing/shoes/black) - JOB.equipment_suit = list(/obj/item/clothing/suit/storage/hazardvest) - JOB.equipment_under = list(/obj/item/clothing/under/rank/engineer,/obj/item/clothing/under/color/yellow) - JOB.equipment_belt = list(/obj/item/weapon/storage/belt/utility/full) - JOB.equipment_back = list(/obj/item/weapon/storage/backpack/industrial,/obj/item/weapon/storage/backpack) - JOB.equipment_pda = /obj/item/device/pda/engineering - JOB.equipment_id = /obj/item/weapon/card/id - - jobs.all_jobs += JOB - -//This proc will dress the mob (employee) in the default way for the specified job title/job alias -proc/dress_for_job_default(var/mob/living/carbon/human/employee as mob, var/job_alias) - if(!ishuman(employee)) - return - - //TODO ERRORAGE - UNFINISHED - var/datum/job/JOB = jobs.get_job(job_alias) - if(JOB) - var/item = JOB.equipment_ears[1] - employee.equip_to_slot_or_del(new item(employee), employee.slot_ears) - item = JOB.equipment_under[1] - employee.equip_to_slot_or_del(new item(employee), employee.slot_w_uniform) - - - /* - src.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial (src), slot_back) - src.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack) - src.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng (src), slot_ears) // -- TLE - src.equip_to_slot_or_del(new /obj/item/device/pda/engineering(src), slot_belt) - src.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(src), slot_w_uniform) - src.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(src), slot_shoes) - src.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/hardhat(src), slot_head) - src.equip_to_slot_or_del(new /obj/item/weapon/storage/utilitybelt/full(src), slot_l_hand) //currently spawns in hand due to traitor assignment requiring a PDA to be on the belt. --Errorage - //src.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(src), slot_gloves) removed as part of Dangercon 2011, approved by Urist_McDorf --Errorage - src.equip_to_slot_or_del(new /obj/item/device/t_scanner(src), slot_r_store) - */ - - -//This algorithm works in 5 steps: -//1: Assignment of wizard / nuke members (if appropriate game mode) -//2: Assignment of jobs based on preferenes -// 2.1: Assignment of vital and high priority jobs. Candidates compete on equal terms. If the vital jobs are not filled, a random candidate is chosen to fill them, -// 2.2: Assignment of the rest of the jobs based on player preference, -//3: Assignment of remaining jobs for remaining players based on chosen departments -//4: Random assignment of remaining jobs for remaining players based on assignment priority -//5: Assignment of traitor / changeling to assigned roles (if appropriate game mode) -proc/assignment_algorithm(var/list/mob/new_player/players) - for(var/mob/new_player/PLAYER in players) - if(!PLAYER.client) - players -= PLAYER - continue - if(!PLAYER.ready) - players -= PLAYER - continue - - var/list/datum/job/vital_jobs = list() - var/list/datum/job/high_priority_jobs = list() - var/list/datum/job/priority_jobs = list() - var/list/datum/job/low_priority_jobs = list() - var/list/datum/job/assistant_jobs = list() - var/list/datum/job/not_assigned_jobs = list() - - for(var/datum/job/J in jobs) - switch(J.assignment_priority) - if(5) - vital_jobs += J - if(4) - high_priority_jobs += J - if(3) - priority_jobs += J - if(2) - low_priority_jobs += J - if(1) - assistant_jobs += J - if(0) - not_assigned_jobs += J - - var/list/datum/player_jobs/player_jobs = list() //This datum only holds a mob/new_player and a datum/jobs. The first is the player, the 2nd is the player's selected jobs, from the preferences datum. - - for(var/mob/new_player/NP in players) - var/datum/player_jobs/PJ = new/datum/player_jobs - PJ.player = NP - PJ.selected_jobs = NP.preferences.wanted_jobs - player_jobs += PJ - - //At this point we have the player_jobs list filled. Next up we have to assign all vital and high priority positions. - - var/list/datum/job/hp_jobs = jobs.get_jobs_by_priority( HIGH_PRIORITY_JOB, VITAL_PRIORITY_JOB ) - - for(var/datum/job/J in hp_jobs) - var/list/mob/new_player/candidates = list() - for(var/datum/player_jobs/PJ in player_jobs) - if(J in PJ.selected_jobs) - candidates += PJ.player - var/mob/new_player/chosen_player - if(candidates) - chosen_player = pick(candidates) - else - if(J.assignment_priority == VITAL_PRIORITY_JOB) - if(players) //Just in case there are more vital jobs than there are players. - chosen_player = pick(players) - if(chosen_player) - chosen_player.mind.assigned_job = J - players -= chosen_player - //TODO ERRORAGE - add capability for hp jobs with more than one slots. - - - - - //1: vital and high priority jobs, assigned on equal terms - - //TODO ERRORAGE - UNFINISHED - - -//END OF WORK IN PROGRESS CONTENT diff --git a/code/unused/mining/datum_processing_recipe.dm b/code/unused/mining/datum_processing_recipe.dm deleted file mode 100644 index 656e38f0ad..0000000000 --- a/code/unused/mining/datum_processing_recipe.dm +++ /dev/null @@ -1,22 +0,0 @@ -/**********************Ore to material recipes datum**************************/ - -var/list/AVAILABLE_ORES = typesof(/obj/item/weapon/ore) - -/datum/material_recipe - var/name - var/list/obj/item/weapon/ore/recipe - var/obj/prod_type //produced material/object type - - New(var/param_name, var/param_recipe, var/param_prod_type) - name = param_name - recipe = param_recipe - prod_type = param_prod_type - -var/list/datum/material_recipe/MATERIAL_RECIPES = list( - new/datum/material_recipe("Metal",list(/obj/item/weapon/ore/iron),/obj/item/stack/sheet/metal), - new/datum/material_recipe("Glass",list(/obj/item/weapon/ore/glass),/obj/item/stack/sheet/glass), - new/datum/material_recipe("Gold",list(/obj/item/weapon/ore/gold),/obj/item/stack/sheet/mineral/gold), - new/datum/material_recipe("Silver",list(/obj/item/weapon/ore/silver),/obj/item/stack/sheet/mineral/silver), - new/datum/material_recipe("Diamond",list(/obj/item/weapon/ore/diamond),/obj/item/stack/sheet/mineral/diamond), - new/datum/material_recipe("Phoron",list(/obj/item/weapon/ore/phoron),/obj/item/stack/sheet/mineral/phoron), - ) \ No newline at end of file diff --git a/code/unused/mining/machine_craftlathe_unused.dm b/code/unused/mining/machine_craftlathe_unused.dm deleted file mode 100644 index 564e3a1f71..0000000000 --- a/code/unused/mining/machine_craftlathe_unused.dm +++ /dev/null @@ -1,233 +0,0 @@ -/*********************NEW AUTOLATHE / CRAFT LATHE***********************/ - -var/list/datum/craftlathe_item/CRAFT_ITEMS = list() -var/CRAFT_ITEMS_SETUP = 1 //this should probably be a pre-game thing, but i'll do it so the first lathe2 that's created will set-up the recipes. - -proc/check_craftlathe_recipe(var/list/param_recipe) - if(param_recipe.len != 9) - return - var/i - var/match = 0 //this one counts if there is at least one non-"" ingredient. - for(var/datum/craftlathe_item/CI in CRAFT_ITEMS) - match = 0 - for(i = 1; i <= 9; i++) - if(CI.recipe[i] != param_recipe[i]) - match = 0 //use this so it passes by the match > 0 check below, otherwise i'd need a new variable to tell the return CI below that the check failed - break - if(CI.recipe[i] != "") - match++ - if(match > 0) - return CI - return 0 - -/datum/craftlathe_item - var/id = "" //must be unique for each item type. used to create recipes - var/name = "unknown" //what the lathe will show as it's contents - var/list/recipe = list("","","","","","","","","") //the 9 items here represent what items need to be placed in the lathe to produce this item. - var/item_type = null //this is used on items like sheets which are added when inserted into the lathe. - var/amount = 1 - var/amount_attackby = 1 - -/datum/craftlathe_item/New(var/param_id,var/param_name,var/param_amount,var/param_ammount_per_attackby,var/list/param_recipe,var/param_type = null) - ..() - id = param_id - name = param_name - recipe = param_recipe - item_type = param_type - amount = param_amount; - amount_attackby = param_ammount_per_attackby - return - -//this proc checks the recipe you give in it's parameter with the entire list of available items. If any match, it returns the item from CRAFT_ITEMS. the returned item should not be changed!! - -/obj/machinery/autolathe2 - name = "Craft lathe" - icon_state = "autolathe" - density = 1 - anchored = 1 - var/datum/craftlathe_item/selected = null - var/datum/craftlathe_item/make = null - var/list/datum/craftlathe_item/craft_contents = list() - var/list/current_recipe = list("","","","","","","","","") - -/obj/machinery/autolathe2/New() - ..() - if(CRAFT_ITEMS_SETUP) - CRAFT_ITEMS_SETUP = 0 - build_recipes() - return - -/obj/machinery/autolathe2/attack_hand(mob/user as mob) - var/dat - dat = text("

Craft Lathe

") - dat += text("
") - - dat += text("Materials

") - var/datum/craftlathe_item/CI - var/i - for(i = 1; i <= craft_contents.len; i++) - CI = craft_contents[i] - if (CI == selected) - dat += text("[CI.name] ([CI.amount])
") - else - dat += text("[CI.name] ([CI.amount])
") - - dat += text("

") - - dat += text("Crafting Table

") - - dat += text(" ") - - var/j = 0 - var/k = 0 - for (i = 0; i < 3; i++) - dat += text(" ") - for (j = 1; j <= 3; j++) - k = i * 3 + j - if (current_recipe[k]) - dat += text(" ") - else - dat += text(" ") - dat += text(" ") - dat += text("
[current_recipe[k]]----
") - - dat += text("

") - dat += text("Will make: ") - if (make) - dat += text("[make.name]") - else - dat += text("nothing useful") - - dat += text("

") - user << browse("[dat]", "window=craft") - -/obj/machinery/autolathe2/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["remove"]) - var/n = text2num(href_list["remove"]) - if(!n || n < 1 || n > 9) - return - current_recipe[n] = "" - if(href_list["select"]) - var/n = text2num(href_list["select"]) - if(!n || n < 1 || n > 9) - return - selected = craft_contents[n] - if(href_list["add"]) - var/n = text2num(href_list["add"]) - if(!n || n < 1 || n > 9) - return - if(selected) - current_recipe[n] = selected.id - if(href_list["make"]) - var/datum/craftlathe_item/MAKE = check_craftlathe_recipe(src.current_recipe) - if(MAKE) - for (var/datum/craftlathe_item/CI2 in craft_contents) - if(CI2.id == MAKE.id) - CI2.amount += CI2.amount_attackby - src.updateUsrDialog() - return - craft_contents += new/datum/craftlathe_item(MAKE.id,MAKE.name,MAKE.amount,MAKE.amount_attackby,MAKE.recipe,MAKE.item_type) - var/datum/craftlathe_item/CI = check_craftlathe_recipe(src.current_recipe) - if(CI) - make = CI - else - make = null - src.updateUsrDialog() - - - -/obj/machinery/autolathe2/attackby(obj/item/weapon/W as obj, mob/user as mob) - usr.machine = src - src.add_fingerprint(usr) - for (var/datum/craftlathe_item/CI in CRAFT_ITEMS) - if(W.type == CI.item_type) - for (var/datum/craftlathe_item/CI2 in craft_contents) - if(CI2.item_type == W.type) - CI2.amount += CI2.amount_attackby - rmv_item(W) - return - craft_contents += new/datum/craftlathe_item(CI.id,CI.name,CI.amount,CI.amount_attackby,CI.recipe,CI.item_type) - rmv_item(W) - return - src.updateUsrDialog() - return - -/obj/machinery/autolathe2/proc/rmv_item(obj/item/W as obj) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/S = W - S.amount-- - if (S.amount <= 0) - del(S) - else - del(W) - -/obj/machinery/autolathe2/proc/build_recipes() - //Parameters: ID, Name, Amount, Amount_added_per_attackby, Recipe, Object type - CRAFT_ITEMS += new/datum/craftlathe_item("METAL","Metal",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/metal) - CRAFT_ITEMS += new/datum/craftlathe_item("R METAL","Reinforced Metal",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/r_metal) - CRAFT_ITEMS += new/datum/craftlathe_item("GLASS","Glass",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/glass) - CRAFT_ITEMS += new/datum/craftlathe_item("R GLASS","Reinforced Glass",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/glass/reinforced) - CRAFT_ITEMS += new/datum/craftlathe_item("GOLD","Gold",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/mineral/gold) - CRAFT_ITEMS += new/datum/craftlathe_item("SILVER","Silver",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/mineral/silver) - CRAFT_ITEMS += new/datum/craftlathe_item("DIAMOND","Diamond",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/mineral/diamond) - CRAFT_ITEMS += new/datum/craftlathe_item("PLASMA","Plasma",1,1,list("","","","","","","","",""),/obj/item/stack/sheet/mineral/plasma) - CRAFT_ITEMS += new/datum/craftlathe_item("URANIUM","Uranium",1,1,list("","","","","","","","",""),/obj/item/weapon/ore/mineral/uranium) - CRAFT_ITEMS += new/datum/craftlathe_item("SCREWS","Screws",9,9,list("","","","","METAL","","","METAL","")) - CRAFT_ITEMS += new/datum/craftlathe_item("COGS","Cogs",9,9,list("","METAL","","METAL","METAL","METAL","","METAL","")) - CRAFT_ITEMS += new/datum/craftlathe_item("SWITCH","Switch",12,12,list("METAL","","METAL","METAL","METAL","","METAL","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("KEYBOARD","Keyboard",1,1,list("","","","SWITCH","SWITCH","SWITCH","SWITCH","SWITCH","SWITCH")) - CRAFT_ITEMS += new/datum/craftlathe_item("M PANEL","Metal Panel",10,10,list("","","","","METAL","METAL","","METAL","METAL")) - CRAFT_ITEMS += new/datum/craftlathe_item("CASE","Equipment Case",1,1,list("M PANEL","M PANEL","M PANEL","M PANEL","","M PANEL","M PANEL","M PANEL","M PANEL")) - CRAFT_ITEMS += new/datum/craftlathe_item("G PANEL","Glass Panel",10,10,list("","","","","GLASS","GLASS","","GLASS","GLASS")) - CRAFT_ITEMS += new/datum/craftlathe_item("SCREEN","Screen",1,1,list("","GLASS","","GLASS","PLASMA","GLASS","","GLASS","")) - CRAFT_ITEMS += new/datum/craftlathe_item("EL SILVER","Electronics Silver",30,30,list("","","","","SILVER","","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("EL GOLD","Electronics Gold",6,6,list("","","","","GOLD","","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("TINTED GL","Tinted Glass",2,2,list("","METAL","","","GLASS","","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("TANK VALVE","Tank Transfer Valuve",1,1,list("","PIPE","","","PIPE","SWITCH","","PIPE","")) - CRAFT_ITEMS += new/datum/craftlathe_item("PIPE","Pipe",1,1,list("","M PANEL","","","M PANEL","","","M PANEL","")) - - CRAFT_ITEMS += new/datum/craftlathe_item("CB FRAME","Circuitboard Frame",1,1,list("","","","M PANEL","G PANEL","M PANEL","G PANEL","M PANEL","G PANEL")) - CRAFT_ITEMS += new/datum/craftlathe_item("ROM","ROM Module",1,1,list("EL SILVER","EL SILVER","EL SILVER","EL SILVER","","EL SILVER","EL SILVER","EL SILVER","EL SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("RAM","RAM Module",1,1,list("EL SILVER","EL SILVER","EL SILVER","EL SILVER","EL GOLD","EL SILVER","EL SILVER","EL SILVER","EL SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("PROCESSOR","Processor",1,1,list("EL GOLD","EL SILVER","EL GOLD","EL SILVER","EL SILVER","EL SILVER","EL SILVER","EL GOLD","EL SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("ANTENNA","Antenna",1,1,list("","","EL SILVER","","","EL SILVER","EL SILVER","EL SILVER","EL SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("OP RECEPTOR","Optic Receptor",1,1,list("G PANEL","G PANEL","G PANEL","","EL GOLD","","G PANEL","G PANEL","G PANEL")) - CRAFT_ITEMS += new/datum/craftlathe_item("THERMAL OP R","Thermal Optic Receptor",1,1,list("","OP RECEPTOR","","ROM","DIAMOND","DIAMOND","","OP RECEPTOR","")) - CRAFT_ITEMS += new/datum/craftlathe_item("MASON OP R","Mason Optic Receptor",1,1,list("","OP RECEPTOR","","ROM","EL SILVER","EL SILVER","","OP RECEPTOR","")) - CRAFT_ITEMS += new/datum/craftlathe_item("EAR FRAME","Earpiece Frame",1,1,list("M PANEL","M PANEL","M PANEL","M PANEL","","M PANEL","M PANEL","M PANEL","")) - CRAFT_ITEMS += new/datum/craftlathe_item("RADIO M","Radio Module",1,1,list("","ANTENNA","","","ROM","","CB FRAME","CB FRAME","CB FRAME")) - CRAFT_ITEMS += new/datum/craftlathe_item("EARPIECE","Radio Earpiece",1,1,list("","","","","RADIO M","","","EAR FRAME","")) - CRAFT_ITEMS += new/datum/craftlathe_item("EARMUFFS","Earmuffs",1,1,list("","M PANEL","","EAR FRAME","","EAR FRAME","","","")) - - CRAFT_ITEMS += new/datum/craftlathe_item("GLASSES FRAME","Glasses Frame",1,1,list("M PANEL","","M PANEL","M PANEL","","M PANEL","M PANEL","M PANEL","M PANEL")) - CRAFT_ITEMS += new/datum/craftlathe_item("MASONS","Mason Scanners",1,1,list("","","","MASON OP R","GLASSES FRAME","MASON OP R","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("THERMALS","Thermal Scanners",1,1,list("","","","THERMAL OP R","GLASSES FRAME","THERMAL OP R","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("SUNGLASSES","Sunglasses",1,1,list("","","","TINTED GL","GLASSES FRAME","TINTED GL","","","")) - - CRAFT_ITEMS += new/datum/craftlathe_item("HELMET FR","Helmet Frame",1,1,list("METAL","METAL","METAL","METAL","","METAL","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("HELMET","Security Helmet",1,1,list("R METAL","R METAL","R METAL","R METAL","HELMET FR","R METAL","","GLASS","")) - CRAFT_ITEMS += new/datum/craftlathe_item("HOS HELMET","HoS Helmet",1,1,list("SILVER","GOLD","SILVER","SILVER","HELMET","SILVER","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("HARDHAT","Hardhat",1,1,list("","FLASHLIGHT","","","HELMET FR","","","","")) - CRAFT_ITEMS += new/datum/craftlathe_item("SWAT HELMET","SWAT Helmet",1,1,list("","","","","HELMET","","R GLASS","R GLASS","R GLASS")) - CRAFT_ITEMS += new/datum/craftlathe_item("WELDING HELM","Welding Helmet",1,1,list("","","","","HELMET FR","","TINTED GL","TINTED GL","TINTED GL")) - CRAFT_ITEMS += new/datum/craftlathe_item("SPACE HELMET","Space Helmet",1,1,list("R METAL","SILVER","R METAL","SILVER","HELMET FR","SILVER","R GLASS","R GLASS","R GLASS")) - CRAFT_ITEMS += new/datum/craftlathe_item("RIG HELMET","RIG Helmet",1,1,list("R METAL","SILVER","R METAL","SILVER","SPACE HELMET","SILVER","R GLASS","R GLASS","R GLASS")) - CRAFT_ITEMS += new/datum/craftlathe_item("GAS MASK","Gas Mask",1,1,list("","","","","HELMET FR","TANK VALVE","","G PANEL","")) - - CRAFT_ITEMS += new/datum/craftlathe_item("ARMOR FRAME","Armor Frame",1,1,list("R METAL","","R METAL","R METAL","R METAL","R METAL","R METAL","R METAL","R METAL")) - CRAFT_ITEMS += new/datum/craftlathe_item("ARMOR","Armored Vest",1,1,list("R METAL","","R METAL","R METAL","ARMOR FRAME","R METAL","R METAL","R METAL","R METAL")) - CRAFT_ITEMS += new/datum/craftlathe_item("HOS ARMOR","HoS Armor",1,1,list("DIAMOND","","DIAMOND","URANIUM","ARMOR","URANIUM","URANIUM","R METAL","URANIUM")) - CRAFT_ITEMS += new/datum/craftlathe_item("CAP ARMOR","Captain Armor",1,1,list("DIAMOND","","DIAMOND","URANIUM","HOS ARMOR","URANIUM","URANIUM","R METAL","URANIUM")) - CRAFT_ITEMS += new/datum/craftlathe_item("SPACE S FR","Space Suit Frame",1,1,list("SILVER","","SILVER","SILVER","SILVER","SILVER","SILVER","SILVER","SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("SPACE SUIT","Space Suit",1,1,list("SILVER","","SILVER","RAM","SPACE S FR","RADIO M","SILVER","SILVEr","SILVER")) - CRAFT_ITEMS += new/datum/craftlathe_item("RIG SUIT","RIG Suit",1,1,list("SILVER","","SILVER","SILVER","SPACE SUIT","SILVER","SILVER","SILVER","SILVER")) - //TODO: Flashlight, type paths - return - - - - return diff --git a/code/unused/mining/machine_gas_extractor_unused.dm b/code/unused/mining/machine_gas_extractor_unused.dm deleted file mode 100644 index 7a833016cf..0000000000 --- a/code/unused/mining/machine_gas_extractor_unused.dm +++ /dev/null @@ -1,78 +0,0 @@ -/**********************Gas extractor**************************/ - -/obj/machinery/mineral/gasextractor - name = "Gas extractor" - desc = "A machine which extracts gasses from ores" - icon = 'icons/obj/computer.dmi' - icon_state = "aiupload" - var/obj/machinery/mineral/input = null - var/obj/machinery/mineral/output = null - var/message = ""; - var/processing = 0 - var/newtoxins = 0 - density = 1 - anchored = 1.0 - -/obj/machinery/mineral/gasextractor/New() - ..() - spawn( 5 ) - for (var/dir in cardinal) - src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) - if(src.input) break - for (var/dir in cardinal) - src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) - if(src.output) break - return - return - -/obj/machinery/mineral/gasextractor/attack_hand(user as mob) - - if(processing == 1) - user << "The machine is processing" - return - - var/dat - dat = text("input connection status: ") - if (input) - dat += text("CONNECTED") - else - dat += text("NOT CONNECTED") - dat += text("
output connection status: ") - if (output) - dat += text("CONNECTED") - else - dat += text("NOT CONNECTED") - - dat += text("

Extract gas") - - dat += text("

Message: [message]") - - user << browse("[dat]", "window=purifier") - -/obj/machinery/mineral/gasextractor/Topic(href, href_list) - if(..()) - return - - usr.machine = src - src.add_fingerprint(usr) - if(href_list["extract"]) - if (src.output) - if (locate(/obj/machinery/portable_atmospherics/canister,output.loc)) - newtoxins = 0 - processing = 1 - var/obj/item/weapon/ore/O - while(locate(/obj/item/weapon/ore/plasma, input.loc) && locate(/obj/machinery/portable_atmospherics/canister,output.loc)) - O = locate(/obj/item/weapon/ore/plasma, input.loc) - if (istype(O,/obj/item/weapon/ore/plasma)) - var/obj/machinery/portable_atmospherics/canister/C - C = locate(/obj/machinery/portable_atmospherics/canister,output.loc) - C.air_contents.toxins += 100 - newtoxins += 100 - del(O) - sleep(5); - processing = 0; - message = "Canister filled with [newtoxins] units of toxins" - else - message = "No canister found" - src.updateUsrDialog() - return diff --git a/code/unused/mining/machine_purifier_unused.dm b/code/unused/mining/machine_purifier_unused.dm deleted file mode 100644 index d467dbcbd2..0000000000 --- a/code/unused/mining/machine_purifier_unused.dm +++ /dev/null @@ -1,85 +0,0 @@ -/**********************Mineral purifier (not used, replaced with mineral processing unit)**************************/ - -/obj/machinery/mineral/purifier - name = "Ore Purifier" - desc = "A machine which makes building material out of ores" - icon = 'icons/obj/computer.dmi' - icon_state = "aiupload" - var/obj/machinery/mineral/input = null - var/obj/machinery/mineral/output = null - var/processed = 0 - var/processing = 0 - density = 1 - anchored = 1.0 - -/obj/machinery/mineral/purifier/attack_hand(user as mob) - - if(processing == 1) - user << "The machine is processing" - return - - var/dat - dat = text("input connection status: ") - if (input) - dat += text("CONNECTED") - else - dat += text("NOT CONNECTED") - dat += text("
output connection status: ") - if (output) - dat += text("CONNECTED") - else - dat += text("NOT CONNECTED") - - dat += text("

Purify") - - dat += text("

found: [processed]") - user << browse("[dat]", "window=purifier") - -/obj/machinery/mineral/purifier/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["purify"]) - if (src.output) - processing = 1; - var/obj/item/weapon/ore/O - processed = 0; - while(locate(/obj/item/weapon/ore, input.loc)) - O = locate(/obj/item/weapon/ore, input.loc) - if (istype(O,/obj/item/weapon/ore/iron)) - new /obj/item/stack/sheet/metal(output.loc) - del(O) - if (istype(O,/obj/item/weapon/ore/diamond)) - new /obj/item/stack/sheet/mineral/diamond(output.loc) - del(O) - if (istype(O,/obj/item/weapon/ore/plasma)) - new /obj/item/stack/sheet/mineral/plasma(output.loc) - del(O) - if (istype(O,/obj/item/weapon/ore/gold)) - new /obj/item/stack/sheet/mineral/gold(output.loc) - del(O) - if (istype(O,/obj/item/weapon/ore/silver)) - new /obj/item/stack/sheet/mineral/silver(output.loc) - del(O) - if (istype(O,/obj/item/weapon/ore/uranium)) - new /obj/item/weapon/ore/mineral/uranium(output.loc) - del(O) - processed++ - sleep(5); - processing = 0; - src.updateUsrDialog() - return - - -/obj/machinery/mineral/purifier/New() - ..() - spawn( 5 ) - for (var/dir in cardinal) - src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) - if(src.input) break - for (var/dir in cardinal) - src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) - if(src.output) break - return - return diff --git a/code/unused/mining/mine_generator_unused.dm b/code/unused/mining/mine_generator_unused.dm deleted file mode 100644 index 9cc7f54ce6..0000000000 --- a/code/unused/mining/mine_generator_unused.dm +++ /dev/null @@ -1,174 +0,0 @@ -/**********************Random mine generator************************/ - -//this item is intended to give the effect of entering the mine, so that light gradually fades -/obj/effect/mine_generator - name = "Random mine generator" - anchored = 1 - unacidable = 1 - var/turf/last_loc - var/turf/target_loc - var/turf/start_loc - var/randXParam //the value of these two parameters are generated by the code itself and used to - var/randYParam //determine the random XY parameters - var/mineDirection = 3 - /* - 0 = none - 1 = N - 2 = NNW - 3 = NW - 4 = WNW - 5 = W - 6 = WSW - 7 = SW - 8 = SSW - 9 = S - 10 = SSE - 11 = SE - 12 = ESE - 13 = E - 14 = ENE - 15 = NE - 16 = NNE - */ - -/obj/effect/mine_generator/New() - last_loc = src.loc - var/i - for(i = 0; i < 50; i++) - gererateTargetLoc() - //target_loc = locate(last_loc.x + rand(5), last_loc.y + rand(5), src.z) - fillWithAsteroids() - del(src) - return - - -/obj/effect/mine_generator/proc/gererateTargetLoc() //this proc determines where the next square-room will end. - switch(mineDirection) - if(1) - randXParam = 0 - randYParam = 4 - if(2) - randXParam = 1 - randYParam = 3 - if(3) - randXParam = 2 - randYParam = 2 - if(4) - randXParam = 3 - randYParam = 1 - if(5) - randXParam = 4 - randYParam = 0 - if(6) - randXParam = 3 - randYParam = -1 - if(7) - randXParam = 2 - randYParam = -2 - if(8) - randXParam = 1 - randYParam = -3 - if(9) - randXParam = 0 - randYParam = -4 - if(10) - randXParam = -1 - randYParam = -3 - if(11) - randXParam = -2 - randYParam = -2 - if(12) - randXParam = -3 - randYParam = -1 - if(13) - randXParam = -4 - randYParam = 0 - if(14) - randXParam = -3 - randYParam = 1 - if(15) - randXParam = -2 - randYParam = 2 - if(16) - randXParam = -1 - randYParam = 3 - target_loc = last_loc - if (randXParam > 0) - target_loc = locate(target_loc.x+rand(randXParam),target_loc.y,src.z) - if (randYParam > 0) - target_loc = locate(target_loc.x,target_loc.y+rand(randYParam),src.z) - if (randXParam < 0) - target_loc = locate(target_loc.x-rand(-randXParam),target_loc.y,src.z) - if (randYParam < 0) - target_loc = locate(target_loc.x,target_loc.y-rand(-randXParam),src.z) - if (mineDirection == 1 || mineDirection == 5 || mineDirection == 9 || mineDirection == 13) //if N,S,E,W, turn quickly - if(prob(50)) - mineDirection += 2 - else - mineDirection -= 2 - if(mineDirection < 1) - mineDirection += 16 - else - if(prob(50)) - if(prob(50)) - mineDirection += 1 - else - mineDirection -= 1 - if(mineDirection < 1) - mineDirection += 16 - return - - -/obj/effect/mine_generator/proc/fillWithAsteroids() - - if(last_loc) - start_loc = last_loc - - if(start_loc && target_loc) - var/x1 - var/y1 - - var/turf/line_start = start_loc - var/turf/column = line_start - - if(start_loc.x <= target_loc.x) - if(start_loc.y <= target_loc.y) //GOING NORTH-EAST - for(y1 = start_loc.y; y1 <= target_loc.y; y1++) - for(x1 = start_loc.x; x1 <= target_loc.x; x1++) - new/turf/simulated/floor/plating/airless/asteroid(column) - column = get_step(column,EAST) - line_start = get_step(line_start,NORTH) - column = line_start - last_loc = target_loc - return - else //GOING NORTH-WEST - for(y1 = start_loc.y; y1 >= target_loc.y; y1--) - for(x1 = start_loc.x; x1 <= target_loc.x; x1++) - new/turf/simulated/floor/plating/airless/asteroid(column) - column = get_step(column,WEST) - line_start = get_step(line_start,NORTH) - column = line_start - last_loc = target_loc - return - else - if(start_loc.y <= target_loc.y) //GOING SOUTH-EAST - for(y1 = start_loc.y; y1 <= target_loc.y; y1++) - for(x1 = start_loc.x; x1 >= target_loc.x; x1--) - new/turf/simulated/floor/plating/airless/asteroid(column) - column = get_step(column,EAST) - line_start = get_step(line_start,SOUTH) - column = line_start - last_loc = target_loc - return - else //GOING SOUTH-WEST - for(y1 = start_loc.y; y1 >= target_loc.y; y1--) - for(x1 = start_loc.x; x1 >= target_loc.x; x1--) - new/turf/simulated/floor/plating/airless/asteroid(column) - column = get_step(column,WEST) - line_start = get_step(line_start,SOUTH) - column = line_start - last_loc = target_loc - return - - - return \ No newline at end of file diff --git a/code/unused/mining/rail_unused.dm b/code/unused/mining/rail_unused.dm deleted file mode 100644 index 2bd37671bc..0000000000 --- a/code/unused/mining/rail_unused.dm +++ /dev/null @@ -1,338 +0,0 @@ -/**********************Rail track**************************/ - -/obj/machinery/rail_track - name = "Rail track" - icon = 'icons/obj/mining.dmi' - icon_state = "rail" - set_dir(2) - var/id = null //this is needed for switches to work Set to the same on the whole length of the track - anchored = 1 - -/**********************Rail intersection**************************/ - -/obj/machinery/rail_track/intersections - name = "Rail track intersection" - icon_state = "rail_intersection" - -/obj/machinery/rail_track/intersections/attack_hand(user as mob) - switch (dir) - if (1) set_dir(5) - if (5) set_dir(4) - if (4) set_dir(9) - if (9) set_dir(2) - if (2) set_dir(10) - if (10) set_dir(8) - if (8) set_dir(6) - if (6) set_dir(1) - return - -/obj/machinery/rail_track/intersections/NSE - name = "Rail track T intersection" - icon_state = "rail_intersection_NSE" - set_dir(2) - -/obj/machinery/rail_track/intersections/NSE/attack_hand(user as mob) - switch (dir) - if (1) set_dir(5) - if (2) set_dir(5) - if (5) set_dir(9) - if (9) set_dir(2) - return - -/obj/machinery/rail_track/intersections/SEW - name = "Rail track T intersection" - icon_state = "rail_intersection_SEW" - set_dir(8) - -/obj/machinery/rail_track/intersections/SEW/attack_hand(user as mob) - switch (dir) - if (8) set_dir(6) - if (4) set_dir(6) - if (6) set_dir(5) - if (5) set_dir(8) - return - -/obj/machinery/rail_track/intersections/NSW - name = "Rail track T intersection" - icon_state = "rail_intersection_NSW" - set_dir(2) - -/obj/machinery/rail_track/intersections/NSW/attack_hand(user as mob) - switch (dir) - if (1) set_dir(10) - if (2) set_dir(10) - if (10) set_dir(6) - if (6) set_dir(2) - return - -/obj/machinery/rail_track/intersections/NEW - name = "Rail track T intersection" - icon_state = "rail_intersection_NEW" - set_dir(8) - -/obj/machinery/rail_track/intersections/NEW/attack_hand(user as mob) - switch (dir) - if (4) set_dir(9) - if (8) set_dir(9) - if (9) set_dir(10) - if (10) set_dir(8) - return - -/**********************Rail switch**************************/ - -/obj/machinery/rail_switch - name = "Rail switch" - icon = 'icons/obj/mining.dmi' - icon_state = "rail" - set_dir(2) - icon = 'icons/obj/recycling.dmi' - icon_state = "switch-off" - var/obj/machinery/rail_track/track = null - var/id //used for to change the track pieces - -/obj/machinery/rail_switch/New() - spawn(10) - src.track = locate(/obj/machinery/rail_track, get_step(src, NORTH)) - if(track) - id = track.id - return - -/obj/machinery/rail_switch/attack_hand(user as mob) - user << "You switch the rail track's direction" - for (var/obj/machinery/rail_track/T in world) - if (T.id == src.id) - var/obj/machinery/rail_car/C = locate(/obj/machinery/rail_car, T.loc) - if (C) - switch (T.dir) - if(1) - switch(C.direction) - if("N") C.direction = "S" - if("S") C.direction = "N" - if("E") C.direction = "S" - if("W") C.direction = "S" - if(2) - switch(C.direction) - if("N") C.direction = "S" - if("S") C.direction = "N" - if("E") C.direction = "S" - if("W") C.direction = "S" - if(4) - switch(C.direction) - if("N") C.direction = "E" - if("S") C.direction = "E" - if("E") C.direction = "W" - if("W") C.direction = "E" - if(8) - switch(C.direction) - if("N") C.direction = "E" - if("S") C.direction = "E" - if("E") C.direction = "W" - if("W") C.direction = "E" - if(5) - switch(C.direction) - if("N") C.direction = "S" - if("S") C.direction = "E" - if("E") C.direction = "S" - if("W") C.direction = "S" - if(6) - switch(C.direction) - if("N") C.direction = "S" - if("S") C.direction = "W" - if("E") C.direction = "S" - if("W") C.direction = "S" - if(9) - switch(C.direction) - if("N") C.direction = "E" - if("S") C.direction = "E" - if("E") C.direction = "N" - if("W") C.direction = "E" - if(10) - switch(C.direction) - if("N") C.direction = "W" - if("S") C.direction = "W" - if("E") C.direction = "W" - if("W") C.direction = "N" - return - -/**********************Rail car**************************/ - -/obj/machinery/rail_car - name = "Rail car" - icon = 'icons/obj/storage.dmi' - icon_state = "miningcar" - var/direction = "S" //S = south, N = north, E = east, W = west. Determines whichw ay it'll look first - var/moving = 0; - anchored = 1 - density = 1 - var/speed = 0 - var/slowing = 0 - var/atom/movable/load = null //what it's carrying - -/obj/machinery/rail_car/attack_hand(user as mob) - if (moving == 0) - processing_items.Add(src) - moving = 1 - else - processing_items.Remove(src) - moving = 0 - return - -/* -for (var/client/C) - C << "Dela." -*/ - -/obj/machinery/rail_car/MouseDrop_T(var/atom/movable/C, mob/user) - - if(user.stat) - return - - if (!istype(C) || C.anchored || get_dist(user, src) > 1 || get_dist(src,C) > 1 ) - return - - if(ismob(C)) - load(C) - - -/obj/machinery/rail_car/proc/load(var/atom/movable/C) - - if(get_dist(C, src) > 1) - return - //mode = 1 - - C.loc = src.loc - sleep(2) - C.loc = src - load = C - - C.pixel_y += 9 - if(C.layer < layer) - C.layer = layer + 0.1 - overlays += C - - if(ismob(C)) - var/mob/M = C - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - - //mode = 0 - //send_status() - -/obj/machinery/rail_car/proc/unload(var/dirn = 0) - if(!load) - return - - overlays.Cut() - - load.loc = src.loc - load.pixel_y -= 9 - load.layer = initial(load.layer) - if(ismob(load)) - var/mob/M = load - if(M.client) - M.client.perspective = MOB_PERSPECTIVE - M.client.eye = src - - - if(dirn) - step(load, dirn) - - load = null - - // in case non-load items end up in contents, dump every else too - // this seems to happen sometimes due to race conditions - // with items dropping as mobs are loaded - - for(var/atom/movable/AM in src) - AM.loc = src.loc - AM.layer = initial(AM.layer) - AM.pixel_y = initial(AM.pixel_y) - if(ismob(AM)) - var/mob/M = AM - if(M.client) - M.client.perspective = MOB_PERSPECTIVE - M.client.eye = src - -/obj/machinery/rail_car/relaymove(var/mob/user) - if(user.stat) - return - if(load == user) - unload(0) - return - -/obj/machinery/rail_car/process() - if (moving == 1) - if (slowing == 1) - if (speed > 0) - speed--; - if (speed == 0) - slowing = 0 - else - if (speed < 10) - speed++; - var/i = 0 - for (i = 0; i < speed; i++) - if (moving == 1) - switch (direction) - if ("S") - for (var/obj/machinery/rail_track/R in locate(src.x,src.y-1,src.z)) - if (R.dir == 10) - direction = "W" - if (R.dir == 9) - direction = "E" - if (R.dir == 2 || R.dir == 1 || R.dir == 10 || R.dir == 9) - for (var/mob/living/M in locate(src.x,src.y-1,src.z)) - step(M,get_dir(src,R)) - step(src,get_dir(src,R)) - break - else - moving = 0 - speed = 0 - if ("N") - for (var/obj/machinery/rail_track/R in locate(src.x,src.y+1,src.z)) - if (R.dir == 5) - direction = "E" - if (R.dir == 6) - direction = "W" - if (R.dir == 5 || R.dir == 1 || R.dir == 6 || R.dir == 2) - for (var/mob/living/M in locate(src.x,src.y+1,src.z)) - step(M,get_dir(src,R)) - step(src,get_dir(src,R)) - break - else - moving = 0 - speed = 0 - if ("E") - for (var/obj/machinery/rail_track/R in locate(src.x+1,src.y,src.z)) - if (R.dir == 6) - direction = "S" - if (R.dir == 10) - direction = "N" - if (R.dir == 4 || R.dir == 8 || R.dir == 10 || R.dir == 6) - for (var/mob/living/M in locate(src.x+1,src.y,src.z)) - step(M,get_dir(src,R)) - step(src,get_dir(src,R)) - break - else - moving = 0 - speed = 0 - if ("W") - for (var/obj/machinery/rail_track/R in locate(src.x-1,src.y,src.z)) - if (R.dir == 9) - direction = "N" - if (R.dir == 5) - direction = "S" - if (R.dir == 8 || R.dir == 9 || R.dir == 5 || R.dir == 4) - for (var/mob/living/M in locate(src.x-1,src.y,src.z)) - step(M,get_dir(src,R)) - step(src,get_dir(src,R)) - break - else - moving = 0 - speed = 0 - sleep(1) - else - processing_items.Remove(src) - moving = 0 - return \ No newline at end of file diff --git a/code/unused/mining/spaceship_builder_unused.dm b/code/unused/mining/spaceship_builder_unused.dm deleted file mode 100644 index 42b4f4e3af..0000000000 --- a/code/unused/mining/spaceship_builder_unused.dm +++ /dev/null @@ -1,173 +0,0 @@ -/**********************Spaceship builder area definitions**************************/ - -/area/shipbuilder - requires_power = 0 - luminosity = 1 - sd_lighting = 0 - -/area/shipbuilder/station - name = "shipbuilder station" - icon_state = "teleporter" - -/area/shipbuilder/ship1 - name = "shipbuilder ship1" - icon_state = "teleporter" - -/area/shipbuilder/ship2 - name = "shipbuilder ship2" - icon_state = "teleporter" - -/area/shipbuilder/ship3 - name = "shipbuilder ship3" - icon_state = "teleporter" - -/area/shipbuilder/ship4 - name = "shipbuilder ship4" - icon_state = "teleporter" - -/area/shipbuilder/ship5 - name = "shipbuilder ship5" - icon_state = "teleporter" - -/area/shipbuilder/ship6 - name = "shipbuilder ship6" - icon_state = "teleporter" - - -/**********************Spaceship builder**************************/ - -/obj/machinery/spaceship_builder - name = "Robotic Fabricator" - icon = 'icons/obj/surgery.dmi' - icon_state = "fab-idle" - density = 1 - anchored = 1 - var/metal_amount = 0 - var/operating = 0 - var/area/currentShuttleArea = null - var/currentShuttleName = null - -/obj/machinery/spaceship_builder/proc/buildShuttle(var/shuttle) - - var/shuttleat = null - var/shuttleto = "/area/shipbuilder/station" - - var/req_metal = 0 - switch(shuttle) - if("hopper") - shuttleat = "/area/shipbuilder/ship1" - currentShuttleName = "Planet hopper" - req_metal = 25000 - if("bus") - shuttleat = "/area/shipbuilder/ship2" - currentShuttleName = "Blnder Bus" - req_metal = 60000 - if("dinghy") - shuttleat = "/area/shipbuilder/ship3" - currentShuttleName = "Space dinghy" - req_metal = 100000 - if("van") - shuttleat = "/area/shipbuilder/ship4" - currentShuttleName = "Boxvan MMDLVI" - req_metal = 120000 - if("secvan") - shuttleat = "/area/shipbuilder/ship5" - currentShuttleName = "Boxvan MMDLVI - Security edition" - req_metal = 125000 - if("station4") - shuttleat = "/area/shipbuilder/ship6" - currentShuttleName = "Space station 4" - req_metal = 250000 - - if (metal_amount - req_metal < 0) - return - - if (!shuttleat) - return - - var/area/from = locate(shuttleat) - var/area/dest = locate(shuttleto) - - if(!from || !dest) - return - - currentShuttleArea = shuttleat - from.move_contents_to(dest) - return - -/obj/machinery/spaceship_builder/proc/scrapShuttle() - - var/shuttleat = "/area/shipbuilder/station" - var/shuttleto = currentShuttleArea - - if (!shuttleto) - return - - var/area/from = locate(shuttleat) - var/area/dest = locate(shuttleto) - - if(!from || !dest) - return - - currentShuttleArea = null - currentShuttleName = null - from.move_contents_to(dest) - return - -/obj/machinery/spaceship_builder/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if(operating == 1) - user << "The machine is processing" - 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 - - if (istype(W, /obj/item/stack/sheet/metal)) - - var/obj/item/stack/sheet/metal/M = W - user << "\blue You insert all the metal into the machine." - metal_amount += M.amount * 100 - del(M) - - else - return attack_hand(user) - return - -/obj/machinery/spaceship_builder/attack_hand(user as mob) - if(operating == 1) - user << "The machine is processing" - return - - var/dat - dat = text("Ship fabricator

") - dat += text("Current ammount of Metal: [metal_amount]

") - - if (currentShuttleArea) - dat += text("Currently building

[currentShuttleName]

") - dat += text("Build the shuttle to your liking.
This shuttle will be sent to the station in the event of an emergency along with a centcom emergency shuttle.") - dat += text("


Scrap current shuttle") - else - dat += text("Available ships to build:

") - dat += text("Planet hopper - Tiny, Slow, 25000 metal
") - dat += text("Blunder Bus - Small, Decent speed, 60000 metal
") - dat += text("Space dinghy - Medium size, Decent speed, 100000 metal
") - dat += text("Boxvan MMDLVIr - Medium size, Decent speed, 120000 metal
") - dat += text("Boxvan MMDLVI - Security eidition - Large, Rather slow, 125000 metal
") - dat += text("Space station 4 - Huge, Slow, 250000 metal
") - - user << browse("[dat]", "window=shipbuilder") - - -/obj/machinery/spaceship_builder/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["ship"]) - buildShuttle(href_list["ship"]) - if(href_list["scrap"]) - scrapShuttle(href_list["ship"]) - src.updateUsrDialog() - return \ No newline at end of file diff --git a/code/unused/musicplayer.dm b/code/unused/musicplayer.dm deleted file mode 100644 index ced7630e88..0000000000 --- a/code/unused/musicplayer.dm +++ /dev/null @@ -1,15 +0,0 @@ -// this toggle doesn't save across rounds -/mob/verb/musictoggle() - set name = "Music Toggle" - if(src.be_music == 0) - src.be_music = 1 - src << "\blue Music toggled on!" - return - src.be_music = 0 - src << "\blue Music toggled off!" - -// This checks a var on each area and plays that var -/area/Entered(mob/A as mob) - if (A && src.music != "" && A.client && A.be_music != 0 && (A.music_lastplayed != src.music)) - A.music_lastplayed = src.music - A << sound(src.music, repeat = 0, wait = 0, volume = 20, channel = 1) diff --git a/code/unused/new_year.dm b/code/unused/new_year.dm deleted file mode 100644 index 7e2dfb5c22..0000000000 --- a/code/unused/new_year.dm +++ /dev/null @@ -1,138 +0,0 @@ - -/obj/effect/new_year_tree - name = "The fir" - desc = "This is a fir. Real fir on dammit spess station. You smell pine-needles." - icon = 'icons/effects/160x160.dmi' - icon_state = "new-year-tree" - anchored = 1 - opacity = 1 - density = 1 - layer = 5 - pixel_x = -64 - //pixel_y = -64 - -/obj/effect/new_year_tree/attackby(obj/item/W, mob/user) - if (istype(W, /obj/item/weapon/grab)) - return - W.loc = src - if (user.client) - user.client.screen -= W - user.u_equip(W) - var/const/bottom_right_x = 115.0 - var/const/bottom_right_y = 150.0 - var/const/top_left_x = 15.0 - var/const/top_left_y = 15.0 - var/const/bottom_med_x = top_left_x+(bottom_right_x-top_left_x)/2 - var/x = rand(top_left_x,bottom_med_x) //point in half of circumscribing rectangle - var/y = rand(top_left_y,bottom_right_y) - /* - y1=a*x1+b - y2=a*x2+b b = y2-a*x2 - - y1=a*x1+ y2-a*x2 - a*(x1-x2)+y2-y1=0 - a = (y1-y2)/(x1-x2) - */ - var/a = (top_left_y-bottom_right_y)/(top_left_x-bottom_med_x) - var/b = bottom_right_y-a*bottom_med_x - - if (a*x+b < y) //if point is above diagonal top_left -> bottom_median - x = bottom_med_x + x - top_left_x - y = bottom_right_y - y + top_left_y - var/image/I = image(W.icon, W, icon_state = W.icon_state) - I.pixel_x = x - I.pixel_y = y - overlays += I -/* -/obj/item/weapon/firbang - desc = "It is set to detonate in 10 seconds." - name = "firbang" - icon = 'icons/obj/grenade.dmi' - icon_state = "flashbang" - var/state = null - var/det_time = 100.0 - w_class = 2.0 - item_state = "flashbang" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - -/obj/item/weapon/firbang/afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (user.get_active_hand() == src) - if ((CLUMSY in usr.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.state = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return - else if (!( src.state )) - user << "\red You prime the [src]! [det_time/10] seconds!" - src.state = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn( src.det_time ) - prime() - return - user.set_dir(get_dir(user, target)) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - src.add_fingerprint(user) - return - -/obj/item/weapon/firbang/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/item/weapon/firbang/attack_hand() - walk(src, null, null) - ..() - return - -/obj/item/weapon/firbang/proc/prime() - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/turf/T = get_turf(src) - if(T) - var/datum/effect/effect/system/smoke_spread/smoke = new - smoke.set_up(3, 0, src.loc) - smoke.attach(src) - smoke.start() - 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/new_year_tree(T) - del(src) - return - -/obj/item/weapon/firbang/attack_self(mob/user as mob) - if (!src.state) - if (CLUMSY in user.mutations) - user << "\red Huh? How does this thing work?!" - spawn( 5 ) - prime() - return - else - user << "\red You prime the [src]! [det_time/10] seconds!" - src.state = 1 - src.icon_state = "flashbang1" - add_fingerprint(user) - spawn( src.det_time ) - prime() - return - return - -/* -/datum/supply_packs/new_year - name = "New Year Celebration Equipment" - contains = list("/obj/item/weapon/firbang", - "/obj/item/weapon/firbang", - "/obj/item/weapon/firbang", - "/obj/item/weapon/wrapping_paper", - "/obj/item/weapon/wrapping_paper", - "/obj/item/weapon/wrapping_paper") - cost = 20 - containertype = "/obj/structure/closet/crate" - containername = "New Year Celebration crate" -*/ \ No newline at end of file diff --git a/code/unused/newcombatsystem.dm b/code/unused/newcombatsystem.dm deleted file mode 100644 index 274581a04e..0000000000 --- a/code/unused/newcombatsystem.dm +++ /dev/null @@ -1,191 +0,0 @@ -//It's not a very big change, but I think melee will benefit from it. -//Currently will only be restricted to special training weapons to test the balancedness of the system. -//1)Knockdown, stun and weaken chances are separate and dependant on the part of the body you're aiming at -//eg a mop will be better applied to legs since it has a higher base knockdown chance than the other disabling states -//while an energy gun would be better applied to the chest because of the stunning chance. -//2)Weapons also have a parry chance which is checked every time the one wielding the weapon is attacked in melee -//in the area is currently aiming at and is able to defend himself. -//More ideas to come. - -//NOTES: doesn't work with armor yet - -/obj/item/weapon/training //subclass of weapons that is currently the only one that uses the alternate combat system - name = "training weapon" - desc = "A weapon for training the advanced fighting technicues" - var/chance_parry = 0 - var/chance_weaken = 0 - var/chance_stun = 0 - var/chance_knockdown = 0 - var/chance_knockout = 0 - var/chance_disarm = 0 - -//chances - 5 is low, 10 is medium, 15 is good - -/obj/item/weapon/training/axe //hard-hitting, but doesn't have much in terms of disabling people (except by killing) - name = "training axe" - icon_state = "training_axe" - /*combat stats*/ - force = 15 - chance_parry = 5 - chance_weaken = 10 - chance_stun = 5 - chance_knockdown = 5 - chance_knockout = 5 - chance_disarm = 0 - -/obj/item/weapon/training/sword //not bad attack, good at parrying and disarming - name = "training sword" - icon_state = "training_sword" - /*combat stats*/ - force = 10 - chance_parry = 15 - chance_weaken = 5 - chance_stun = 0 - chance_knockdown = 5 - chance_knockout = 0 - chance_disarm = 15 - -/obj/item/weapon/training/staff //not bad attack either, good at tripping and parrying - name = "training staff" - icon_state = "training_staff" - /*combat stats*/ - force = 10 - chance_parry = 15 - chance_weaken = 5 - chance_stun = 0 - chance_knockdown = 15 - chance_knockout = 0 - chance_disarm = 5 - -/obj/item/weapon/training/mace //worst attack, but has a good chance of stun, knockout or weaken - name = "training mace" - icon_state = "training_mace" - /*combat stats*/ - force = 5 - chance_parry = 0 - chance_weaken = 15 - chance_stun = 10 - chance_knockdown = 0 - chance_knockout = 10 - chance_disarm = 0 - -/obj/item/weapon/training/attack(target as mob, mob/user as mob) - var/target_area = attack_location(user.zone_sel.selecting) - for(var/mob/O in viewers(src,7)) - O << "\red \b [user.name] attacks [target.name] in the [target_area] with [src.name]!" - if(!target.stat && target.zone_sel.selecting == target_area) //parrying occurs here - if(istype(target.r_hand,/obj/item/weapon/training) - if(prob(target.r_hand:chance_parry)) - for(var/mob/O in viewers(src,7)) - O << "\red \b [target.name] deftly parries the attack with [target.r_hand.name]!" - return - if(istype(target.l_hand,/obj/item/weapon/training) - if(prob(target.l_hand:chance_parry)) - for(var/mob/O in viewers(src,7)) - O << "\red \b [target.name] deftly parries the attack with [target.l_hand.name]!" - return - target.adjustBruteLoss(-src.force) - - var/modifier_knockdown = 1.0 - var/modifier_knockout = 1.0 - var/modifier_stun = 1.0 - var/modifier_weaken = 1.0 - var/modifier_disarm = 0.0 - - switch(target_area) - if("eyes") - modifier_weaken = 2.0 - modifier_stun = 0.5 - modifier_knockdown = 0.0 - if("head") - modifier_stun = 0.8 - modifier_knockout = 1.5 - modifier_weaken = 1.2 - modifier_knockdown = 0.0 - if("chest") - if("right arm","r_arm") - if("left arm","l_arm") - if("right hand","r_hand") - if("left hand","l_hand") - if("groin") - if("right leg","r_leg") - if("left leg","l_leg") - if("right foot","r_foot") - if("left foot","l_foot") - - -/proc/attack_location(var/initloc = "chest") //proc to randomise actual hit loc based on where you're aiming at - var/resultloc = "chest" //also forgot hands/feet. bleh - var/percentage = rand(1,100) - switch(initloc) - if("eyes") - switch(percentage) - if(1 to 10) - resultloc = "eyes" - if(11 to 30) - resultloc = "head" - if(31 to 100) - resultloc = "chest" - if("head") - switch(percentage) - if(1 to 5) - resultloc = "eyes" - if(6 to 40) - resultloc = "head" - if(41 to 100) - resultloc = "chest" - if("chest") - switch(percentage) - if(1 to 80) - resultloc = "chest" - if(81 to 84) - resultloc = "right arm" - if(85 to 88) - resultloc = "left arm" - if(89 to 92) - resultloc = "right leg" - if(93 to 96) - resultloc = "left leg" - if(97 to 98) - resultloc = "groin" - if(99 to 100) - resultloc = "head" - if("l_arm") - switch(percentage) - if(1 to 60) - resultloc = "left arm" - if(61 to 100) - resultloc = "chest" - if("r_arm") - switch(percentage) - if(1 to 60) - resultloc = "right arm" - if(61 to 100) - resultloc = "chest" - if("groin") - switch(percentage) - if(1 to 35) - resultloc = "groin" - if(36 to 50) - resultloc = "left leg" - if(51 to 65) - resultloc = "right leg" - if(66 to 100) - resultloc = "chest" - if("l_leg") - switch(percentage) - if(1 to 60) - resultloc = "left leg" - if(61 to 70) - resultloc = "groin" - if(71 to 100) - resultloc = "chest" - if("r_leg") - switch(percentage) - if(1 to 60) - resultloc = "right leg" - if(61 to 70) - resultloc = "groin" - if(71 to 100) - resultloc = "chest" - return resultloc \ No newline at end of file diff --git a/code/unused/optics/beam.dm b/code/unused/optics/beam.dm deleted file mode 100644 index 0c2ebfcdf6..0000000000 --- a/code/unused/optics/beam.dm +++ /dev/null @@ -1,178 +0,0 @@ -// the laser beam - - -/obj/effect/beam/laser - name = "laser beam" - icon = 'icons/effects/beam.dmi' - icon_state = "full" - density = 0 - mouse_opacity = 0 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - flags = TABLEPASS - var/wavelength // the (vaccuum) wavelength of the beam - var/width = 1 // 1=thin, 2=medium, 3=wide - - var/obj/effect/beam/laser/next - var/obj/effect/beam/laser/prev - var/obj/master - - New(var/atom/newloc, var/dirn, var/lambda, var/omega=1, var/half=0) - - if(!isturf(loc)) - return - - //world << "creating beam at ([newloc.x],[newloc.y]) with [dirn] [lambda] [omega] [half]" - - icon_state = "[omega]-[half ? "half" : "full"]" - set_dir(dirn) - set_wavelength(lambda) - ..(newloc) - spawn(0) - src.propagate() - src.verbs -= /atom/movable/verb/pull - - - - proc/propagate() - var/turf/T = get_step(src, dir) - if(T) - if(T.Enter(src)) - next = new(T, dir, wavelength, width, 0) - next.prev = src - next.master = src.master - else - spawn(5) - propagate() - - - proc/remove() - if(next) - next.remove() - del(src) - - - - proc/blocked(var/atom/A) - return density || opacity -/* -/turf/Enter(atom/movable/mover as mob|obj) - if (!mover || !isturf(mover.loc)) - return 1 - - - //First, check objects to block exit that are not on the border - for(var/obj/obstacle in mover.loc) - if((obstacle.flags & ~ON_BORDER) && (mover != obstacle) && (forget != obstacle)) - if(!obstacle.CheckExit(mover, src)) - mover.Bump(obstacle, 1) - return 0 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in mover.loc) - if((border_obstacle.flags & ON_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) - if(!border_obstacle.CheckExit(mover, src)) - mover.Bump(border_obstacle, 1) - return 0 - - //Next, check objects to block entry that are on the border - for(var/obj/border_obstacle in src) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != border_obstacle)) - mover.Bump(border_obstacle, 1) - return 0 - - //Then, check the turf itself - if (!src.CanPass(mover, src)) - mover.Bump(src, 1) - return 0 - - //Finally, check objects/mobs to block entry that are not on the border - for(var/atom/movable/obstacle in src) - if(obstacle.flags & ~ON_BORDER) - if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle)) - mover.Bump(obstacle, 1) - return 0 - return 1 //Nothing found to block so return success! -*/ - - - HasEntered(var/atom/movable/AM) - if(istype(AM, /obj/effect/beam)) - return - if(blocked(AM)) - remove(src) - if(prev) - prev.propagate() - else if(master) - master:turn_on() - - proc/set_wavelength(var/lambda) - - var/w = round(lambda,1) // integer wavelength - wavelength = lambda - // first look for cached version of the icon at this wavelength - var/icon/cached = beam_icons["[w]"] - if(cached) - icon = cached - - return - - // no cached version, so generate a new one - - // this maps a wavelength in the range 380-780 nm to an R,G,B,A value - var/red = 0 - var/green = 0 - var/blue = 0 - var/alpha = 0 - - switch(w) - if(380 to 439) - red = (440-w) / 60 - green = 0 - blue = 1 - if(440 to 489) - red = 0 - green = (w-440) / 50 - blue = 1 - if(490 to 509) - red = 0 - green = 1 - blue = (510 - w) / 20 - if(510 to 579) - red = (w-510) / 70 - green = 1 - blue = 0 - if(580 to 644) - red = 1 - green = (645-w) / 65 - blue = 0 - if(645 to 780) - red = 1 - green = 0 - blue = 0 - - // colour is done, now calculate intensity - switch(w) - if(380 to 419) - alpha = 0.75*(w-380)/40 - if(420 to 700) - alpha = 0.75 - if(701 to 780) - alpha = 0.75*(780-w)/80 - - // remap alpha by intensity gamma - if(alpha != 0) - alpha = alpha**0.80 - - var/icon/I = icon('icons/effects/beam.dmi') - I.MapColors(red,0,0,0, 0,green,0,0, 0,0,blue,0, 0,0,0,alpha, 0,0,0,0) - icon = I - - beam_icons["[w]"] = I - - - -// global cache of beam icons -// this is an assoc list mapping (integer) wavelength to icons - -var/list/beam_icons = new() \ No newline at end of file diff --git a/code/unused/optics/laser-pointer.dm b/code/unused/optics/laser-pointer.dm deleted file mode 100644 index 378ba7b780..0000000000 --- a/code/unused/optics/laser-pointer.dm +++ /dev/null @@ -1,73 +0,0 @@ -// A laser pointer. Emits a (tunable) low-power laser beam -// Used for alignment and testing of the optics system - -/obj/item/device/laser_pointer - name = "laser pointer" - desc = "A portable low-power laser used for optical system alignment. The label reads: 'Danger: Class IIIa laser device. Avoid direct eye exposure." - icon = 'optics.dmi' - icon_state = "pointer0" - var/on = 0 // true if operating - var/wavelength = 632 // operation wavelength (nm) - - var/gain_peak = 632 // gain peak (nm) - var/gain_width = 35 // gain bandwidth (nm) - var/peak_output = 0.005 // max output 5 mW - layer = OBJ_LAYER + 0.1 - - w_class = 4 - m_amt = 500 - g_amt = 100 - w_amt = 200 - - var/obj/effect/beam/laser/beam // the created beam - - flags = FPRINT | CONDUCT | TABLEPASS - - attack_ai() - return - - attack_paw() - return - - attack_self(var/mob/user) - - - on = !on - if(on) - turn_on() - else - turn_off() - - updateicon() - - verb/rotate() - set name = "Rotate" - set src in view(1) - turn_off() - set_dir(turn(dir, -90)) - if(on) turn_on() - - Move(var/atom/newloc,var/newdir) - . = ..(newloc,newdir) - if(on && . && isturf(newloc)) - turn_off() - turn_on() - return . - - proc/turn_on() - if(!isturf(loc)) - return - - beam = new(loc, dir, wavelength, 1, 1) - beam.master = src - - proc/turn_off() - if(beam) - beam.remove() - - dropped() - turn_off() - turn_on() - - proc/updateicon() - icon_state = "pointer[on]" \ No newline at end of file diff --git a/code/unused/optics/mirror.dm b/code/unused/optics/mirror.dm deleted file mode 100644 index ca7b7be860..0000000000 --- a/code/unused/optics/mirror.dm +++ /dev/null @@ -1,83 +0,0 @@ -// Mirror object -// Part of the optics system -// -// reflects laser beams -// 16 directional states 0/22.5/45/67.5deg to allow for 0/45deg beam angles - - -// ideas: -// frame/stand icon w/ mirror directional overlay -// two sets of overlay icons for 0/45 and 22.5/67.5 deg angles - -// can rotate cw/acw - need screwdriver to loosen/tighten mirror -// use wrench to anchor/unanchor frame -// if touched, gets dirty - fingerprints, which reduce reflectivity -// if dirty and hit with high-power beam, mirror may shatter -// some kind of dust accumulation with HasProximity? Could check for mob w/o labcoat etc. -// can clean with acetone+wipes - -/obj/optical/mirror - icon = 'optical.dmi' - icon_state = "mirrorA" - set_dir(1) - desc = "A large, optical-grade mirror firmly mounted on a stand." - flags = FPRINT - anchored = 0 - var/rotatable = 0 // true if mirror can be rotated - var/angle = 0 // normal of mirror, 0-15. 0=N, 1=NNE, 2=NE, 3=ENE, 4=E etc - - - New() - ..() - set_angle() - - - - //set the angle from icon_state and dir - proc/set_angle() - switch(dir) - if(1) - angle = 0 - if(5) - angle = 2 - if(4) - angle = 4 - if(6) - angle = 6 - if(2) - angle = 8 - if(10) - angle = 10 - if(8) - angle = 12 - if(9) - angle = 14 - - if(icon_state == "mirrorB") // 22.5deg turned states - angle++ - return - - // set the dir and icon_state from the angle - proc/set_dir() - if(angle%2 == 1) - icon_state = "mirrorB" - else - icon_state = "mirrorA" - switch(round(angle/2)*2) - if(0) - set_dir(1) - if(2) - set_dir(5) - if(4) - set_dir(4) - if(6) - set_dir(6) - if(8) - set_dir(2) - if(10) - set_dir(10) - if(12) - set_dir(8) - if(14) - set_dir(9) - return \ No newline at end of file diff --git a/code/unused/pda2/base_os.dm b/code/unused/pda2/base_os.dm deleted file mode 100644 index a92a3381e1..0000000000 --- a/code/unused/pda2/base_os.dm +++ /dev/null @@ -1,446 +0,0 @@ -/datum/computer/file/pda_program/os - proc - receive_os_command(list/command_list) - if((!src.holder) || (!src.master) || (!command_list) || !(command_list["command"])) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - return 0 - -//Main os program: Provides old pda interface and four programs including file browser, notes, messenger, and atmos scan - main_os - name = "ThinkOS 7" - size = 8.0 - var/mode = 0 - //Note vars - var/note = "Congratulations, your station has chosen the Thinktronic 5150 Personal Data Assistant!" - var/note_mode = 0 //0 For note editor, 1 for note browser - var/datum/computer/file/text/note_file = null //If set, save to this file. - //Messenger vars - var/list/detected_pdas = list() - var/message_on = 1 - var/message_silent = 0 //To beep or not to beep, that is the question - var/message_mode = 0 //0 for pda list, 1 for messages - var/message_tone = "beep" //Custom ringtone - var/message_note = null //Current messages in memory (Store as separate file only later??) - //File browser vars - var/datum/computer/folder/browse_folder = null - var/datum/computer/file/clipboard = null //Current file to copy - - - - receive_os_command(list/command_list) - if(..()) - return - - //world << "[command_list["command"]]" - return - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - switch(src.mode) - if(0) - dat += "

PERSONAL DATA ASSISTANT

" - dat += "Owner: [src.master.owner]

" - - dat += "

General Functions

" - dat += "" - - dat += "

Utilities

" - dat += "" - - if(1) - //Note Program. Can save/load note files. - dat += "

Notekeeper V2.5

" - - if(!src.note_mode) - dat += "Edit" - dat += " | New File" - dat += " | Save" - dat += " | Load
" - - dat += src.note - else - dat += " Back" - dat += " | \[[src.holding_folder.holder.file_amount - src.holding_folder.holder.file_used]\] Free
" - dat += "" - - for(var/datum/computer/file/text/T in src.holding_folder.contents) - dat += "" - dat += "" - dat += "" - - dat += "
[T.name][T.extension]Length: [T.data ? (length(T.data)) : "0"]
" - - if(2) - //Messenger. Uses Radio. Is a messenger. - //TO-DO: ~file sharing~ - src.master.overlays.Cut() //Remove existing alerts - dat += "

SpaceMessenger V4.0.5

" - - if (!src.message_mode) - - dat += "Ringer: [src.message_silent == 1 ? "Off" : "On"] | " - dat += "Send / Receive: [src.message_on == 1 ? "On" : "Off"] | " - dat += "Set Ringtone | " - dat += "Messages
" - - dat += "Scan
" - dat += "Detected PDAs
" - - dat += "
    " - - var/count = 0 - - if (src.message_on) - for (var/obj/item/device/pda2/P in src.detected_pdas) - if (!P.owner) - src.detected_pdas -= P - continue - else if (P == src) //I guess this can happen if somebody copies the system file. - src.detected_pdas -= P - continue - - dat += "
  • [P]" - - dat += "
  • " - count++ - - dat += "
" - - if (count == 0) - dat += "None detected.
" - - else - dat += "Clear | " - dat += "Back
" - - dat += "

Messages

" - - dat += src.message_note - dat += "
" - - if(3) - //File Browser. - //To-do(?): Setting "favorite" programs to access straight from main menu - //Not sure how needed it is, not like they have to go through 500 subfolders or whatever - if((!src.browse_folder) || !(src.browse_folder.holder in src.master)) - src.browse_folder = src.holding_folder - - dat += " | Paste" - dat += " | Drive: " - dat += "\[[src.browse_folder.holder == src.master.hd ? "MAIN" : "CART"]\]
" - - dat += "Contents of [browse_folder] | Drive ID:\[[src.browse_folder.holder.title]]
" - dat += "Used: \[[src.browse_folder.holder.file_used]/[src.browse_folder.holder.file_amount]\]
" - - dat += "" - for(var/datum/computer/file/F in browse_folder.contents) - if(F == src) - dat += "" - continue - dat += "" - dat += "" - - dat += "" - - dat += "" - dat += "" - - dat += "" - - dat += "" - - dat += "
SystemSize: [src.size]SYSTEM
[F.name]Size: [F.size][F.extension]DelRenameCopy
" - - if(4) - //Atmos Scanner - dat += "

Atmospheric Readings

" - - var/turf/T = get_turf_or_move(get_turf(src.master)) - if (isnull(T)) - dat += "Unable to obtain a reading.
" - else - var/datum/gas_mixture/environment = T.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - dat += "Air Pressure: [round(pressure,0.1)] kPa
" - - if (total_moles()) - var/o2_level = environment.oxygen/total_moles() - var/n2_level = environment.nitrogen/total_moles() - var/co2_level = environment.carbon_dioxide/total_moles() - var/plasma_level = environment.toxins/total_moles() - var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level) - - dat += "Nitrogen: [round(n2_level*100)]%
" - - dat += "Oxygen: [round(o2_level*100)]%
" - - dat += "Carbon Dioxide: [round(co2_level*100)]%
" - - dat += "Plasma: [round(plasma_level*100)]%
" - - if(unknown_level > 0.01) - dat += "OTHER: [round(unknown_level)]%
" - - dat += "Temperature: [round(environment.temperature-T0C)]°C
" - - dat += "
" - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["mode"]) - var/newmode = text2num(href_list["mode"]) - src.mode = max(newmode, 0) - - else if(href_list["flight"]) - src.master.toggle_light() - - else if(href_list["scanner"]) - if(src.master.scan_program) - src.master.scan_program = null - - else if(href_list["input"]) - switch(href_list["input"]) - if("tone") - var/t = input(usr, "Please enter new ringtone", src.name, src.message_tone) as text - if (!t) - return - - if (!src.master || !in_range(src.master, usr) && src.master.loc != usr) - return - - if(!(src.holder in src.master)) - return - - t = copytext(sanitize(t), 1, 20) - src.message_tone = t - - if("note") - var/t = input(usr, "Please enter note", src.name, src.note) as message - if (!t) - return - - if (!src.master || !in_range(src.master, usr) && src.master.loc != usr) - return - - if(!(src.holder in src.master)) - return - - t = copytext(adminscrub(t), 1, MAX_MESSAGE_LEN) - src.note = t - - - if("message") - var/obj/item/device/pda2/P = locate(href_list["target"]) - if(!P || !istype(P)) - return - - var/t = input(usr, "Please enter message", P.name, null) as text - if (!t) - return - - if (!src.master || !in_range(src.master, usr) && src.master.loc != usr) - return - - if(!(src.holder in src.master)) - return - - - var/datum/signal/signal = new - signal.data["command"] = "text message" - signal.data["message"] = t - signal.data["sender"] = src.master.owner - signal.data["tag"] = "\ref[P]" - src.post_signal(signal) - src.message_note += "→ To [P.owner]:
[t]
" - log_pda("[usr] sent [t] to [P.owner]") - - if("rename") - var/datum/computer/file/F = locate(href_list["target"]) - if(!F || !istype(F)) - return - - var/t = input(usr, "Please enter new name", src.name, F.name) as text - t = copytext(sanitize(t), 1, 16) - if (!t) - return - if (!in_range(src.master, usr) || !(F.holder in src.master)) - return - if(F.holder.read_only) - return - F.name = capitalize(lowertext(t)) - - - else if(href_list["message_func"]) //Messenger specific topic junk - switch(href_list["message_func"]) - if("ringer") - src.message_silent = !src.message_silent - if("on") - src.message_on = !src.message_on - if("clear") - src.message_note = null - if("scan") - if(src.message_on) - src.detected_pdas = list() - var/datum/signal/signal = new - signal.data["command"] = "report pda" - src.post_signal(signal) - - else if(href_list["note_func"]) //Note program specific topic junk - switch(href_list["note_func"]) - if("new") - src.note_file = null - src.note = null - if("save") - if(src.note_file && src.note_file.holder in src.master) - src.note_file.data = src.note - else - var/datum/computer/file/text/F = new /datum/computer/file/text - if(!src.holding_folder.add_file(F)) - del(F) - else - src.note_file = F - F.data = src.note - - if("load") - var/datum/computer/file/text/T = locate(href_list["target"]) - if(!T || !istype(T)) - return - - src.note_file = T - src.note = note_file.data - src.note_mode = 0 - - if("switchmenu") - src.note_mode = !src.note_mode - - else if(href_list["browse_func"]) //File browser specific topic junk - var/datum/computer/target = locate(href_list["target"]) - switch(href_list["browse_func"]) - if("drive") - if(src.browse_folder.holder == src.master.hd && src.master.cartridge && (src.master.cartridge.root)) - src.browse_folder = src.master.cartridge.root - else - src.browse_folder = src.holding_folder - if("open") - if(!target || !istype(target)) - return - if(istype(target, /datum/computer/file/pda_program)) - if(istype(target,/datum/computer/file/pda_program/os) && (src.master.host_program)) - return - else - src.master.run_program(target) - src.master.updateSelfDialog() - return - - if("delete") - if(!target || !istype(target)) - return - src.master.delete_file(target) - - if("copy") - if(istype(target,/datum/computer/file) && (!target.holder || (target.holder in src.master.contents))) - src.clipboard = target - - if("paste") - if(istype(target,/datum/computer/folder)) - if(!src.clipboard || !src.clipboard.holder || !(src.clipboard.holder in src.master.contents)) - return - - if(!istype(src.clipboard)) - return - - src.clipboard.copy_file_to_folder(target) - - - else if(href_list["message_mode"]) - var/newmode = text2num(href_list["message_mode"]) - src.message_mode = max(newmode, 0) - - src.master.add_fingerprint(usr) - src.master.updateSelfDialog() - return - - receive_signal(datum/signal/signal) - if(..()) - return - - switch(signal.data["command"]) - if("text message") - if(!message_on || !signal.data["message"]) - return - var/sender = signal.data["sender"] - if(!sender) - sender = "!Unknown!" - - src.message_note += "← From [sender]:
[signal.data["message"]]
" - var/alert_beep = null //Don't beep if set to silent. - if(!src.message_silent) - alert_beep = src.message_tone - - src.master.display_alert(alert_beep) - src.master.updateSelfDialog() - - if("report pda") - if(!message_on) - return - - var/datum/signal/newsignal = new - newsignal.data["command"] = "reporting pda" - newsignal.data["tag"] = "\ref[signal.source]" - src.post_signal(newsignal) - - if("reporting pda") - if(!detected_pdas) - detected_pdas = new() - - if(!(signal.source in detected_pdas)) - detected_pdas += signal.source - - src.master.updateSelfDialog() - - return - - return_text_header() - if(!src.master) - return - - var/dat - - if(src.mode) - dat += " | Main Menu" - - else if (!isnull(src.master.cartridge)) - dat += " | Eject [src.master.cartridge]" - - dat += " | Refresh" - - return dat \ No newline at end of file diff --git a/code/unused/pda2/base_program.dm b/code/unused/pda2/base_program.dm deleted file mode 100644 index f5c11efc07..0000000000 --- a/code/unused/pda2/base_program.dm +++ /dev/null @@ -1,185 +0,0 @@ -//Eventual plan: Convert all datum/data to datum/computer/file -/datum/computer/file/text - name = "text" - extension = "TEXT" - size = 2.0 - var/data = null - -/datum/computer/file/record - name = "record" - extension = "REC" - - var/list/fields = list( ) - - -//base pda program - -/datum/computer/file/pda_program - name = "blank program" - extension = "PPROG" - var/obj/item/device/pda2/master = null - var/id_tag = null - - os - name = "blank system program" - extension = "PSYS" - - scan - name = "blank scan program" - extension = "PSCAN" - - New(obj/holding as obj) - if(holding) - src.holder = holding - - if(istype(src.holder.loc,/obj/item/device/pda2)) - src.master = src.holder.loc - - proc - return_text() - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - //world << "Holder [holder] not in [master] of prg:[src]" - if(master.active_program == src) - master.active_program = null - return 1 - - if(!src.holder.root) - src.holder.root = new /datum/computer/folder - src.holder.root.holder = src - src.holder.root.name = "root" - - return 0 - - process() //This isn't actually used at the moment - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - if(!src.holder.root) - src.holder.root = new /datum/computer/folder - src.holder.root.holder = src - src.holder.root.name = "root" - - return 0 - - //maybe remove this, I haven't found a good use for it yet - send_os_command(list/command_list) - if(!src.master || !src.holder || src.master.host_program || !command_list) - return 1 - - if(!istype(src.master.host_program) || src.master.host_program == src) - return 1 - - src.master.host_program.receive_os_command() - - return 0 - - return_text_header() - if(!src.master || !src.holder) - return - - var/dat = " | Main Menu" - dat += " | Refresh" - - return dat - - post_signal(datum/signal/signal, newfreq) - if(master) - master.post_signal(signal, newfreq) - else - del(signal) - - transfer_holder(obj/item/weapon/disk/data/newholder,datum/computer/folder/newfolder) - - if((newholder.file_used + src.size) > newholder.file_amount) - return 0 - - if(!newholder.root) - newholder.root = new /datum/computer/folder - newholder.root.holder = newholder - newholder.root.name = "root" - - if(!newfolder) - newfolder = newholder.root - - if((src.holder && src.holder.read_only) || newholder.read_only) - return 0 - - if((src.holder) && (src.holder.root)) - src.holder.root.remove_file(src) - - newfolder.add_file(src) - - if(istype(newholder.loc,/obj/item/device/pda2)) - src.master = newholder.loc - - //world << "Setting [src.holder] to [newholder]" - src.holder = newholder - return 1 - - - receive_signal(datum/signal/signal) - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - return 0 - - - Topic(href, href_list) - if((!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(src.master.active_program != src) - return 1 - - if ((!usr.contents.Find(src.master) && (!in_range(src.master, usr) || !istype(src.master.loc, /turf))) && (!istype(usr, /mob/living/silicon))) - return 1 - - if(!(holder in src.master.contents)) - if(master.active_program == src) - master.active_program = null - return 1 - - usr.machine = src.master - - if (href_list["close"]) - usr.machine = null - usr << browse(null, "window=pda2") - return 0 - - if (href_list["quit"]) -// src.master.processing_programs.Remove(src) - if(src.master.host_program && src.master.host_program.holder && (src.master.host_program.holder in src.master.contents)) - src.master.run_program(src.master.host_program) - src.master.updateSelfDialog() - return 1 - else - src.master.active_program = null - src.master.updateSelfDialog() - return 1 - - return 0 \ No newline at end of file diff --git a/code/unused/pda2/pda2.dm b/code/unused/pda2/pda2.dm deleted file mode 100644 index fb3001c9a0..0000000000 --- a/code/unused/pda2/pda2.dm +++ /dev/null @@ -1,298 +0,0 @@ -//The advanced pea-green monochrome lcd of tomorrow. - - -//TO-DO: rearrange all this disk/data stuff so that fixed disks are the parent type -//because otherwise you have carts going into floppy drives and it's ALL MAD -/obj/item/weapon/disk/data/cartridge - name = "Cart 2.0" - desc = "A data cartridge for portable microcomputers." - icon = 'icons/obj/pda.dmi' - icon_state = "cart" - item_state = "electronic" - file_amount = 80.0 - title = "ROM Cart" - - pda2test - name = "Test Cart" - New() - ..() - src.root.add_file( new /datum/computer/file/computer_program/arcade(src)) - src.root.add_file( new /datum/computer/file/pda_program/manifest(src)) - src.root.add_file( new /datum/computer/file/pda_program/status_display(src)) - src.root.add_file( new /datum/computer/file/pda_program/signaler(src)) - src.root.add_file( new /datum/computer/file/pda_program/qm_records(src)) - src.root.add_file( new /datum/computer/file/pda_program/scan/health_scan(src)) - src.root.add_file( new /datum/computer/file/pda_program/records/security(src)) - src.root.add_file( new /datum/computer/file/pda_program/records/medical(src)) - src.read_only = 1 - - -/obj/item/device/pda2 - name = "PDA" - desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by an EEPROM cartridge." - icon = 'icons/obj/pda.dmi' - icon_state = "pda" - item_state = "electronic" - w_class = 2.0 - flags = FPRINT | TABLEPASS - slow_flags = SLOT_BELT - - var/owner = null - var/default_cartridge = null // Access level defined by cartridge - var/obj/item/weapon/disk/data/cartridge/cartridge = null //current cartridge - var/datum/computer/file/pda_program/active_program = null - var/datum/computer/file/pda_program/os/host_program = null - var/datum/computer/file/pda_program/scan/scan_program = null - var/obj/item/weapon/disk/data/fixed_disk/hd = null - var/fon = 0 //Is the flashlight function on? - var/f_lum = 3 //Luminosity for the flashlight function -// var/datum/data/record/active1 = null //General -// var/datum/data/record/active2 = null //Medical -// var/datum/data/record/active3 = null //Security -// var/obj/item/weapon/integrated_uplink/uplink = null //Maybe replace uplink with some remote ~syndicate~ server - var/frequency = 1149 - var/datum/radio_frequency/radio_connection - - var/setup_default_cartridge = null //Cartridge contains job-specific programs - var/setup_drive_size = 24.0 //PDAs don't have much work room at all, really. - var/setup_system_os_path = /datum/computer/file/pda_program/os/main_os //Needs an operating system to...operate!! - - -/obj/item/device/pda2/pickup(mob/user) - if (src.fon) - src.sd_SetLuminosity(0) - user.sd_SetLuminosity(user.luminosity + src.f_lum) - -/obj/item/device/pda2/dropped(mob/user) - if (src.fon) - user.sd_SetLuminosity(user.luminosity - src.f_lum) - src.sd_SetLuminosity(src.f_lum) - -/obj/item/device/pda2/New() - ..() - spawn(5) - src.hd = new /obj/item/weapon/disk/data/fixed_disk(src) - src.hd.file_amount = src.setup_drive_size - src.hd.name = "Minidrive" - src.hd.title = "Minidrive" - - if(src.setup_system_os_path) - src.host_program = new src.setup_system_os_path - - src.hd.file_amount = max(src.hd.file_amount, src.host_program.size) - - src.host_program.transfer_holder(src.hd) - - if(radio_controller) - radio_controller.add_object(src, frequency) - - - if (src.default_cartridge) - src.cartridge = new src.setup_default_cartridge(src) -// if(src.owner) -// processing_items.Add(src) - -/obj/item/device/pda2/attack_self(mob/user as mob) - user.machine = src - - var/dat = "Personal Data Assistant" - - dat += "Close" - - if (!src.owner) - if(src.cartridge) - dat += " | Eject [src.cartridge]" - dat += "
Warning: No owner information entered. Please swipe card.

" - dat += "Retry" - else - if(src.active_program) - dat += src.active_program.return_text() - else - if(src.host_program) - src.run_program(src.host_program) - dat += src.active_program.return_text() - else - if(src.cartridge) - dat += " | Eject [src.cartridge]
" - dat += "
Fatal Error 0x17
" - dat += "No System Software Loaded
" - //To-do: System recovery shit (maybe have a dedicated computer for this kind of thing) - - - user << browse(dat,"window=pda2") - onclose(user,"pda2") - return - -/obj/item/device/pda2/Topic(href, href_list) - ..() - - if (usr.contents.Find(src) || usr.contents.Find(src.master) || (istype(src.loc, /turf) && get_dist(src, usr) <= 1)) - if (usr.stat || usr.restrained()) - return - - src.add_fingerprint(usr) - usr.machine = src - - - if(href_list["return_to_host"]) - if(src.host_program) - src.active_program = src.host_program - src.host_program = null - - else if (href_list["eject_cart"]) - src.eject_cartridge() - - else if (href_list["refresh"]) - src.updateSelfDialog() - - else if (href_list["close"]) - usr << browse(null, "window=pda2") - usr.machine = null - - src.updateSelfDialog() - return - -/obj/item/device/pda2/attackby(obj/item/weapon/C as obj, mob/user as mob) - if (istype(C, /obj/item/weapon/disk/data/cartridge) && isnull(src.cartridge)) - user.drop_item() - C.loc = src - user << "\blue You insert [C] into [src]." - src.cartridge = C - src.updateSelfDialog() - - else if (istype(C, /obj/item/weapon/card/id) && !src.owner && C:registered_name) - src.owner = C:registered_name - src.name = "PDA-[src.owner]" - user << "\blue Card scanned." - src.updateSelfDialog() - -/obj/item/device/pda2/receive_signal(datum/signal/signal) - if(!signal || signal.encryption || !src.owner) return - - if(signal.data["tag"] && signal.data["tag"] != "\ref[src]") return - - if(src.host_program) - src.host_program.receive_signal(signal) - - if(src.active_program && (src.active_program != src.host_program)) - src.host_program.receive_signal(signal) - - return - -/obj/item/device/pda2/attack(mob/M as mob, mob/user as mob) - if(src.scan_program) - return - else - ..() - -/obj/item/device/pda2/afterattack(atom/A as mob|obj|turf|area, mob/user as mob) - var/scan_dat = null - if(src.scan_program && istype(src.scan_program)) - scan_dat = src.scan_program.scan_atom(A) - - if(scan_dat) - A.visible_message("\red [user] has scanned [A]!") - user.show_message(scan_dat, 1) - - return - - -/obj/item/device/pda2/proc - - post_signal(datum/signal/signal,var/newfreq) - if(!signal) - return - var/freq = newfreq - if(!freq) - freq = src.frequency - - signal.source = src - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) - - signal.transmission_method = TRANSMISSION_RADIO - if(frequency) - return frequency.post_signal(src, signal) - else - del(signal) - - eject_cartridge() - if(src.cartridge) - var/turf/T = get_turf(src) - - if(src.active_program && (src.active_program.holder == src.cartridge)) - src.active_program = null - - if(src.host_program && (src.host_program.holder == src.cartridge)) - src.host_program = null - - if(src.scan_program && (src.scan_program.holder == src.cartridge)) - src.scan_program = null - - src.cartridge.loc = T - src.cartridge = null - - return - - //Toggle the built-in flashlight - toggle_light() - src.fon = (!src.fon) - - if (ismob(src.loc)) - if (src.fon) - src.loc.sd_SetLuminosity(src.loc.luminosity + src.f_lum) - else - src.loc.sd_SetLuminosity(src.loc.luminosity - src.f_lum) - else - src.sd_SetLuminosity(src.fon * src.f_lum) - - src.updateSelfDialog() - - display_alert(var/alert_message) //Add alert overlay and beep - if (alert_message) - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, src.loc)) - O.show_message(text("\icon[src] *[alert_message]*")) - - src.overlays.Cut() - src.overlays += image('icons/obj/pda.dmi', "pda-r") - return - - run_program(datum/computer/file/pda_program/program) - if((!program) || (!program.holder)) - return 0 - - if(!(program.holder in src)) - // world << "Not in src" - program = new program.type - program.transfer_holder(src.hd) - - if(program.master != src) - program.master = src - - if(!src.host_program && istype(program, /datum/computer/file/pda_program/os)) - src.host_program = program - - if(istype(program, /datum/computer/file/pda_program/scan)) - if(program == src.scan_program) - src.scan_program = null - else - src.scan_program = program - return 1 - - src.active_program = program - return 1 - - delete_file(datum/computer/file/file) - //world << "Deleting [file]..." - if((!file) || (!file.holder) || (file.holder.read_only)) - //world << "Cannot delete :(" - return 0 - - //Don't delete the running program you jerk - if(src.active_program == file || src.host_program == file) - src.active_program = null - - //world << "Now calling del on [file]..." - del(file) - return 1 \ No newline at end of file diff --git a/code/unused/pda2/record_progs.dm b/code/unused/pda2/record_progs.dm deleted file mode 100644 index 2ea856c93e..0000000000 --- a/code/unused/pda2/record_progs.dm +++ /dev/null @@ -1,181 +0,0 @@ -//CONTENTS: -//Generic records -//Security records -//Medical records - - -/datum/computer/file/pda_program/records - var/mode = 0 - var/datum/data/record/active1 = null //General - var/datum/data/record/active2 = null //Security/Medical/Whatever - -//To-do: editing arrest status/etc from pda. -/datum/computer/file/pda_program/records/security - name = "Security Records" - size = 12.0 - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - switch(src.mode) - if(0) - dat += "

Security Record List

" - - for (var/datum/data/record/R in data_core.general) - dat += "[R.fields["id"]]: [R.fields["name"]]
" - - dat += "
" - - if(1) - - dat += "

Security Record

" - - dat += "
Back
" - - if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)) - dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]
" - dat += "Sex: [src.active1.fields["sex"]]
" - dat += "Age: [src.active1.fields["age"]]
" - dat += "Fingerprint: [src.active1.fields["fingerprint"]]
" - dat += "Physical Status: [src.active1.fields["p_stat"]]
" - dat += "Mental Status: [src.active1.fields["m_stat"]]
" - else - dat += "Record Lost!
" - - dat += "
" - - dat += "

Security Data

" - if (istype(src.active2, /datum/data/record) && data_core.security.Find(src.active2)) - dat += "Criminal Status: [src.active2.fields["criminal"]]
" - - dat += "Minor Crimes: [src.active2.fields["mi_crim"]]
" - dat += "Details: [src.active2.fields["mi_crim"]]

" - - dat += "Major Crimes: [src.active2.fields["ma_crim"]]
" - dat += "Details: [src.active2.fields["ma_crim_d"]]

" - - dat += "Important Notes:
" - dat += "[src.active2.fields["notes"]]" - else - dat += "Record Lost!
" - - dat += "
" - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["mode"]) - var/newmode = text2num(href_list["mode"]) - src.mode = max(newmode, 0) - - else if(href_list["select_rec"]) - var/datum/data/record/R = locate(href_list["select_rec"]) - var/datum/data/record/S = locate(href_list["select_rec"]) - - if (data_core.general.Find(R)) - for (var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - break - - src.active1 = R - src.active2 = S - - src.mode = 1 - - src.master.add_fingerprint(usr) - src.master.updateSelfDialog() - return - -/datum/computer/file/pda_program/records/medical - name = "Medical Records" - size = 8.0 - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - switch(src.mode) - if(0) - - dat += "

Medical Record List

" - for (var/datum/data/record/R in data_core.general) - dat += "[R.fields["id"]]: [R.fields["name"]]
" - dat += "
" - - if(1) - - dat += "

Medical Record

" - - dat += "
Back
" - - if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)) - dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]
" - dat += "Sex: [src.active1.fields["sex"]]
" - dat += "Age: [src.active1.fields["age"]]
" - dat += "Fingerprint: [src.active1.fields["fingerprint"]]
" - dat += "Physical Status: [src.active1.fields["p_stat"]]
" - dat += "Mental Status: [src.active1.fields["m_stat"]]
" - else - dat += "Record Lost!
" - - dat += "
" - - dat += "

Medical Data

" - if (istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)) - dat += "Blood Type: [src.active2.fields["b_type"]]

" - - dat += "Minor Disabilities: [src.active2.fields["mi_dis"]]
" - dat += "Details: [src.active2.fields["mi_dis_d"]]

" - - dat += "Major Disabilities: [src.active2.fields["ma_dis"]]
" - dat += "Details: [src.active2.fields["ma_dis_d"]]

" - - dat += "Allergies: [src.active2.fields["alg"]]
" - dat += "Details: [src.active2.fields["alg_d"]]

" - - dat += "Current Diseases: [src.active2.fields["cdi"]]
" - dat += "Details: [src.active2.fields["cdi_d"]]

" - - dat += "Important Notes: [src.active2.fields["notes"]]
" - else - dat += "Record Lost!
" - - dat += "
" - - return dat - - Topic(href, href_list) - if(..()) - return - - if(href_list["mode"]) - var/newmode = text2num(href_list["mode"]) - src.mode = max(newmode, 0) - - else if(href_list["select_rec"]) - var/datum/data/record/R = locate(href_list["select_rec"]) - var/datum/data/record/M = locate(href_list["select_rec"]) - - if (data_core.general.Find(R)) - for (var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - break - - src.active1 = R - src.active2 = M - - src.mode = 1 - - src.master.add_fingerprint(usr) - src.master.updateSelfDialog() - return \ No newline at end of file diff --git a/code/unused/pda2/scanners.dm b/code/unused/pda2/scanners.dm deleted file mode 100644 index 499b867954..0000000000 --- a/code/unused/pda2/scanners.dm +++ /dev/null @@ -1,103 +0,0 @@ -//CONTENTS: -//Base scanner stuff -//Health scanner -//Forensic scanner -//Reagent scanner - -/datum/computer/file/pda_program/scan - return_text() - return src.return_text_header() - - proc/scan_atom(atom/A as mob|obj|turf|area) - - if( !A || (!src.holder) || (!src.master)) - return 1 - - if((!istype(holder)) || (!istype(master))) - return 1 - - if(!(holder in src.master.contents)) - if(master.scan_program == src) - master.scan_program = null - return 1 - - return 0 - - //Health analyzer program - health_scan - name = "Health Scan" - size = 8.0 - - scan_atom(atom/A as mob|obj|turf|area) - if(..()) - return - - var/mob/living/carbon/C = A - if(!istype(C)) - return - - var/dat = "\blue Analyzing Results for [C]:\n" - dat += "\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]\n" - dat += "\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]\n" - dat += "\blue \t Key: Suffocation/Toxin/Burns/Brute\n" - dat += "\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)" - if(C.virus) - dat += "\red \nWarning Virus Detected.\nName: [C.virus.name].\nType: [C.virus.spread].\nStage: [C.virus.stage]/[C.virus.max_stages].\nPossible Cure: [C.virus.cure]" - - return dat - - //Forensic scanner - forensic_scan - name = "Forensic Scan" - size = 8.0 - - scan_atom(atom/A as mob|obj|turf|area) - if(..()) - return - var/dat = null - - if(istype(A,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - if (!istype(H.dna, /datum/dna) || !isnull(H.gloves)) - dat += "\blue Unable to scan [A]'s fingerprints.\n" - else - dat += "\blue [H]'s Fingerprints: [md5(H.dna.uni_identity)]\n" - if ( !(H.blood_DNA.len) ) - dat += "\blue No blood found on [H]\n" - else - for(var/i = 1, i < H.blood_DNA.len, i++) - var/list/templist = H.blood_DNA[i] - user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]" - - if (!A.fingerprints) - dat += "\blue Unable to locate any fingerprints on [A]!\n" - else - var/list/L = params2list(A:fingerprints) - dat += "\blue Isolated [L.len] fingerprints.\n" - for(var/i in L) - dat += "\blue \t [i]\n" - - return dat - - - //Reagent scanning program - reagent_scan - name = "Reagent Scan" - size = 6.0 - - scan_atom(atom/A as mob|obj|turf|area) - if(..()) - return - var/dat = null - if(!isnull(A.reagents)) - if(A.reagents.reagent_list.len > 0) - var/reagents_length = A.reagents.reagent_list.len - dat += "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.\n" - for (var/datum/reagent/re in A.reagents.reagent_list) - dat += "\blue \t [re] - [re.volume]\n" - else - dat = "\blue No active chemical agents found in [A]." - else - dat = "\blue No significant chemical agents found in [A]." - - return dat diff --git a/code/unused/pda2/smallprogs.dm b/code/unused/pda2/smallprogs.dm deleted file mode 100644 index 1f8a1a74bf..0000000000 --- a/code/unused/pda2/smallprogs.dm +++ /dev/null @@ -1,207 +0,0 @@ -//Assorted small programs not worthy of their own file -//CONTENTS: -//Crew Manifest viewer -//Status display controller -//Remote signaling program -//Cargo orders monitor - -//Manifest -/datum/computer/file/pda_program/manifest - name = "Manifest" - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - dat += "

Crew Manifest

" - dat += "Entries cannot be modified from this terminal.

" - - for (var/datum/data/record/t in data_core.general) - dat += "[t.fields["name"]] - [t.fields["rank"]]
" - dat += "
" - - return dat - -//Status Display -/datum/computer/file/pda_program/status_display - name = "Status Controller" - size = 8.0 - var/message1 // For custom messages on the displays. - var/message2 - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - dat += "

Station Status Display Interlink

" - - dat += "\[ Clear \]
" - dat += "\[ Station Time \]
" - dat += "\[ Shuttle ETA \]
" - dat += "\[ Message \]" - - dat += "
" - dat += "\[ Alert: None |" - - dat += " Red Alert |" - dat += " Lockdown |" - dat += " Biohazard \]
" - - return dat - - - Topic(href, href_list) - if(..()) - return - - if(href_list["statdisp"]) - switch(href_list["statdisp"]) - if("message") - post_status("message", message1, message2) - if("alert") - post_status("alert", href_list["alert"]) - if("time") - post_status("time") - - if("setmsg1") - message1 = input("Line 1", "Enter Message Text", message1) as text|null - if (!src.master || !in_range(src.master, usr) && src.master.loc != usr) - return - - if(!(src.holder in src.master)) - return - src.master.updateSelfDialog() - - if("setmsg2") - message2 = input("Line 2", "Enter Message Text", message2) as text|null - if (!src.master || !in_range(src.master, usr) && src.master.loc != usr) - return - - if(!(src.holder in src.master)) - return - - src.master.updateSelfDialog() - else - post_status(href_list["statdisp"]) - - src.master.add_fingerprint(usr) - src.master.updateSelfDialog() - return - - proc/post_status(var/command, var/data1, var/data2) - if(!src.master) - return - - var/datum/signal/status_signal = new - status_signal.source = src.master - status_signal.transmission_method = 1 - status_signal.data["command"] = command - - switch(command) - if("message") - status_signal.data["msg1"] = data1 - status_signal.data["msg2"] = data2 - if("alert") - status_signal.data["picture_state"] = data1 - - src.post_signal(status_signal,"1435") - -//Signaler -/datum/computer/file/pda_program/signaler - name = "Signalix 5" - size = 8.0 - var/send_freq = 1457 //Frequency signal is sent at, should be kept within normal radio ranges. - var/send_code = 30 - var/last_transmission = 0 //No signal spamming etc - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - - dat += "

Remote Signaling System

" - dat += {" -Send Signal
- -Frequency: -- -- -[format_frequency(send_freq)] -+ -+
-
-Code: -- -- -[send_code] -+ -+
"} - - return dat - - Topic(href, href_list) - if(..()) - return - - if (href_list["send"]) - if(last_transmission && world.time < (last_transmission + 5)) - return - last_transmission = world.time - spawn( 0 ) - var/time = time2text(world.realtime,"hh:mm:ss") - lastsignalers.Add("[time] : [usr.key] used [src.master] @ location ([src.master.loc.x],[src.master.loc.y],[src.master.loc.z]) : [format_frequency(send_freq)]/[send_code]") - - var/datum/signal/signal = new - signal.source = src - signal.encryption = send_code - signal.data["message"] = "ACTIVATE" - - src.post_signal(signal,"[send_freq]") - return - - else if (href_list["adj_freq"]) - src.send_freq = sanitize_frequency(src.send_freq + text2num(href_list["adj_freq"])) - - else if (href_list["adj_code"]) - src.send_code += text2num(href_list["adj_code"]) - src.send_code = round(src.send_code) - src.send_code = min(100, src.send_code) - src.send_code = max(1, src.send_code) - - src.master.add_fingerprint(usr) - src.master.updateSelfDialog() - return - -//Supply record monitor -/datum/computer/file/pda_program/qm_records - name = "Supply Records" - size = 8.0 - - return_text() - if(..()) - return - - var/dat = src.return_text_header() - dat += "

Supply Record Interlink

" - - dat += "
Supply shuttle
" - dat += "Location: [supply_shuttle_moving ? "Moving to station ([supply_shuttle_timeleft] Mins.)":supply_shuttle_at_station ? "Station":"Dock"]
" - dat += "Current approved orders:
    " - for(var/S in supply_shuttle_shoppinglist) - var/datum/supply_order/SO = S - dat += "
  1. [SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
  2. " - dat += "
" - - dat += "Current requests:
    " - for(var/S in supply_shuttle_requestlist) - var/datum/supply_order/SO = S - dat += "
  1. [SO.object.name] requested by [SO.orderedby]
  2. " - dat += "
Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management." - - return dat diff --git a/code/unused/pipe.dm b/code/unused/pipe.dm deleted file mode 100644 index 2a3e0b90e1..0000000000 --- a/code/unused/pipe.dm +++ /dev/null @@ -1,1828 +0,0 @@ -// pipeline datum for storing inter-machine links -// create a pipeline - -//number of pipelines -var/linenums = 0 - -/obj/machinery/pipeline/New() - ..() - - gas = new /datum/gas_mixture() - ngas = new /datum/gas_mixture() - - gasflowlist += src - -// find the pipeline that contains the /obj/machine (including pipe) -/proc/findline(var/obj/machinery/M) - - for(var/obj/machinery/pipeline/P in plines) - - for(var/obj/machinery/O in P.nodes) - - if(M==O) - return P - - return null - -// sets the vnode1&2 terminators to the joining machines (or null) -/obj/machinery/pipeline/proc/setterm() - - //first make sure pipes are oriented correctly - - var/obj/machinery/M = null - - for(var/obj/machinery/pipes/P in nodes) - if(!M) // special case for 1st pipe - if(P.node1 && P.node1.ispipe()) - P.flip() // flip if node1 is a pipe - else - if(P.node1 != M) //other cases, flip if node1 doesn't point to previous node - P.flip() // (including if it is null) - - - M = P - - - // pipes are now ordered so that n1/n2 is in same order as pipeline list - - var/obj/machinery/pipes/P = nodes[1] // 1st node in list - vnode1 = P.node1 // n1 points to 1st machine - P = nodes[nodes.len] // last node in list - vnode2 = P.node2 // n2 points to last machine - - if(vnode1) - vnode1.buildnodes() - if(vnode2) - vnode2.buildnodes() - - return - -/* -/obj/machinery/pipeline/get_gas_moles(from) - return gas.total_moles()/capmult -*/ -/obj/machinery/pipeline/get_gas(from) - return gas - -/obj/machinery/pipeline/gas_flow() - //if(suffix == "d" && Debug) world.log << "PLF1 [gas.total_moles()] ~ [ngas.total_moles()]" - - gas.copy_from(ngas) - - //if(suffix == "d" && Debug) world.log << "PLF2 [gas.total_moles()] ~ [ngas.total_moles()]" - -/obj/machinery/pipeline/process() - /* - // heat exchange for whole pipeline - - //if(suffix=="dbgp") - // world.log << "PLP" - // Plasma() - -// var/dbg = (suffix == "d") && Debug - - //if(dbg) world.log << "PLP1 [gas.total_moles()] ~ [ngas.total_moles()]" - - if(!numnodes) - return //dividing by zero is bad okay? - - var/gtemp = ngas.temperature // cached temperature for heat exch calc - var/tot_node = ngas.total_moles() / numnodes // fraction of gas in this node - - //if(dbg) world.log << "PLHE: [gtemp] [tot_node]" - - if(tot_node>0.1) // no pipe contents, don't heat - for(var/obj/machinery/pipes/P in src.nodes) // for each segment of pipe - P.heat_exchange(ngas, tot_node, numnodes, gtemp) //, dbg) // exchange heat with its turf - if(!istype(P, /obj/machinery/pipes/heat_exch) && ((100*tot_node/P.capacity > 15000) || (gtemp > 8000)) ) - P.rupture() - //Commenting this out because it spams on endlessly - //for (var/mob/M in viewers(P)) - //M.show_message("\red The pipe has ruptured!", 3) - //so this is changed to pipe rupturing instead of explosions - //i.e. it ruptures if the pressure over 15000% - //and temperature over 8000K - //it also doesn't work on heat_exchange pipes - // now do standard gas flow proc - - - //if(dbg) world.log << "PLP2 [ngas.total_moles()]" - - var/delta_gt - - if(vnode1 && !(vnode1.stat & BROKEN)) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode1, delta_gt)//, dbg) - - //if(dbg) world.log << "PLT1 [delta_gt] >> [gas.total_moles()] ~ [ngas.total_moles()]" - - flow = delta_gt - else - leak_to_turf(1) - - if(vnode2 && !(vnode2.stat & BROKEN)) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode2, delta_gt)//, dbg) - - //if(dbg) world.log << "PLT2 [delta_gt] >> [gas.total_moles()] ~ [ngas.total_moles()]" - - flow -= delta_gt - else - leak_to_turf(2) - - */ //TODO: FIX - -/obj/machinery/pipeline/proc/leak_to_turf(var/port) - /* - var/turf/T - var/obj/machinery/pipes/P - var/list/ndirs - - switch(port) - if(1) - P = nodes[1] // 1st node in list - if (P==null) - T = src.loc - else - ndirs = P.get_node_dirs() - - T = get_step(P, ndirs[1]) - - - if(2) - P = nodes[nodes.len] // last node in list - if (P==null) - T = src.loc - else - - ndirs = P.get_node_dirs() - T = get_step(P, ndirs[2]) - if (T==null) - return - if(T.density) - return - - flow_to_turf(gas, ngas, T) - */ //TODO: FIX - - -// build the pipelines (THIS HAPPENS ONCE!) -/proc/makepipelines() - - for(var/obj/machinery/pipes/P in machines) // look for a pipe - - if(!P.plnum) // if not already part of a line - P.buildnodes(++linenums) // add it, and spread to all connected pipes - - //world.log<<"Line #[linecount] started at [P] ([P.x],[P.y],[P.z])" - - for(var/L = 1 to linenums) // for count of lines found - var/obj/machinery/pipeline/PL = new() // make a pipeline virtual object - PL.name = "pipeline #[L]" - plines += PL // and add it to the list - PL.linenumber = L - - - - for(var/obj/machinery/pipes/P in machines) // look for pipes - - if(P.termination) // true if pipe is terminated (ends in blank or a machine) - var/obj/machinery/pipeline/PL = plines[P.plnum] // get the pipeline from the pipe's pl-number - - var/list/pipes = pipelist(null, P) // get a list of pipes from P until terminated - - PL.nodes = pipes // pipeline is this list of nodes - PL.numnodes = pipes.len // with this many nodes - PL.capmult = PL.numnodes+1 // with this flow multiplier - - - - for(var/obj/machinery/pipes/P in machines) // all pipes - P.setline() // set the pipeline object for this pipe - - if(P.tag == "dbg") //add debug tag to line containing debug pipe - P.parent.tag = "dbg" - - if(P.suffix == "dbgpp") //add debug tag to line containing debug pipe - P.parent.suffix = "dbgp" - - if(P.suffix == "d") //add debug tag to line containing debug pipe - P.parent.suffix = "d" - - - for(var/obj/machinery/M in machines) // for all machines - if(M.p_dir) // which are pipe-connected - if(!M.ispipe()) // is not a pipe itself - M.buildnodes() // build the nodes, setting the links to the virtual pipelines - // also sets the vnodes for the pipelines - - for(var/obj/machinery/pipeline/PL in plines) // for all lines - PL.setterm() // orient the pipes and set the pipeline vnodes to the terminating machines - -// return a list of pipes (not including terminating machine) - -/proc/pipelist(var/obj/machinery/source, var/obj/machinery/startnode) - - var/list/L = list() - - var/obj/machinery/node = startnode - var/obj/machinery/prev = source - var/obj/machinery/newnode - - while(node) - L += node - newnode = node.next(prev) - prev = node - - if(newnode && newnode.ispipe()) - node = newnode - else - break - - return L - -// new pipes system - -// flip the nodes of a pipe -/obj/machinery/pipes/proc/flip() - var/obj/machinery/tempnode = node1 - node1 = node2 - node2 = tempnode - return - - -// return the next pipe in the node chain -/obj/machinery/pipes/next(var/obj/machinery/from) - - if(from == null) // if from null, then return the next actual pipe - if(node1 && node1.ispipe() ) - return node1 - if(node2 && node2.ispipe() ) - return node2 - return null // else return null if no real pipe connected - - else if(from == node1) // otherwise, return the node opposite the incoming one - return node2 - else - return node1 - - -// set the pipeline obj from the pl-number and global list of pipelines - -/obj/machinery/pipes/setline() - src.parent = plines[plnum] - return - -// returns the pipeline that this line is in - -/obj/machinery/pipes/getline() - return parent - -/obj/machinery/pipes/orient_pipe(P as obj) - if (!( src.node1 )) - src.node1 = P - else - if (!( src.node2 )) - src.node2 = P - else - return 0 - return 1 - -// returns a list of dir1, dir2 & p_dir for a pipe - -/obj/machinery/pipes/proc/get_dirs() - var/b1 - var/b2 - - for(var/d in cardinal) - if(p_dir & d) - if(!b1) - b1 = d - else if(!b2) - b2 = d - - return list(b1, b2, p_dir) - -// returns a list of the directions of a pipe, matched to nodes (if present) - -/obj/machinery/pipes/proc/get_node_dirs() - var/list/dirs = get_dirs() - - - if(!node1 && !node2) // no nodes - just return the standard dirs - return dirs // note extra p_dir on end of list is unimportant - else - if(node1) - var/d1 = get_dir(src, node1) // find the direction of node1 - if(d1==dirs[1]) // if it matches - return dirs // then dirs list is correct - else - return list(dirs[2], dirs[1]) // otherwise return the list swapped - - else // node2 must be valid - var/d2 = get_dir(src, node2) // direction of node2 - if(d2==dirs[2]) // matches - return dirs // dirs list is correct - else - return list(dirs[2], dirs[1]) // otherwise swap order - - -/obj/machinery/pipes/proc/update() - - var/turf/T = src.loc - - var/list/dirs = get_dirs() - - var/is = "[dirs[3]]" - - if(stat & BROKEN) - is += "-b" - - if ((src.level == 1 && isturf(src.loc) && T.intact)) - src.invisibility = 101 - is += "-f" - - else - src.invisibility = 0 - - src.icon_state = is - - if(node1 && node2) - overlays.Cut() - else if(!node1 && !node2) - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[1]) - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[2]) - else if(!node1) - var/d2 = get_dir(src, node2) - if(dirs[1] == d2) - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[2]) - else - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[1]) - else if(!node2) - var/d1 = get_dir(src, node1) - if(dirs[1] == d1) - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[2]) - else - overlays += image('icons/obj/pipes.dmi', "discon", FLY_LAYER, dirs[1]) - - - return - -/obj/machinery/pipes/hide(var/i) - update() - - //its lazy right now but wait until after my exams and I'll redo it. - //redid it, oh shit - -/obj/machinery/pipes/proc/rupture() - - stat |= BROKEN - update() - -/obj/machinery/pipes/Del() - stat |= BROKEN - update() - ..() - - -/obj/machinery/pipes/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - if(!(stat & BROKEN)) - return - if (W:weldfuel < 2) - user << "\blue You need more welding fuel to complete this task." - return - W:weldfuel -= 2 - stat &= ~BROKEN - update() - for (var/mob/M in viewers(src)) - M.show_message("\red The pipe has been mended by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) - return - -/obj/machinery/pipes/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - stat |= BROKEN - update() - if (prob(50)) - del(src) - return - if(3.0) - if(prob(75)) - stat |= BROKEN - update() - if (prob(25)) - del(src) - return - else - return -/* - var/strength = (((plasma + oxygen/2.0) / 1600000.0) * sqrt(temp) ) / 10 - message_admins("CODER: Pipe explosion strength: [strength], Temperature: [temp], Plasma: [plasma], Oxygen: [oxygen]") - //lets say hypothetically it uses up 9/10 of its energy in bursting the pipe - - if (strength < 773.0) - var/turf/T = get_turf(src.loc) - T.poison += plasma - T.firelevel = T.poison - T.res_vars() - - //if ((src.gas.temperature > (450+T0C) && src.gas.plasma == 1600000.0)) - - if (strength > (450+T0C)) - var/turf/sw = locate(max(T.x - 4, 1), max(T.y - 4, 1), T.z) - var/turf/ne = locate(min(T.x + 4, world.maxx), min(T.y + 4, world.maxy), T.z) - defer_powernet_rebuild = 1 - - for(var/turf/U in block(sw, ne)) - var/zone = 4 - if ((U.y <= (T.y + 1) && U.y >= (T.y - 1) && U.x <= (T.x + 2) && U.x >= (T.x - 2)) ) - zone = 3 - if ((U.y <= (T.y + 1) && U.y >= (T.y - 1) && U.x <= (T.x + 1) && U.x >= (T.x - 1) )) - zone = 2 - for(var/atom/A in U) - A.ex_act(zone) - //Foreach goto(342) - U.ex_act(zone) - U.buildlinks() - //Foreach goto(170) - defer_powernet_rebuild = 0 - makepowernets() - - else - //if ((src.gas.temperature > (300+T0C) && src.gas.plasma == 1600000.0)) - if (strength > (300+T0C)) - var/turf/sw = locate(max(T.x - 4, 1), max(T.y - 4, 1), T.z) - var/turf/ne = locate(min(T.x + 4, world.maxx), min(T.y + 4, world.maxy), T.z) - defer_powernet_rebuild = 1 - - for(var/turf/U in block(sw, ne)) - var/zone = 4 - if ((U.y <= (T.y + 2) && U.y >= (T.y - 2) && U.x <= (T.x + 2) && U.x >= (T.x - 2)) ) - zone = 3 - for(var/atom/A in U) - A.ex_act(zone) - //Foreach goto(598) - U.ex_act(zone) - U.buildlinks() - //Foreach goto(498) - defer_powernet_rebuild = 0 - makepowernets() - - //src.master = null - //SN src = null - del(src) - return - - var/turf/T = src.loc - while(!( istype(T, /turf) )) - T = T.loc - - for(var/mob/M in range(T)) - flick("flash", M.flash) - //Foreach goto(732) - //var/m_range = 2 - - var/m_range = round(strength / 387) - for(var/obj/machinery/atmoalter/canister/C in range(2, T)) - if (!( C.destroyed )) - if (C.gas.plasma >= 35000) - C.destroyed = 1 - m_range++ - - //Foreach goto(776) - var/min = m_range - var/med = m_range * 2 - var/max = m_range * 3 - var/u_max = m_range * 4 - - var/turf/sw = locate(max(T.x - u_max, 1), max(T.y - u_max, 1), T.z) - var/turf/ne = locate(min(T.x + u_max, world.maxx), min(T.y + u_max, world.maxy), T.z) - - defer_powernet_rebuild = 1 - - for(var/turf/U in block(sw, ne)) - - var/zone = 4 - if ((U.y <= (T.y + max) && U.y >= (T.y - max) && U.x <= (T.x + max) && U.x >= (T.x - max) )) - zone = 3 - if ((U.y <= (T.y + med) && U.y >= (T.y - med) && U.x <= (T.x + med) && U.x >= (T.x - med) )) - zone = 2 - if ((U.y <= (T.y + min) && U.y >= (T.y - min) && U.x <= (T.x + min) && U.x >= (T.x - min) )) - zone = 1 - for(var/atom/A in U) - A.ex_act(zone) - //Foreach goto(1217) - U.ex_act(zone) - U.buildlinks() - //U.mark(zone) - - //Foreach goto(961) - //src.master = null - defer_powernet_rebuild = 0 - makepowernets() - - //SN src = null - del(src) - return -*/ -/* -/obj/machinery/pipes/process() -*/ - -/obj/machinery/pipes/New() - - ..() - - if(istype(src, /obj/machinery/pipes/heat_exch)) - h_dir = text2num(icon_state) - else - p_dir = text2num(icon_state) - - -/obj/machinery/pipes/ispipe() // return true since this is a pipe - return 1 - -/obj/machinery/pipes/buildnodes(var/linenum) - - var/list/dirs = get_dirs() - - node1 = get_machine(level, src.loc, dirs[1]) - node2 = get_machine(level, src.loc, dirs[2]) - - if(plnum) - return - - update() - - plnum = linenum - - termination = 0 - - if(node1 && node1.ispipe() ) - - node1.buildnodes(linenum) - else - termination++ - - if(node2 && node2.ispipe() ) - node2.buildnodes(linenum) - else - termination++ - - -/obj/machinery/pipes/heat_exch/get_dirs() - var/b1 - var/b2 - - for(var/d in cardinal) - if(h_dir & d) - if(!b1) - b1 = d - else if(!b2) - b2 = d - - return list(b1, b2, h_dir) - -/obj/machinery/pipes/heat_exch/buildnodes(var/linenum) - - src.level = 2 // h/e pipe cannot be put underfloor - - var/list/dirs = get_dirs() - - node1 = get_he_machine(level, src.loc, dirs[1]) - node2 = get_he_machine(level, src.loc, dirs[2]) - - if(plnum) - return - - update() - - plnum = linenum - - termination = 0 - - if(node1 && node1.ispipe() ) - - node1.buildnodes(linenum) - else - termination++ - - if(node2 && node2.ispipe() ) - node2.buildnodes(linenum) - else - termination++ - - -/obj/machinery/pipes/proc/heat_exchange(var/datum/gas_mixture/gas, var/tot_node, var/numnodes, var/temp, var/dbg=0) - -/* var/turf/T = src.loc // turf location of pipe - if(T.density) return - if(istype(src, /obj/machinery/pipes/flexipipe)) return - - if( level != 1) // no heat exchange for under-floor pipes - if(istype(T,/turf/space)) // heat exchange less efficient in space (no conduction) - gas.temperature += ( T.temp - temp) / (3.0 * insulation * numnodes) - else - - // if(dbg) world.log << "PHE: ([x],[y]) [T.temp]-> \..." - var/delta_T = (T.temp - temp) / (insulation) // normal turf - - gas.temperature += delta_T / numnodes // heat the pipe due to turf temperature - - /* - if(abs(delta_T*tot_node/T.total_moles()) > 1) - world.log << "Turf [T] at [T.x],[T.y]: gt=[temp] tt=[T.temp]" - world.log << "dT = [delta_T] tn=[tot_node] ttg=[T.total_moles()] tt-=[delta_T*tot_node/T.total_moles()]" - - */ - var/tot_turf = max(1, T.total_moles()) - T.temp -= delta_T*min(10,tot_node/tot_turf) // also heat the turf due to pipe temp - // clamp max temp change to prevent thermal runaway - // if low amount of gas in turf - // if(dbg) world.log << "[T.temp] [tot_turf] #[delta_T]" - T.res_vars() // ensure turf tmp vars are updated - - else // if level 1 but in space, perform cooling anyway - exposed pipes - if(istype(T,/turf/space)) - gas.temperature += ( T.temp - temp) / (3.0 * insulation * numnodes) -*/ //TODO FIX -// finds the machine with compatible p_dir in 1 step in dir from S -/proc/get_machine(var/level, var/turf/S, mdir) - - var/flip = turn(mdir, 180) - - var/turf/T = get_step(S, mdir) - - for(var/obj/machinery/M in T.contents) - if(M.level == level) - if(M.p_dir & flip) - return M - - return null - -// finds the machine with compatible h_dir in 1 step in dir from S -/proc/get_he_machine(var/level, var/turf/S, mdir) - - var/flip = turn(mdir, 180) - - var/turf/T = get_step(S, mdir) - - for(var/obj/machinery/M in T.contents) - if(M.level == level) - if(M.h_dir & flip) - return M - - return null - -// ***** circulator - -/obj/machinery/circulator/New() - ..() - gas1 = new /datum/gas_mixture() - gas2 = new /datum/gas_mixture() - - ngas1 = new /datum/gas_mixture() - ngas2 = new /datum/gas_mixture() - - gasflowlist += src - - //gas.co2 = capacity - - updateicon() - -/obj/machinery/circulator/buildnodes() - - var/turf/TS = get_step(src, SOUTH) - var/turf/TN = get_step(src, NORTH) - - for(var/obj/machinery/M in TS) - - if(M && (M.p_dir & 1)) - node1 = M - break - - for(var/obj/machinery/M in TN) - - if(M && (M.p_dir & 2)) - node2 = M - break - - - if(node1) vnode1 = node1.getline() - - if(node2) vnode2 = node2.getline() - - -/* -/obj/machinery/circulator/verb/toggle_power() - set src in view(1) - - if(status == 1) - status = 2 - spawn(30) // 3 second delay for slow-off - if(status == 2) - status = 0 - updateicon() - else if(status == 0) - status =1 - - updateicon() - - - -/obj/machinery/circulator/verb/set_rate(r as num) - set src in view(1) - rate = r/100.0*capacity -*/ - -/obj/machinery/circulator/proc/control(var/on, var/prate) - - rate = prate/100*capacity - - if(status == 1) - if(!on) - status = 2 - spawn(30) - if(status == 2) - status = 0 - updateicon() - else if(status == 0) - if(on) - status = 1 - else // status ==2 - if(on) - status = 1 - - updateicon() - - -/obj/machinery/circulator/proc/updateicon() - - if(stat & NOPOWER) - icon_state = "circ[side]-p" - return - - var/is - switch(status) - if(0) - is = "off" - if(1) - is = "run" - if(2) - is = "slow" - - icon_state = "circ[side]-[is]" - - - -/obj/machinery/circulator/power_change() - ..() - updateicon() - -/* -/obj/machinery/circulator/receive_gas(var/obj/substance/gas/t_gas as obj, from as obj, amount) - - - if(from != src.node1) - return - - amount = min(receive_amount(src), amount) - - - //src.gas.transfer_from(t_gas, amount) - - return -*/ -/obj/machinery/circulator/gas_flow() - - gas1.copy_from(ngas1) - gas2.copy_from(ngas2) - -/obj/machinery/circulator/process() - /* - // if operating, pump from resv1 to resv2 - - if(! (stat & NOPOWER) ) // only do circulator step if powered; still do rest of gas flow at all times - if(status==1 || status==2) - gas2.transfer_from(gas1, status==1? rate : rate/2) - use_power(rate/capacity * 100) - ngas1.copy_from(gas1) - ngas2.copy_from(gas2) - - - // now do standard process - - var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas1.total_moles() / capmult) - calc_delta( src, gas1, ngas1, vnode1, delta_gt) - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas2.total_moles() / capmult) - calc_delta( src, gas2, ngas2, vnode2, delta_gt) - else - leak_to_turf(2)*/ //TODO FIX - -/obj/machinery/circulator/proc/leak_to_turf(var/port) - /* - var/turf/T - - switch(port) - if(1) - T = get_step(src, SOUTH) - if(2) - T = get_step(src, NORTH) - - if(T.density) - T = src.loc - if(T.density) - return - - switch(port) - if(1) - flow_to_turf(gas1, ngas1, T) - if(2) - flow_to_turf(gas2, ngas2, T) - - - // do leak - */ //TODO: FIX - -/* -/obj/machinery/circulator/get_gas_moles(from) - if(from == vnode1) - return gas1.total_moles()/capmult - else - return gas2.total_moles()/capmult -*/ //TODO: FIX -/obj/machinery/circulator/get_gas(from) - if(from == vnode1) - return gas1 - else - return gas2 - -/* -/obj/machinery/connector/New() - ..() - - gas = new /datum/gas_mixture() - ngas = new /datum/gas_mixture() - //agas = new/obj/substance/gas() - - gasflowlist += src - spawn(5) - var/obj/machinery/atmoalter/A = locate(/obj/machinery/atmoalter, src.loc) - - if(A && A.c_status != 0) - connected = A - A.anchored = 1 - - - - -/obj/machinery/connector/buildnodes() - var/turf/T = get_step(src.loc, src.dir) - var/fdir = turn(src.p_dir, 180) - - for(var/obj/machinery/M in T) - if(M.p_dir & fdir) - src.node = M - break - - if(node) vnode = node.getline() - - - return - - - -/obj/machinery/connector/examine(mob/user) - if(..(user, 1)) - if(connected) - usr << "It is connected to \an [connected.name]." - else - usr << "It is unconnected." - - - -/obj/machinery/connector/get_gas_val(from) - return gas.total_moles()/capmult - -/obj/machinery/connector/get_gas(from) - return gas - - -/obj/machinery/connector/gas_flow() - -// var/dbg = (suffix == "d") && Debug - //if(dbg) world.log << "CF0: ngas=[ngas.total_moles()]" - - //ngas.transfer_from(agas, -1) - - //if(dbg) world.log << "CF1: ngas=[gas.total_moles()]" - gas.copy_from(ngas) - //if(dbg) world.log << "CF2: gas=[gas.total_moles()]" - flag = 0 - -/obj/machinery/connector/process() - //if(suffix=="dbgp") - // world.log << "CP" - // Plasma() - - var/delta_gt -// var/dbg = (suffix == "d") && Debug - - //if(dbg) world.log << "C[tag]P: [gas.total_moles()] ~ [ngas.total_moles()]" - //if(dbg && connected) world.log << "C[tag]PC: [connected.gas.total_moles()]" - - if(vnode) - - delta_gt = FLOWFRAC * ( vnode.get_gas_val(src) - gas.total_moles() / capmult) - //if(dbg) world.log << "C[tag]P0: [delta_gt]" - - //var/obj/substance/gas/vgas = vnode.get_gas(src) - - //if(dbg) world.log << "C[tag]P1: [gas.total_moles()], [ngas.total_moles()] -> [vgas.total_moles()]" - calc_delta( src, gas, ngas, vnode, delta_gt)//, dbg) - //if(dbg) world.log << "C[tag]P2: [gas.total_moles()], [ngas.total_moles()] -> [vgas.total_moles()]" - - else - leak_to_turf() - - if(connected) - var/amount - if(connected.c_status == 1) // canister set to release - - //if(dbg) world.log << "C[tag]PC1: [gas.total_moles()], [ngas.total_moles()] <- [connected.gas.total_moles()]" - amount = min(connected.c_per, capacity - gas.total_moles() ) // limit to space in connector - amount = max(0, min(amount, connected.gas.total_moles() ) ) // limit to amount in canister, or 0 - //if(dbg) world.log << "C[tag]PC2: a=[amount]" - //var/ng = ngas.total_moles() - ngas.transfer_from( connected.gas, amount) - //if(dbg) world.log <<"[ngas.total_moles()-ng] from siph to connector" - //if(dbg) world.log << "C[tag]PC3: [gas.total_moles()], [ngas.total_moles()] <- [connected.gas.total_moles()]" - else if(connected.c_status == 2) // canister set to accept - - amount = min(connected.c_per, connected.gas.maximum - connected.gas.total_moles()) //limit to space in canister - amount = max(0, min(amount, gas.total_moles() ) ) // limit to amount in connector, or 0 - - connected.gas.transfer_from( ngas, amount) - - //flag = 1 - - //if(suffix=="dbgp") - // world.log << "CP" - // Plasma() -*/ //TODO: FIX - - -/obj/machinery/connector/proc/leak_to_turf() - /* - //var/dbg = (tag == "dbg") && Debug - - var/turf/T = get_step(src, dir) - if(T && !T.density) - - //if(dbg) world.log << "CLT1: [gas.tostring()] ~ [ngas.tostring()]\nTg = [T.tostring()]" - - - flow_to_turf(gas, ngas, T) - - //if(dbg) world.log << "CLT2: [gas.tostring()] ~ [ngas.tostring()]\nTg = [T.tostring()]" - */ - - -/obj/machinery/junction/New() - ..() - gas = new/datum/gas_mixture(src) - ngas = new/datum/gas_mixture() - gasflowlist += src - - h_dir = dir // the h/e pipe is in obj dir - p_dir = turn(dir, 180) // the reg pipe is in opposite dir - - -/obj/machinery/junction/buildnodes() - - var/turf/T = src.loc - - node1 = get_he_machine(level, T, h_dir ) // the h/e pipe - - node2 = get_machine(level, T , p_dir ) // the regular pipe - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - - return - - -/obj/machinery/junction/gas_flow() - - //var/dbg - //if(tag == "dbg1") - // dbg = 1 - //else if(tag == "dbg2") - // dbg = 2 - - //if(dbg) world.log << "J[dbg]F1: [gas.tostring()] ~ [ngas.tostring()]" - - - gas.copy_from(ngas) - - //if(dbg) world.log << "J[dbg]F2: [gas.tostring()] ~ [ngas.tostring()]" - -/obj/machinery/junction/process() -/* - //var/dbg - //if(tag == "dbg1") - // dbg = 1 - //else if(tag == "dbg2") - // dbg = 2 - - //if(dbg) world.log << "J[dbg]P: [gas.tostring()] ~ [ngas.tostring()]" - - var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode1, delta_gt) //, dbg) - - // if(dbg) world.log << "J[dbg]T1: [delta_gt] >> [gas.tostring()] ~ [ngas.tostring()]" - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode2, delta_gt) //, dbg) - - // if(dbg) world.log << "J[dbg]T2: [delta_gt] >> [gas.tostring()] ~ [ngas.tostring()]" - else - leak_to_turf(2) -*/ //TODO: FIX - -/obj/machinery/junction/get_gas_val(from) - return gas.total_moles()/capmult - -/obj/machinery/junction/get_gas(from) - return gas - -/obj/machinery/junction/proc/leak_to_turf(var/port) - - var/turf/T - - - switch(port) - if(1) - T = get_step(src, dir) - if(2) - T = get_step(src, turn(dir, 180) ) - - if(T.density) - T = src.loc - if(T.density) - return - - flow_to_turf(gas, ngas, T) - - -/obj/machinery/vent/New() - - ..() - p_dir = dir - gas = new /datum/gas_mixture(src) - ngas = new /datum/gas_mixture() - gasflowlist += src - - -/obj/machinery/vent/buildnodes() - - var/turf/T = get_step(src.loc, src.dir) - var/fdir = turn(src.p_dir, 180) - - for(var/obj/machinery/M in T) - if(M.p_dir & fdir) - src.node = M - break - - if(node) vnode = node.getline() - - return - - -/obj/machinery/vent/get_gas_val(from) - return gas.total_moles()/2 - -/obj/machinery/vent/get_gas(from) - return gas - - -/obj/machinery/vent/gas_flow() - -// var/dbg = (suffix=="d") && Debug - //if(dbg) world.log << "V[tag]F1: [gas.total_moles()] ~ [ngas.total_moles()]" - gas.copy_from(ngas) - //if(dbg) world.log << "V[tag]F2: [gas.total_moles()] ~ [ngas.total_moles()]" - -/obj/machinery/vent/process() - /* - -// var/dbg = (suffix=="d") && Debug - //if(dbg) world.log << "V[tag]T1: [gas.total_moles()] ~ [ngas.total_moles()]" - - //if(suffix=="dbgp") - // world.log << "VP" - // Plasma() - - var/delta_gt - - var/turf/T = src.loc - - delta_gt = FLOWFRAC * (gas.total_moles() / capmult) - //var/ng = ngas.total_moles() - ngas.turf_add(T, delta_gt) - - //if(dbg) world.log << "[num2text(ng-ngas.total_moles(),10)] from vent to turf" - //if(dbg) world.log << "V[tag]T2: [gas.total_moles()] ~ [ngas.total_moles()]" - - if(vnode) - - //if(dbg) world.log << "V[tag]N1: [gas.total_moles()] ~ [ngas.total_moles()]" - - delta_gt = FLOWFRAC * ( vnode.get_gas_val(src) - gas.total_moles() / capmult) - - calc_delta( src, gas, ngas, vnode, delta_gt)//, dbg) - - //if(dbg) world.log << "V[tag]N2: [gas.total_moles()] ~ [ngas.total_moles()]" - - else - leak_to_turf() - */ //TODO: FIX - - -/obj/machinery/vent/proc/leak_to_turf() -// note this is a leak from the node, not the vent itself -// thus acts as a link between the vent turf and the turf in step(dir) - - var/turf/T = get_step(src, dir) - if(T && !T.density) - flow_to_turf(gas, ngas, T) - - -// inlet - equilibrates between pipe contents and turf -// very similar to vent, except that a vent always dumps pipe gas into turf -/obj/machinery/inlet/New() - - ..() - - p_dir = dir - gas = new /datum/gas_mixture(src) - ngas = new /datum/gas_mixture() - gasflowlist += src - - -/obj/machinery/inlet/buildnodes() - - var/turf/T = get_step(src.loc, src.dir) - var/fdir = turn(src.p_dir, 180) - - for(var/obj/machinery/M in T) - if(M.p_dir & fdir) - src.node = M - break - - if(node) vnode = node.getline() - - return - - -/obj/machinery/inlet/get_gas_val(from) - return gas.total_moles()/2 - -/obj/machinery/inlet/get_gas(from) - return gas - - -/obj/machinery/inlet/gas_flow() - - gas.copy_from(ngas) - -/obj/machinery/inlet/process() - /* - //if(suffix=="dbgp") - // world.log << "VP" - // Plasma() - - var/delta_gt - - var/turf/T = src.loc - - // this is the difference between vent and inlet - - if(T && !T.density) - flow_to_turf(gas, ngas, T, dbg) // act as gas leak - - if(dbg) world.log << "I[tag]T2: [gas.total_moles()] ~ [ngas.total_moles()]" - - if(vnode) - - //if(dbg) world.log << "V[tag]N1: [gas.total_moles()] ~ [ngas.total_moles()]" - - delta_gt = FLOWFRAC * ( vnode.get_gas_val(src) - gas.total_moles() / capmult) - - calc_delta( src, gas, ngas, vnode, delta_gt)//, dbg) - - //if(dbg) world.log << "V[tag]N2: [gas.total_moles()] ~ [ngas.total_moles()]" - - else - leak_to_turf() - */ //TODO: FIX - - - -/obj/machinery/inlet/proc/leak_to_turf() -// note this is a leak from the node, not the inlet itself -// thus acts as a link between the inlet turf and the turf in step(dir) - - var/turf/T = get_step(src, dir) - if(T && !T.density) - flow_to_turf(gas, ngas, T) - - - -// standard proc for all machines - passed gas/ngas as arguments -// equilibrate a pipe object and a turf's gas content - -/obj/machinery/proc/flow_to_turf(var/datum/gas_mixture/sgas, var/datum/gas_mixture/sngas, var/turf/T, var/dbg = 0) -/* - if(dbg) world.log << "FTT: G=[sgas.tostring()] ~ N=[sngas.tostring()]" - if(dbg) world.log << "T=[T.tostring()]" - - - - var/t_tot = T.total_moles() * 0.2 // partial pressure of turf gas at pipe, for the moment - - var/delta_gt = FLOWFRAC * ( t_tot - sgas.total_moles() / capmult ) - - if(dbg) world.log << "FTT: dgt=[delta_gt]" - - var/datum/gas_mixture/ndelta = new() - - if(delta_gt < 0) // flow from pipe to turf - - //world.log << "FTT<0" - ndelta.set_frac(sgas, -delta_gt) // ndelta contains gas to transfer to turf - //world.log << "ND=[ndelta.tostring()]" - sngas.sub_delta(ndelta) // update new gas to remove the amount transfered - //world.log << "SN=[sngas.tostring()]" - ndelta.turf_add(T, -1) // add all of ndelta to turf - //world.log << "T=[T.tostring()]" - - //world.log << "LTT: [num2text(-delta_gt,10)] from [sgas.loc] to turf" - - - else // flow from turf to pipe - if(dbg) world.log << "FTT>0" - - sngas.turf_take(T, delta_gt) // grab gas from turf and direcly add it to the new gas - if(dbg) world.log << "SN=[sngas.tostring()]" - if(dbg) world.log << "T=[T.tostring()]" - - if(dbg) world.log << "LTT: [num2text(delta_gt,10)] from turf to [sgas.loc]" - - T.res_vars() // update turf gas vars for both cases -*/ //TODO: FIX - -// on-off valve - -/obj/machinery/valve/mvalve/New() - ..() - gas1 = new/datum/gas_mixture/(src) - ngas1 = new/datum/gas_mixture/() - gas2 = new/datum/gas_mixture/(src) - ngas2 = new/datum/gas_mixture/() - - gasflowlist += src - switch(dir) - if(1, 2) - p_dir = 3 - if(4,8) - p_dir = 12 - - icon_state = "valve[open]" - -/obj/machinery/valve/mvalve/examine(mob/user) - if(..(user, 1)) - user << "[desc] It is [ open? "open" : "closed"]." - - - -/obj/machinery/valve/mvalve/buildnodes() - var/turf/T = src.loc - - node1 = get_machine(level, T, dir ) // the h/e pipe - - node2 = get_machine(level, T , turn(dir, 180) ) // the regular pipe - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - - return - - -/obj/machinery/valve/mvalve/gas_flow() - gas1.copy_from(ngas1) - gas2.copy_from(ngas2) - - -/obj/machinery/valve/mvalve/process() -/* var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas1.total_moles() / capmult) - calc_delta( src, gas1, ngas1, vnode1, delta_gt) - - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas2.total_moles() / capmult) - calc_delta( src, gas2, ngas2, vnode2, delta_gt) - - else - leak_to_turf(2) - - - if(open) // valve operating, so transfer btwen resv1 & 2 - - delta_gt = FLOWFRAC * (gas1.total_moles() / capmult - gas2.total_moles() / capmult) - - var/datum/gas_mixture//ndelta = new() - - if(delta_gt < 0) // then flowing from R2 to R1 - - ndelta.set_frac(gas2, -delta_gt) - - ngas2.sub_delta(ndelta) - ngas1.add_delta(ndelta) - - else // flowing from R1 to R2 - ndelta.set_frac(gas1, delta_gt) - ngas2.add_delta(ndelta) - ngas1.sub_delta(ndelta)*/ //TODO: FIX - - - - -/obj/machinery/valve/mvalve/get_gas_val(from) - if(from == vnode2) - return gas2.total_moles()/capmult - else - return gas1.total_moles()/capmult - -/obj/machinery/valve/mvalve/get_gas(from) - if(from == vnode2) - return gas2 - return gas1 - -/obj/machinery/valve/mvalve/proc/leak_to_turf(var/port) - - var/turf/T - - - switch(port) - if(1) - T = get_step(src, dir) - if(2) - T = get_step(src, turn(dir, 180) ) - - if(T.density) - T = src.loc - if(T.density) - return - - if(port==1) - flow_to_turf(gas1, ngas1, T) - else - flow_to_turf(gas2, ngas2, T) - -/obj/machinery/valve/mvalve/attack_paw(mob/user) - attack_hand(user) - -/obj/machinery/valve/mvalve/attack_ai(mob/user) - user << "\red You are unable to use this as it is physically operated." - return - -/obj/machinery/valve/mvalve/attack_hand(mob/user) - ..() - add_fingerprint(user) - if(stat & BROKEN) - return - - if(!open) // now opening - flick("valve01", src) - icon_state = "valve1" - sleep(10) - else // now closing - flick("valve10", src) - icon_state = "valve0" - sleep(10) - open = !open - -// Digital Valve - -/obj/machinery/valve/dvalve/New() - ..() - gas1 = new/datum/gas_mixture/(src) - ngas1 = new/datum/gas_mixture/() - gas2 = new/datum/gas_mixture/(src) - ngas2 = new/datum/gas_mixture/() - - gasflowlist += src - switch(dir) - if(1, 2) - p_dir = 3 - if(4,8) - p_dir = 12 - - icon_state = "dvalve[open]" - -/obj/machinery/valve/dvalve/examine(mob/user) - if(..(user, 1)) - if(NOPOWER) - user << "It is unpowered! It is [ open? "open" : "closed"]." - return - user << "It is [ open? "open" : "closed"]." - -/obj/machinery/valve/dvalve/buildnodes() - var/turf/T = src.loc - - node1 = get_machine(level, T, dir ) // the h/e pipe - - node2 = get_machine(level, T , turn(dir, 180) ) // the regular pipe - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - - return - - -/obj/machinery/valve/dvalve/gas_flow() - gas1.copy_from(ngas1) - gas2.copy_from(ngas2) - -/obj/machinery/valve/dvalve/power_change() - ..() - if(stat & NOPOWER) - icon_state = "dvalve[open]nopower" - return - icon_state = "dvalve[open]" - - -/obj/machinery/valve/dvalve/process() - /* - var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas1.total_moles() / capmult) - calc_delta( src, gas1, ngas1, vnode1, delta_gt) - - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas2.total_moles() / capmult) - calc_delta( src, gas2, ngas2, vnode2, delta_gt) - - else - leak_to_turf(2) - - - if(open) // valve operating, so transfer btwen resv1 & 2 - - delta_gt = FLOWFRAC * (gas1.total_moles() / capmult - gas2.total_moles() / capmult) - - var/datum/gas_mixture/ndelta = new() - - if(delta_gt < 0) // then flowing from R2 to R1 - - ndelta.set_frac(gas2, -delta_gt) - - ngas2.sub_delta(ndelta) - ngas1.add_delta(ndelta) - - else // flowing from R1 to R2 - ndelta.set_frac(gas1, delta_gt) - ngas2.add_delta(ndelta) - ngas1.sub_delta(ndelta) - */ //TODO: FIX - - - -/obj/machinery/valve/dvalve/get_gas_val(from) - if(from == vnode2) - return gas2.total_moles()/capmult - else - return gas1.total_moles()/capmult - -/obj/machinery/valve/dvalve/get_gas(from) - if(from == vnode2) - return gas2 - return gas1 - -/obj/machinery/valve/dvalve/proc/leak_to_turf(var/port) - - var/turf/T - - - switch(port) - if(1) - T = get_step(src, dir) - if(2) - T = get_step(src, turn(dir, 180) ) - - if(T.density) - T = src.loc - if(T.density) - return - - if(port==1) - flow_to_turf(gas1, ngas1, T) - else - flow_to_turf(gas2, ngas2, T) - -/obj/machinery/valve/dvalve/attack_paw(mob/user) - return src.attack_hand(user) - -/obj/machinery/valve/dvalve/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/valve/dvalve/attack_hand(mob/user) - ..() - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - - if(!open) // now opening - flick("dvalve01", src) - icon_state = "dvalve1" - sleep(10) - else // now closing - flick("dvalve10", src) - icon_state = "dvalve0" - sleep(10) - open = !open - -// one way pipe - -/obj/machinery/oneway/New() - ..() - gas1 = new/datum/gas_mixture/(src) - ngas1 = new/datum/gas_mixture/() - gas2 = new/datum/gas_mixture/(src) - ngas2 = new/datum/gas_mixture/() - - gasflowlist += src - p_dir = dir|turn(dir, 180) - -/obj/machinery/oneway/buildnodes() - var/turf/T = src.loc - - node1 = get_machine(level, T, dir ) - node2 = get_machine(level, T , turn(dir, 180) ) - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - - return - -/obj/machinery/oneway/gas_flow() - gas1.copy_from(ngas1) - gas2.copy_from(ngas2) - -/obj/machinery/oneway/process() -/* - var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas1.total_moles() / capmult) - calc_delta( src, gas1, ngas1, vnode1, delta_gt) - - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas2.total_moles() / capmult) - calc_delta( src, gas2, ngas2, vnode2, delta_gt) - - else - leak_to_turf(2) - - - delta_gt = FLOWFRAC * (gas1.total_moles() / capmult - gas2.total_moles() / capmult) - var/datum/gas_mixture/ndelta = new() - - if(delta_gt < 0) // then flowing from R2 to R1 - ndelta.set_frac(gas2, -delta_gt) - ngas2.sub_delta(ndelta) - ngas1.add_delta(ndelta)*/ //TODO: FIX - -/obj/machinery/oneway/get_gas_val(from) - if(from == vnode2) - return gas2.total_moles()/capmult - else - return gas1.total_moles()/capmult - -/obj/machinery/oneway/get_gas(from) - if(from == vnode2) - return gas2 - return gas1 - -/obj/machinery/oneway/proc/leak_to_turf(var/port) - var/turf/T - - switch(port) - if(1) - T = get_step(src, dir) - if(2) - T = get_step(src, turn(dir, 180) ) - - if(T.density) - T = src.loc - if(T.density) - return - - if(port==1) - flow_to_turf(gas1, ngas1, T) - else - flow_to_turf(gas2, ngas2, T) - -/obj/machinery/oneway/pipepump/process() - /* - if(! (stat & NOPOWER) ) // pump if power - gas1.transfer_from(gas2, rate) - use_power(25, ENVIRON) - ngas1.copy_from(gas1) - ngas2.copy_from(gas2) - - var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas1.total_moles() / capmult) - calc_delta( src, gas1, ngas1, vnode1, delta_gt) - - else - leak_to_turf(1) - - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas2.total_moles() / capmult) - calc_delta( src, gas2, ngas2, vnode2, delta_gt) - - else - leak_to_turf(2) - */ //TODO: FIX - -/obj/machinery/oneway/pipepump/proc/updateicon() - icon_state = "pipepump-[(stat & NOPOWER) ? "stop" : "run"]" - -/obj/machinery/oneway/pipepump/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - - stat |= NOPOWER - spawn(rand(1,15)) // So they don't all turn off at the same time - updateicon() - -// Filter inlet -// works with filter_control - -/obj/machinery/inlet/filter/New() - ..() - src.gas = new /datum/gas_mixture() - src.ngas = new /datum/gas_mixture() - -/obj/machinery/inlet/filter/buildnodes() - var/turf/T = get_step(src.loc, src.dir) - var/fdir = turn(src.p_dir, 180) - - for(var/obj/machinery/M in T) - if(M.p_dir & fdir) - src.node = M - break - - if(node) vnode = node.getline() - return - -/obj/machinery/inlet/filter/get_gas_val(from) - return gas.total_moles()/2 - -/obj/machinery/inlet/filter/get_gas(from) - return gas - -/obj/machinery/inlet/filter/gas_flow() - gas.copy_from(ngas) - -/obj/machinery/inlet/filter/process() - src.updateicon() - if(!(stat & NOPOWER)) - /* var/turf/T = src.loc - if(!T || T.density) return - - if(!vnode) return leak_to_turf() - var/obj/substance/gas/exterior = new() - exterior.oxygen = T.oxygen - exterior.n2 = T.n2 - exterior.plasma = T.poison - exterior.co2 = T.co2 - exterior.sl_gas = T.sl_gas - exterior.temperature = T.temp - var/obj/substance/gas/interior = gas - var/obj/substance/gas/flowing = new() - - var/flow_rate = (exterior.total_moles()-interior.total_moles())*FLOWFRAC - if(flow_rate <= 0) - return - flowing.set_frac(exterior,flow_rate) - if(!(src.f_mask & GAS_O2)) flowing.oxygen = 0 - if(!(src.f_mask & GAS_N2)) flowing.n2 = 0 - if(!(src.f_mask & GAS_PL)) flowing.plasma = 0 - if(!(src.f_mask & GAS_CO2)) flowing.co2 = 0 - if(!(src.f_mask & GAS_N2O)) flowing.sl_gas = 0 - use_power(5,ENVIRON) - exterior.sub_delta(flowing) - interior.add_delta(flowing)*/ //TODO: FIX - else - ..() - return - -/obj/machinery/inlet/filter/leak_to_turf() -// note this is a leak from the node, not the inlet itself -// thus acts as a link between the inlet turf and the turf in step(dir) - var/turf/T = get_step(src, dir) - if(T && !T.density) - flow_to_turf(gas, ngas, T) - -/obj/machinery/inlet/filter/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(1,15)) - updateicon() - return - -/obj/machinery/inlet/filter/proc/updateicon() - /* - if(stat & NOPOWER) - icon_state = "inlet_filter-0" - return - if(src.gas.total_moles() > src.gas.maximum/2) - icon_state = "inlet_filter-4" - else if(src.gas.total_moles() > src.gas.maximum/3) - icon_state = "inlet_filter-3" - else if(src.gas.total_moles() > src.gas.maximum/4) - icon_state = "inlet_filter-2" - else if(src.gas.total_moles() >= 1 || src.f_mask >= 1) - icon_state = "inlet_filter-1" - else - icon_state = "inlet_filter-0" - return - */ //TODO FIX - -// Filter vent -// doesn't do anything yet - -/obj/machinery/vent/filter/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(1,15)) - updateicon() - return - -/obj/machinery/vent/filter/proc/updateicon() - /* - if(stat & NOPOWER) - icon_state = "vent_filter-0" - return - if(src.gas.total_moles() > src.gas.maximum/2) - icon_state = "vent_filter-4" - else if(src.gas.total_moles() > src.gas.maximum/3) - icon_state = "vent_filter-3" - else if(src.gas.total_moles() > src.gas.maximum/4) - icon_state = "vent_filter-2" - else if(src.gas.total_moles() >= 1 || src.f_mask >= 1) - icon_state = "vent_filter-1" - else - icon_state = "vent_filter-0" - return - */ //TODO FIX \ No newline at end of file diff --git a/code/unused/pipe_filter.dm b/code/unused/pipe_filter.dm deleted file mode 100644 index 10f0673728..0000000000 --- a/code/unused/pipe_filter.dm +++ /dev/null @@ -1,243 +0,0 @@ -// *** pipefilter - -/obj/machinery/pipefilter/New() - ..() - p_dir = (NORTH|SOUTH|EAST|WEST) ^ turn(dir, 180) - - src.gas = new /datum/gas_mixture/() - src.ngas = new /datum/gas_mixture/() - - src.f_gas = new /datum/gas_mixture/() - src.f_ngas = new /datum/gas_mixture/() - - gasflowlist += src - -/obj/machinery/pipefilter/buildnodes() - var/turf/T = src.loc - - n1dir = turn(dir, 90) - n2dir = turn(dir,-90) - - node1 = get_machine( level, T , n1dir ) // the main flow dir - node2 = get_machine( level, T , n2dir ) - node3 = get_machine( level, T, dir ) // the ejector port - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - if(node3) vnode3 = node3.getline() - -/obj/machinery/pipefilter/gas_flow() - gas.copy_from(ngas) - f_gas.copy_from(f_ngas) - -/obj/machinery/pipefilter/process() -/* var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode1, delta_gt) - else - leak_to_turf(1) - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode2, delta_gt) - else - leak_to_turf(2) - if(vnode3) - delta_gt = FLOWFRAC * ( vnode3.get_gas_val(src) - f_gas.total_moles() / capmult) - calc_delta( src, f_gas, f_ngas, vnode3, delta_gt) - else - leak_to_turf(3) - - // transfer gas from ngas->f_ngas according to extraction rate, but only if we have power - if(! (stat & NOPOWER) ) - use_power(min(src.f_per, 100),ENVIRON) - var/datum/gas_mixture/ndelta = src.get_extract() - ngas.sub_delta(ndelta) - f_ngas.add_delta(ndelta) - AutoUpdateAI(src) - src.updateUsrDialog()*/ //TODO: FIX - -/obj/machinery/pipefilter/get_gas_val(from) - return ((from == vnode3) ? f_gas.total_moles() : gas.total_moles())/capmult - -/obj/machinery/pipefilter/get_gas(from) - return (from == vnode3) ? f_gas : gas - -/obj/machinery/pipefilter/proc/leak_to_turf(var/port) - var/turf/T - - switch(port) - if(1) - T = get_step(src, n1dir) - if(2) - T = get_step(src, n2dir) - if(3) - T = get_step(src, dir) - if(T.density) - T = src.loc - if(T.density) - return - flow_to_turf(f_gas, f_ngas, T) - return - - if(T.density) - T = src.loc - if(T.density) - return - - flow_to_turf(gas, ngas, T) - -/obj/machinery/pipefilter/proc/get_extract() - /* - var/datum/gas_mixture/ndelta = new() - if (src.f_mask & GAS_O2) - ndelta.oxygen = min(src.f_per, src.ngas.oxygen) - if (src.f_mask & GAS_N2) - ndelta.n2 = min(src.f_per, src.ngas.n2) - if (src.f_mask & GAS_PL) - ndelta.plasma = min(src.f_per, src.ngas.plasma) - if (src.f_mask & GAS_CO2) - ndelta.co2 = min(src.f_per, src.ngas.co2) - if (src.f_mask & GAS_N2O) - ndelta.sl_gas = min(src.f_per, src.ngas.sl_gas) - return ndelta - */ //TODO: FIX - -/obj/machinery/pipefilter/attackby(obj/item/weapon/W, mob/user as mob) - if(istype(W, /obj/item/weapon/detective_scanner)) - return ..() - if(istype(W, /obj/item/weapon/screwdriver)) - if(bypassed) - user.show_message(text("\red Remove the foreign wires first!"), 1) - return - src.add_fingerprint(user) - user.show_message(text("\red Now []securing the access system panel...", (src.locked) ? "un" : "re"), 1) - sleep(30) - locked =! locked - user.show_message(text("\red Done!"),1) - src.updateicon() - return - if(istype(W, /obj/item/stack/cable_coil) && !bypassed) - if(src.locked) - user.show_message(text("\red You must remove the panel first!"),1) - return - var/obj/item/stack/cable_coil/C = W - if(C.use(4)) - user.show_message(text("\red You unravel some cable.."),1) - else - user.show_message(text("\red Not enough cable! (Requires four pieces)"),1) - src.add_fingerprint(user) - user.show_message(text("\red Now bypassing the access system... (This may take a while)"), 1) - sleep(100) - bypassed = 1 - src.updateicon() - return - if(istype(W, /obj/item/weapon/wirecutters) && bypassed) - src.add_fingerprint(user) - user.show_message(text("\red Now removing the bypass wires... (This may take a while)"), 1) - sleep(50) - bypassed = 0 - src.updateicon() - return - if(istype(W, /obj/item/weapon/card/emag) && (!emagged)) - emagged++ - src.add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] has shorted out the [] with an electromagnetic card!", user, src), 1) - src.overlays += image('icons/obj/pipes2.dmi', "filter-spark") - sleep(6) - src.updateicon() - return src.attack_hand(user) - return src.attack_hand(user) - -// pipefilter interact/topic -/obj/machinery/pipefilter/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/pipefilter/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/pipefilter/attack_hand(mob/user as mob) -/* if(stat & NOPOWER) - user << browse(null, "window=pipefilter") - user.machine = null - return - - var/list/gases = list("O2", "N2", "Plasma", "CO2", "N2O") - user.machine = src - var/dat = "Filter Release Rate:
\nM - - - - - [src.f_per] + + + + + M
\n" - for (var/i = 1; i <= gases.len; i++) - dat += "[gases[i]]: [(src.f_mask & 1 << (i - 1)) ? "Releasing" : "Passing"]
\n" - if(gas.total_moles()) - var/totalgas = gas.total_moles() - var/pressure = round(totalgas / gas.maximum * 100) - var/nitrogen = gas.n2 / totalgas * 100 - var/oxygen = gas.oxygen / totalgas * 100 - var/plasma = gas.plasma / totalgas * 100 - var/co2 = gas.co2 / totalgas * 100 - var/no2 = gas.sl_gas / totalgas * 100 - - dat += "
Gas Levels:
\nPressure: [pressure]%
\nNitrogen: [nitrogen]%
\nOxygen: [oxygen]%
\nPlasma: [plasma]%
\nCO2: [co2]%
\nN2O: [no2]%
\n" - else - dat += "
Gas Levels:
\nPressure: 0%
\nNitrogen: 0%
\nOxygen: 0%
\nPlasma: 0%
\nCO2: 0%
\nN2O: 0%
\n" - dat += "
\nClose
\n" - - user << browse(dat, "window=pipefilter;size=300x365")*/ //TODO: FIX - //onclose(user, "pipefilter") - -/obj/machinery/pipefilter/Topic(href, href_list) - ..() - if(usr.restrained() || usr.lying) - return - if ((((get_dist(src, usr) <= 1 || usr.telekinesis == 1) || istype(usr, /mob/living/silicon/ai)) && istype(src.loc, /turf))) - usr.machine = src - if (href_list["close"]) - usr << browse(null, "window=pipefilter;") - usr.machine = null - return - if (src.allowed(usr) || src.emagged || src.bypassed) - if (href_list["fp"]) - src.f_per = min(max(round(src.f_per + text2num(href_list["fp"])), 0), src.maxrate) - else if (href_list["tg"]) - // toggle gas - src.f_mask ^= text2num(href_list["tg"]) - src.updateicon() - else - usr.see("\red Access Denied ([src.name] operation restricted to authorized atmospheric technicians.)") - AutoUpdateAI(src) - src.updateUsrDialog() - src.add_fingerprint(usr) - else - usr << browse(null, "window=pipefilter") - usr.machine = null - return - -/obj/machinery/pipefilter/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(1,15)) //so all the filters don't come on at once - updateicon() - -/obj/machinery/pipefilter/proc/updateicon() - src.overlays.Cut() - if(stat & NOPOWER) - icon_state = "filter-off" - else - icon_state = "filter" - if(emagged) //only show if powered because presumeably its the interface that has been fried - src.overlays += image('icons/obj/pipes2.dmi', "filter-emag") - if (src.f_mask & (GAS_N2O|GAS_PL)) - src.overlays += image('icons/obj/pipes2.dmi', "filter-tox") - if (src.f_mask & GAS_O2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-o2") - if (src.f_mask & GAS_N2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-n2") - if (src.f_mask & GAS_CO2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-co2") - if(!locked) - src.overlays += image('icons/obj/pipes2.dmi', "filter-open") - if(bypassed) //should only be bypassed if unlocked - src.overlays += image('icons/obj/pipes2.dmi', "filter-bypass") \ No newline at end of file diff --git a/code/unused/powerarmor/powerarmor.dm b/code/unused/powerarmor/powerarmor.dm deleted file mode 100644 index 1e23e4e98b..0000000000 --- a/code/unused/powerarmor/powerarmor.dm +++ /dev/null @@ -1,281 +0,0 @@ -/obj/item/clothing/suit/powered - name = "Powered armor" - desc = "Not for rookies." - icon_state = "swat" - item_state = "swat" - w_class = 4//bulky item - - protective_temperature = 1000 - flags = FPRINT | TABLEPASS - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS - armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) - slowdown = 9 - var/fuel = 0 - - var/list/togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75) - var/active = 0 - - var/helmrequired = 1 - var/obj/item/clothing/head/powered/helm - - var/glovesrequired = 0 - var/obj/item/clothing/gloves/powered/gloves - - var/shoesrequired = 0 - var/obj/item/clothing/shoes/powered/shoes - //Adding gloves and shoes as possible armor components. --NEO - - var/obj/item/powerarmor/servos/servos - var/obj/item/powerarmor/reactive/reactive - var/obj/item/powerarmor/atmoseal/atmoseal - var/obj/item/powerarmor/power/power - - New() - verbs += /obj/item/clothing/suit/powered/proc/poweron - - proc/poweron() - set category = "Object" - set name = "Activate armor systems" - - var/mob/living/carbon/human/user = usr - - if(user.stat) - return //if you're unconscious or dead, no dicking with your armor. --NEO - - if(!istype(user)) - user << "\red This suit was engineered for human use only." - return - - if(user.wear_suit!=src) - user << "\red The suit functions best if you are inside of it." - return - - if(helmrequired && !istype(user.head, /obj/item/clothing/head/powered)) - user << "\red Helmet missing, unable to initiate power-on procedure." - return - - if(glovesrequired && !istype(user.gloves, /obj/item/clothing/gloves/powered)) - user << "\red Gloves missing, unable to initiate power-on procedure." - return - - if(shoesrequired && !istype(user.shoes, /obj/item/clothing/shoes/powered)) - user << "\red Shoes missing, unable to initiate power-on procedure." - return - - if(active) - user << "\red The suit is already on, you can't turn it on twice." - return - - if(!power || !power.checkpower()) - user << "\red Powersource missing or depleted." - return - - verbs -= /obj/item/clothing/suit/powered/proc/poweron - - user << "\blue Suit interlocks engaged." - if(helmrequired) - helm = user.head - helm.canremove = 0 - if(glovesrequired) - gloves = user.gloves - gloves.canremove = 0 - if(shoesrequired) - shoes = user.shoes - shoes.canremove = 0 - canremove = 0 - sleep(20) - - if(atmoseal) - atmoseal.toggle() - sleep(20) - - if(reactive) - reactive.toggle() - sleep(20) - - if(servos) - servos.toggle() - sleep(20) - - user << "\blue All systems online." - active = 1 - power.process() - - verbs += /obj/item/clothing/suit/powered/proc/poweroff - - - proc/poweroff() - set category = "Object" - set name = "Deactivate armor systems" - powerdown() //BYOND doesn't seem to like it if you try using a proc with vars in it as a verb, hence this. --NEO - - proc/powerdown(sudden = 0) - - var/delay = sudden?0:20 - - var/mob/living/carbon/human/user = usr - - if(user.stat && !sudden) - return //if you're unconscious or dead, no dicking with your armor. --NEO - - if(!active) - return - - verbs -= /obj/item/clothing/suit/powered/proc/poweroff - - if(sudden) - user << "\red Your armor loses power!" - - if(servos) - servos.toggle(sudden) - sleep(delay) - - if(reactive) - reactive.toggle(sudden) - sleep(delay) - - if(atmoseal) - if(istype(atmoseal, /obj/item/powerarmor/atmoseal/optional) && helm) - atmoseal:helmtoggle(sudden) - atmoseal.toggle(sudden) - - sleep(delay) - - if(!sudden) - usr << "\blue Suit interlocks disengaged." - if(helm) - helm.canremove = 1 - helm = null - if(gloves) - gloves.canremove = 1 - gloves = null - if(shoes) - shoes.canremove = 1 - gloves = null - canremove = 1 - //Not a tabbing error, the thing only unlocks if you intentionally power-down the armor. --NEO - sleep(delay) - - if(!sudden) - usr << "\blue All systems disengaged." - - active = 0 - verbs += /obj/item/clothing/suit/powered/proc/poweron - - - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(power && istype(power,/obj/item/powerarmor/power/plasma)) - switch(W.type) - if(/obj/item/stack/sheet/mineral/plasma) - if(fuel < 50) - user << "\blue You feed some refined plasma into the armor's generator." - power:fuel += 25 - W:amount-- - if (W:amount <= 0) - del(W) - return - else - user << "\red The generator already has plenty of plasma." - return - - if(/obj/item/weapon/ore/plasma) //raw plasma has impurities, so it doesn't provide as much fuel. --NEO - if(fuel < 50) - user << "\blue You feed some plasma into the armor's generator." - power:fuel += 15 - del(W) - return - else - user << "\red The generator already has plenty of plasma." - return - - ..() - -/obj/item/clothing/head/powered - name = "Powered armor" - icon_state = "swat" - desc = "Not for rookies." - flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH - see_face = 0.0 - item_state = "swat" - armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10) - var/obj/item/clothing/suit/powered/parent - - proc/atmotoggle() - set category = "Object" - set name = "Toggle helmet seals" - - var/mob/living/carbon/human/user = usr - - if(!istype(user)) - user << "\red This helmet is not rated for nonhuman use." - return - - if(user.head != src) - user << "\red Can't engage the seals without wearing the helmet." - return - - if(!user.wear_suit || !istype(user.wear_suit,/obj/item/clothing/suit/powered)) - user << "\red This helmet can only couple with powered armor." - return - - var/obj/item/clothing/suit/powered/armor = user.wear_suit - - if(!armor.atmoseal || !istype(armor.atmoseal, /obj/item/powerarmor/atmoseal/optional)) - user << "\red This armor's atmospheric seals are missing or incompatible." - return - - armor.atmoseal:helmtoggle(0,1) - - - - -/obj/item/clothing/gloves/powered - name = "Powered armor" - icon_state = "swat" - desc = "Not for rookies." - flags = FPRINT | TABLEPASS - item_state = "swat" - armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10) - -/obj/item/clothing/shoes/powered - name = "Powered armor" - icon_state = "swat" - desc = "Not for rookies." - flags = FPRINT | TABLEPASS - item_state = "swat" - armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10) - - -obj/item/clothing/suit/powered/spawnable/badmin - New() - servos = new /obj/item/powerarmor/servos(src) - servos.parent = src - reactive = new /obj/item/powerarmor/reactive(src) - reactive.parent = src - atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src) - atmoseal.parent = src - power = new /obj/item/powerarmor/power(src) - power.parent = src - - verbs += /obj/item/clothing/suit/powered/proc/poweron - - var/obj/item/clothing/head/powered/helm = new /obj/item/clothing/head/powered(src.loc) - helm.verbs += /obj/item/clothing/head/powered/proc/atmotoggle - -obj/item/clothing/suit/powered/spawnable/regular - New() - servos = new /obj/item/powerarmor/servos(src) - servos.parent = src - reactive = new /obj/item/powerarmor/reactive/centcomm(src) - reactive.parent = src - atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src) - atmoseal.parent = src - power = new /obj/item/powerarmor/power(src) - power.parent = src - - verbs += /obj/item/clothing/suit/powered/proc/poweron - - var/obj/item/clothing/head/powered/helm = new /obj/item/clothing/head/powered(src.loc) - helm.verbs += /obj/item/clothing/head/powered/proc/atmotoggle diff --git a/code/unused/powerarmor/powerarmorcomponents.dm b/code/unused/powerarmor/powerarmorcomponents.dm deleted file mode 100644 index 8d09536f9c..0000000000 --- a/code/unused/powerarmor/powerarmorcomponents.dm +++ /dev/null @@ -1,246 +0,0 @@ -/obj/item/powerarmor - name = "Generic power armor component" - desc = "This is the base object, you should never see one." - var/obj/item/clothing/suit/powered/parent //so the component knows which armor it belongs to. - var/slowdown = 0 //how much the component slows down the wearer - - proc/toggle() - return - //The child objects will use this proc - - - -/obj/item/powerarmor/power - name = "Adminbus power armor power source" - desc = "Runs on the rare Badminium molecule." - - process() - return - - proc/checkpower() - return 1 - - plasma - name = "Miniaturized plasma generator" - desc = "Runs on plasma." - slowdown = 1 - var/fuel = 0 - - process() - if (fuel > 0 && parent.active) - fuel-- - spawn(50) - process() - return - else if (parent.active) - parent.powerdown(1) - return - - checkpower() - return fuel - - powercell - name = "Powercell interface" - desc = "Boring, but reliable." - var/obj/item/weapon/cell/cell - slowdown = 0.5 - - process() - if (cell && cell.charge > 0 && parent.active) - cell.use(50) - spawn(50) - process() - return - else if (parent.active) - parent.powerdown(1) - return - - checkpower() - return max(cell.charge, 0) - - nuclear - name = "Miniaturized nuclear generator" - desc = "For all your radioactive needs." - slowdown = 1.5 - - process() - if(!crit_fail) - if (prob(src.reliability)) return 1 //No failure - if (prob(src.reliability)) - for (var/mob/M in range(0,src.parent)) //Only a minor failure, enjoy your radiation. - if (src.parent in M.contents) - M << "\red Your armor feels pleasantly warm for a moment." - else - M << "\red You feel a warm sensation." - M.radiation += rand(1,40) - else - for (var/mob/M in range(rand(1,4),src.parent)) //Big failure, TIME FOR RADIATION BITCHES - if (src.parent in M.contents) - M << "\red Your armor's reactor overloads!" - M << "\red You feel a wave of heat wash over you." - M.radiation += 100 - crit_fail = 1 //broken~ - parent.powerdown(1) - spawn(50) - process() - - checkpower() - return !crit_fail - -/obj/item/powerarmor/reactive - name = "Adminbus power armor reactive plating" - desc = "Made with the rare Badminium molecule." - var/list/togglearmor = list(melee = 250, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) - //Good lord an active energy axe does 150 damage a swing? Anyway, barring var editing, this armor loadout should be impervious to anything. Enjoy, badmins~ --NEO - - toggle(sudden = 0) - switch(parent.active) - if(1) - if(!sudden) - usr << "\blue Reactive armor systems disengaged." - if(0) - usr << "\blue Reactive armor systems engaged." - var/list/switchover = list() - for (var/armorvar in parent.armor) - switchover[armorvar] = togglearmor[armorvar] - togglearmor[armorvar] = parent.armor[armorvar] - parent.armor[armorvar] = switchover[armorvar] - //Probably not the most elegant way to have the vars switch over, but it works. Also propagates the values to the other objects. - if(parent.helm) - parent.helm.armor[armorvar] = parent.armor[armorvar] - if(parent.gloves) - parent.gloves.armor[armorvar] = parent.armor[armorvar] - if(parent.shoes) - parent.shoes.armor[armorvar] = parent.armor[armorvar] - - centcomm - name = "CentComm power armor reactive plating" - desc = "Pretty effective against everything, not perfect though." - togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75) - slowdown = 2 - - -/obj/item/powerarmor/servos - name = "Adminbus power armor movement servos" - desc = "Made with the rare Badminium molecule." - var/toggleslowdown = 9 - - toggle(sudden = 0) - switch(parent.active) - if(1) - if(!sudden) - usr << "\blue Movement assist servos disengaged." - parent.slowdown += toggleslowdown - if(0) - usr << "\blue Movement assist servos engaged." - parent.slowdown -= toggleslowdown - -/obj/item/powerarmor/atmoseal - name = "Power armor atmospheric seals" - desc = "Keeps the bad stuff out." - slowdown = 1 - var/sealed = 0 - - toggle(sudden = 0) - switch(parent.active) - if(1) - if(!sudden) - usr << "\blue Atmospheric seals disengaged." - parent.gas_transfer_coefficient = 1 - parent.permeability_coefficient = 1 - parent.heat_transfer_coefficient = 1 - parent.flags &= ~SUITSPACE - if(parent.helmrequired) - parent.helm.gas_transfer_coefficient = 1 - parent.helm.permeability_coefficient = 1 - parent.helm.heat_transfer_coefficient = 1 - parent.helm.flags &= ~HEADSPACE - if(parent.glovesrequired) - parent.gloves.gas_transfer_coefficient = 1 - parent.gloves.permeability_coefficient = 1 - parent.gloves.heat_transfer_coefficient = 1 - if(parent.shoesrequired) - parent.shoes.gas_transfer_coefficient = 1 - parent.shoes.permeability_coefficient = 1 - parent.shoes.heat_transfer_coefficient = 1 - sealed = 0 - - if(0) - usr << "\blue Atmospheric seals engaged." - parent.gas_transfer_coefficient = 0.01 - parent.permeability_coefficient = 0.02 - parent.heat_transfer_coefficient = 0.02 - parent.flags |= SUITSPACE - if(parent.helmrequired) - parent.helm.gas_transfer_coefficient = 0.01 - parent.helm.permeability_coefficient = 0.02 - parent.helm.heat_transfer_coefficient = 0.02 - parent.helm.flags |= HEADSPACE - if(parent.glovesrequired) - parent.gloves.gas_transfer_coefficient = 0.01 - parent.gloves.permeability_coefficient = 0.02 - parent.gloves.heat_transfer_coefficient = 0.02 - if(parent.shoesrequired) - parent.shoes.gas_transfer_coefficient = 0.01 - parent.shoes.permeability_coefficient = 0.02 - parent.shoes.heat_transfer_coefficient = 0.02 - sealed = 1 - - adminbus - name = "Adminbus power armor atmospheric seals" - desc = "Made with the rare Badminium molecule." - slowdown = 0 - - optional - name = "Togglable power armor atmospheric seals" - desc = "Keeps the bad stuff out, but lets you remove your helmet without having to turn the whole suit off." - - proc/helmtoggle(sudden = 0, manual = 0) - var/mob/living/carbon/human/user = usr - var/obj/item/clothing/head/powered/helm - if(user.head && istype(user.head,/obj/item/clothing/head/powered)) - helm = user.head - - if(!sealed) - user << "\red Unable to initialize helmet seal, armor seals not active." - return - if(!helm.parent) - user << "\blue Helmet locked." - helm.canremove = 0 - parent.helm = helm - helm.parent = parent - sleep(20) - parent.helm.gas_transfer_coefficient = 0.01 - parent.helm.permeability_coefficient = 0.02 - parent.helm.heat_transfer_coefficient = 0.02 - parent.helm.flags |= HEADSPACE - user << "\blue Helmet atmospheric seals engaged." - if(manual) - for (var/armorvar in helm.armor) - helm.armor[armorvar] = parent.armor[armorvar] - return - else - if(manual) - user << "\blue Helmet atmospheric seals disengaged." - parent.helm.gas_transfer_coefficient = 1 - parent.helm.permeability_coefficient = 1 - parent.helm.heat_transfer_coefficient = 1 - parent.helm.flags &= ~HEADSPACE - if(manual) - for (var/armorvar in helm.armor) - helm.armor[armorvar] = parent.reactive.togglearmor[armorvar] - if(!sudden) - if(manual) - sleep(20) - user << "\blue Helmet unlocked." - helm.canremove = 1 - parent.helm = null - helm.parent = null - - adminbus - name = "Adminbus togglable power armor atmospheric seals" - desc = "Made with the rare Badminium molecule." - slowdown = 0 - - - diff --git a/code/unused/scrap.dm b/code/unused/scrap.dm deleted file mode 100644 index bd3dad3dba..0000000000 --- a/code/unused/scrap.dm +++ /dev/null @@ -1,289 +0,0 @@ -// The scrap item -// a single object type represents all combinations of size and composition of scrap -// - - -/obj/item/scrap - name = "scrap" - icon = 'scrap.dmi' - icon_state = "1metal0" - item_state = "scrap-metal" - desc = "A piece of scrap" - var/classtext = "" - throwforce = 14.0 - m_amt = 0 - g_amt = 0 - w_amt = 0 - var/size = 1 // 1=piece, 2= few pieces, 3=small pile, 4=large pile - var/blood = 0 // 0=none, 1=blood-stained, 2=bloody - - throwforce = 8.0 - throw_speed = 1 - throw_range = 4 - w_class = 1 - flags = FPRINT | TABLEPASS | CONDUCT - -#define MAX_SCRAP 15000 // maximum content amount of a scrap pile - - -/obj/item/scrap/New() - src.verbs -= /atom/movable/verb/pull - ..() - update() - -// return a copy -/obj/item/scrap/proc/copy() - var/obj/item/scrap/ret = new() - ret.set_components(m_amt, g_amt, w_amt) - return ret - - -// set the metal, glass and waste content -/obj/item/scrap/proc/set_components(var/m, var/g, var/w) - m_amt = m - g_amt = g - w_amt = w - update() - -// returns the total amount of scrap in this pile -/obj/item/scrap/proc/total() - return m_amt + g_amt + w_amt - - -// sets the size, appearance, and description of the scrap depending on component amounts -/obj/item/scrap/proc/update() - var/total = total() - - - // determine size of pile - if(total<=400) - size = 1 - else if(total<=1600) - size = 2 - else - size = 3 - - w_class = size - - var/sizetext = "" - - switch(size) - if(1) - sizetext = "A piece of" - if(2) - sizetext = "A few pieces of" - if(3) - sizetext = "A pile of" - - // determine bloodiness - var/bloodtext = "" - switch(blood) - if(0) - bloodtext = "" - if(1) - bloodtext = "blood-stained " - if(2) - bloodtext = "bloody " - - - // find mixture and composition - var/class = 0 // 0 = mixed, 1=mostly. 2=pure - var/major = "waste" // the major component type - - var/max = 0 - - if(m_amt > max) - max = m_amt - else if(g_amt > max) - max = g_amt - else if(w_amt > max) - max = w_amt - - if(max == total) - class = 2 // pure - else if(max/total > 0.6) - class = 1 // mostly - else - class = 0 // mixed - - if(class>0) - var/remain = total - max - if(m_amt > remain) - major = "metal" - else if(g_amt > remain) - major = "glass" - else - major = "waste" - - - if(class == 1) - desc = "[sizetext] mostly [major] [bloodtext]scrap." - classtext = "mostly [major] [bloodtext]" - else - desc = "[sizetext] [bloodtext][major] scrap." - classtext = "[bloodtext][major] " - icon_state = "[size][major][blood]" - else - desc = "[sizetext] [bloodtext]mixed scrap." - classtext = "[bloodtext]mixed" - icon_state = "[size]mixed[blood]" - - if(size==0) - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) - else - pixel_x = 0 - pixel_y = 0 - - // clear or set conduction flag depending on whether scrap is mostly metal - if(major=="metal") - flags |= CONDUCT - else - flags &= ~CONDUCT - - item_state = "scrap-[major]" - -// add a scrap item to this one -// if the resulting pile is too big, transfer only what will fit -// otherwise add them and deleted the added pile - -/obj/item/scrap/proc/add_scrap(var/obj/item/scrap/other, var/limit = MAX_SCRAP) - var/total = total() - var/other_total = other.total() - - if( (total + other_total) <= limit ) - m_amt += other.m_amt - g_amt += other.g_amt - w_amt += other.w_amt - - blood = (total*blood + other_total*other.blood) / (total + other_total) - del(other) - - else - var/space = limit - total - - var/m = round(other.m_amt/other_total*space, 1) - var/g = round(other.g_amt/other_total*space, 1) - var/w = round(other.w_amt/other_total*space, 1) - - m_amt += m - g_amt += g - w_amt += w - - other.m_amt -= m - other.g_amt -= g - other.w_amt -= w - - var/other_trans = m + g + w - other.update() - blood = (total*blood + other_trans*other.blood) / (total + other_trans) - - - blood = round(blood,1) - src.update() - -// limit this pile to maximum size -// return any remainder as a new scrap item (or null if none) -// note return item is not necessarily smaller than max size - -/obj/item/scrap/proc/remainder(var/limit = MAX_SCRAP) - var/total = total() - if(total > limit) - var/m = round( m_amt/total * limit, 1) - var/g = round( g_amt/total * limit, 1) - var/w = round( w_amt/total * limit, 1) - - var/obj/item/scrap/S = new() - S.set_components(m_amt - m,g_amt - g,w_amt - w) - src.set_components(m,g,w) - - return S - return null - -// if other pile of scrap tries to enter the same turf, then add that pile to this one - -/obj/item/scrap/CanPass(var/obj/item/scrap/O) - - if(istype(O)) - - src.add_scrap(O) - if(O) - return 0 // O still exists if not all could be transfered, so block it - return 1 - -/obj/item/scrap/proc/to_text() - return "[m_amt],[g_amt],[w_amt] ([total()])" - - -// attack with hand removes a single piece from a pile -/obj/item/scrap/attack_hand(mob/user) - add_fingerprint(user) - if(src.is_single_piece()) - return ..(user) - var/obj/item/scrap/S = src.get_single_piece() - S.attack_hand(user) - return - - -/obj/item/scrap/attackby(obj/item/I, mob/user) - ..() - if(istype(I, /obj/item/scrap)) - var/obj/item/scrap/S = I - if( (S.total()+src.total() ) > MAX_SCRAP ) - user << "The pile is full." - return - if(ismob(src.loc)) // can't combine scrap in hand - return - - src.add_scrap(S) - -// when dropped, try to make a pile if scrap is already there -/obj/item/scrap/dropped() - - spawn(2) // delay to allow drop postprocessing (since src may be destroyed) - for(var/obj/item/scrap/S in oview(0,src)) // excludes src itself - S.add_scrap(src) - -// return true if this is a single piece of scrap -// must be total<=400 and of single composition -/obj/item/scrap/proc/is_single_piece() - if(total() > 400) - return 0 - - var/empty = (m_amt == 0) + (g_amt == 0) + (w_amt == 0) - - return (empty==2) // must be 2 components with zero amount - - -// get a single piece of scrap from a pile -/obj/item/scrap/proc/get_single_piece() - - var/obj/item/scrap/S = new() - - var/cmp = pick(m_amt;1 , g_amt;2, w_amt;3) - - var/amount = 400 - switch(cmp) - if(1) - if(m_amt < amount) - amount = m_amt - - S.set_components(amount, 0, 0) - src.set_components(m_amt - amount, g_amt, w_amt) - - if(2) - if(g_amt < amount) - amount = g_amt - S.set_components(0, amount, 0) - src.set_components(m_amt, g_amt - amount, w_amt) - - if(3) - if(w_amt < amount) - amount = w_amt - S.set_components(0, 0, amount) - src.set_components(m_amt, g_amt, w_amt - amount) - - - return S - - diff --git a/code/unused/shuttle_engines.dm b/code/unused/shuttle_engines.dm deleted file mode 100644 index 457154db0f..0000000000 --- a/code/unused/shuttle_engines.dm +++ /dev/null @@ -1,37 +0,0 @@ - -/obj/structure/shuttle - name = "shuttle" - icon = 'icons/turf/shuttle.dmi' - -/obj/structure/shuttle/engine - name = "engine" - density = 1 - anchored = 1.0 - -/obj/structure/shuttle/engine/heater - name = "heater" - icon_state = "heater" - -/obj/structure/shuttle/engine/platform - name = "platform" - icon_state = "platform" - -/obj/structure/shuttle/engine/propulsion - name = "propulsion" - icon_state = "propulsion" - opacity = 1 - -/obj/structure/shuttle/engine/propulsion/burst - name = "burst" - -/obj/structure/shuttle/engine/propulsion/burst/left - name = "left" - icon_state = "burst_l" - -/obj/structure/shuttle/engine/propulsion/burst/right - name = "right" - icon_state = "burst_r" - -/obj/structure/shuttle/engine/router - name = "router" - icon_state = "router" diff --git a/code/unused/siphs.dm b/code/unused/siphs.dm deleted file mode 100644 index 6104b3bc2d..0000000000 --- a/code/unused/siphs.dm +++ /dev/null @@ -1,515 +0,0 @@ -/obj/machinery/atmoalter/siphs/New() - ..() - src.gas = new /datum/gas_mixture() - - return - -/obj/machinery/atmoalter/siphs/proc/releaseall() - src.t_status = 1 - src.t_per = max_valve - return - -/obj/machinery/atmoalter/siphs/proc/reset(valve, auto) - if(c_status!=0) - return - - if (valve < 0) - src.t_per = -valve - src.t_status = 1 - else - if (valve > 0) - src.t_per = valve - src.t_status = 2 - else - src.t_status = 3 - if (auto) - src.t_status = 4 - src.setstate() - return - -/obj/machinery/atmoalter/siphs/proc/release(amount, flag) - /* - var/T = src.loc - if (!( istype(T, /turf) )) - return - if (locate(/obj/move, T)) - T = locate(/obj/move, T) - if (!( amount )) - return - if (!( flag )) - amount = min(amount, max_valve) - src.gas.turf_add(T, amount) - return - */ //TODO: FIX - -/obj/machinery/atmoalter/siphs/proc/siphon(amount, flag) - /* - var/T = src.loc - if (!( istype(T, /turf) )) - return - if (locate(/obj/move, T)) - T = locate(/obj/move, T) - if (!( amount )) - return - if (!( flag )) - amount = min(amount, 900000.0) - src.gas.turf_take(T, amount) - return - */ //TODO: FIX - -/obj/machinery/atmoalter/siphs/proc/setstate() - - if(stat & NOPOWER) - icon_state = "siphon:0" - return - - if (src.holding) - src.icon_state = "siphon:T" - else - if (src.t_status != 3) - src.icon_state = "siphon:1" - else - src.icon_state = "siphon:0" - return - -/obj/machinery/atmoalter/siphs/fullairsiphon/New() - /* - ..() - if(!empty) - src.gas.oxygen = 2.73E7 - src.gas.n2 = 1.027E8 - return - */ //TODO: FIX - -/obj/machinery/atmoalter/siphs/fullairsiphon/port/reset(valve, auto) - - if (valve < 0) - src.t_per = -valve - src.t_status = 1 - else - if (valve > 0) - src.t_per = valve - src.t_status = 2 - else - src.t_status = 3 - if (auto) - src.t_status = 4 - src.setstate() - return - -/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent/attackby(W as obj, user as mob) - - if (istype(W, /obj/item/weapon/screwdriver)) - if (src.c_status) - src.anchored = 1 - src.c_status = 0 - else - if (locate(/obj/machinery/connector, src.loc)) - src.anchored = 1 - src.c_status = 3 - else - if (istype(W, /obj/item/weapon/wrench)) - src.alterable = !( src.alterable ) - return - -/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent/setstate() - - - if(stat & NOPOWER) - icon_state = "vent-p" - return - - if (src.t_status == 4) - src.icon_state = "vent2" - else - if (src.t_status == 3) - src.icon_state = "vent0" - else - src.icon_state = "vent1" - return - -/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent/reset(valve, auto) - - if (auto) - src.t_status = 4 - return - -/obj/machinery/atmoalter/siphs/scrubbers/process() - /* - if(stat & NOPOWER) return - - if(src.gas.temperature >= 3000) - src.melt() - - if (src.t_status != 3) - var/turf/T = src.loc - if (istype(T, /turf)) - if (locate(/obj/move, T)) - T = locate(/obj/move, T) - if (T.firelevel < 900000.0) - src.gas.turf_add_all_oxy(T) - - else - T = null - switch(src.t_status) - if(1.0) - if( !portable() ) use_power(50, ENVIRON) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.holding.gas.transfer_from(src.gas, t) - else - if (T) - var/t1 = src.gas.total_moles() - var/t2 = t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.gas.turf_add(T, t) - if(2.0) - if( !portable() ) use_power(50, ENVIRON) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = src.maximum - t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.gas.transfer_from(src.holding.gas, t) - else - if (T) - var/t1 = src.gas.total_moles() - var/t2 = src.maximum - t1 - var/t = src.t_per - if (t > t2) - t = t2 - src.gas.turf_take(T, t) - if(4.0) - if( !portable() ) use_power(50, ENVIRON) - if (T) - if (T.firelevel > 900000.0) - src.f_time = world.time + 400 - else - if (world.time > src.f_time) - src.gas.extract_toxs(T) - if( !portable() ) use_power(150, ENVIRON) - var/contain = src.gas.total_moles() - if (contain > 1.3E8) - src.gas.turf_add(T, 1.3E8 - contain) - - src.setstate() - src.updateDialog() - return - */ //TODO: FIX - -/obj/machinery/atmoalter/siphs/scrubbers/air_filter/setstate() - - if(stat & NOPOWER) - icon_state = "vent-p" - return - - if (src.t_status == 4) - src.icon_state = "vent2" - else - if (src.t_status == 3) - src.icon_state = "vent0" - else - src.icon_state = "vent1" - return - -/obj/machinery/atmoalter/siphs/scrubbers/air_filter/attackby(W as obj, user as mob) - - if (istype(W, /obj/item/weapon/screwdriver)) - if (src.c_status) - src.anchored = 1 - src.c_status = 0 - else - if (locate(/obj/machinery/connector, src.loc)) - src.anchored = 1 - src.c_status = 3 - else - if (istype(W, /obj/item/weapon/wrench)) - src.alterable = !( src.alterable ) - return - -/obj/machinery/atmoalter/siphs/scrubbers/air_filter/reset(valve, auto) - - if (auto) - src.t_status = 4 - src.setstate() - return - -/obj/machinery/atmoalter/siphs/scrubbers/port/setstate() - - if(stat & NOPOWER) - icon_state = "scrubber:0" - return - - if (src.holding) - src.icon_state = "scrubber:T" - else - if (src.t_status != 3) - src.icon_state = "scrubber:1" - else - src.icon_state = "scrubber:0" - return - -/obj/machinery/atmoalter/siphs/scrubbers/port/reset(valve, auto) - - if (valve < 0) - src.t_per = -valve - src.t_status = 1 - else - if (valve > 0) - src.t_per = valve - src.t_status = 2 - else - src.t_status = 3 - if (auto) - src.t_status = 4 - src.setstate() - return - -//true if the siphon is portable (therfore no power needed) - -/obj/machinery/proc/portable() - return istype(src, /obj/machinery/atmoalter/siphs/fullairsiphon/port) || istype(src, /obj/machinery/atmoalter/siphs/scrubbers/port) - -/obj/machinery/atmoalter/siphs/power_change() - - if( portable() ) - return - - if(!powered(ENVIRON)) - spawn(rand(0,15)) - stat |= NOPOWER - setstate() - else - stat &= ~NOPOWER - setstate() - - -/obj/machinery/atmoalter/siphs/process() - /* -// var/dbg = (suffix=="d") && Debug - - if(stat & NOPOWER) return - - if (src.t_status != 3) - var/turf/T = src.loc - if (istype(T, /turf)) - if (locate(/obj/move, T)) - T = locate(/obj/move, T) - else - T = null - switch(src.t_status) - if(1.0) - if( !portable() ) use_power(50, ENVIRON) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.holding.gas.transfer_from(src.gas, t) - else - if (T) - var/t1 = src.gas.total_moles() - var/t2 = t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.gas.turf_add(T, t) - if(2.0) - if( !portable() ) use_power(50, ENVIRON) - if (src.holding) - var/t1 = src.gas.total_moles() - var/t2 = src.maximum - t1 - var/t = src.t_per - if (src.t_per > t2) - t = t2 - src.gas.transfer_from(src.holding.gas, t) - else - if (T) - var/t1 = src.gas.total_moles() - var/t2 = src.maximum - t1 - var/t = src.t_per - if (t > t2) - t = t2 - //var/g = gas.total_moles() - //if(dbg) world.log << "VP0 : [t] from turf: [gas.total_moles()]" - //if(dbg) Air() - - src.gas.turf_take(T, t) - //if(dbg) world.log << "VP1 : now [gas.total_moles()]" - - //if(dbg) world.log << "[gas.total_moles()-g] ([t]) from turf to siph" - - //if(dbg) Air() - if(4.0) - if( !portable() ) - use_power(50, ENVIRON) - - if (T) - if (T.firelevel > 900000.0) - src.f_time = world.time + 300 - else - if (world.time > src.f_time) - var/difference = CELLSTANDARD - (T.oxygen + T.n2) - if (difference > 0) - var/t1 = src.gas.total_moles() - if (difference > t1) - difference = t1 - src.gas.turf_add(T, difference) - - src.updateDialog() - - src.setstate() - return - */ //TODO: FIX - -/obj/machinery/atmoalter/siphs/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/atmoalter/siphs/attack_paw(user as mob) - - return src.attack_hand(user) - return - -/obj/machinery/atmoalter/siphs/attack_hand(var/mob/user as mob) - - if(stat & NOPOWER) return - - if(src.portable() && istype(user, /mob/living/silicon/ai)) //AI can't use portable siphons - return - - user.machine = src - var/tt - switch(src.t_status) - if(1.0) - tt = text("Releasing Siphon Stop", src, src) - if(2.0) - tt = text("Release Siphoning Stop", src, src) - if(3.0) - tt = text("Release Siphon Stopped Automatic", src, src, src) - else - tt = "Automatic equalizers are on!" - var/ct = null - switch(src.c_status) - if(1.0) - ct = text("Releasing Accept Stop", src, src) - if(2.0) - ct = text("Release Accepting Stop", src, src) - if(3.0) - ct = text("Release Accept Stopped", src, src) - else - ct = "Disconnected" - var/at = null - if (src.t_status == 4) - at = text("Automatic On Stop", src) - var/dat = text("Canister Valves []
\n\tContains/Capacity [] / []
\n\tUpper Valve Status: [] []
\n\t\tM - - - - [] + + + + M
\n\tPipe Valve Status: []
\n\t\tM - - - - [] + + + + M
\n
\n\nClose
\n\t
", (!( src.alterable ) ? "Valves are locked. Unlock with wrench!" : "You can lock this interface with a wrench."), num2text(src.gas.return_pressure(), 10), num2text(src.maximum, 10), (src.t_status == 4 ? text("[]", at) : text("[]", tt)), (src.holding ? text("
(Tank ([])", src, src.holding.air_contents.return_pressure()) : null), src, num2text(max_valve, 7), src, src, src, src, src.t_per, src, src, src, src, src, num2text(max_valve, 7), ct, src, num2text(max_valve, 7), src, src, src, src, src.c_per, src, src, src, src, src, num2text(max_valve, 7), user) - user << browse(dat, "window=siphon;size=600x300") - onclose(user, "siphon") - return - -/obj/machinery/atmoalter/siphs/Topic(href, href_list) - ..() - - if (usr.stat || usr.restrained()) - return - if ((!( src.alterable )) && (!istype(usr, /mob/living/silicon/ai))) - return - if (((get_dist(src, usr) <= 1 || usr.telekinesis == 1) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if (href_list["c"]) - var/c = text2num(href_list["c"]) - switch(c) - if(1.0) - src.c_status = 1 - if(2.0) - src.c_status = 2 - if(3.0) - src.c_status = 3 - else - else - if (href_list["t"]) - var/t = text2num(href_list["t"]) - if (src.t_status == 0) - return - switch(t) - if(1.0) - src.t_status = 1 - if(2.0) - src.t_status = 2 - if(3.0) - src.t_status = 3 - if(4.0) - src.t_status = 4 - src.f_time = 1 - else - else - if (href_list["tp"]) - var/tp = text2num(href_list["tp"]) - src.t_per += tp - src.t_per = min(max(round(src.t_per), 0), max_valve) - else - if (href_list["cp"]) - var/cp = text2num(href_list["cp"]) - src.c_per += cp - src.c_per = min(max(round(src.c_per), 0), max_valve) - else - if (href_list["tank"]) - var/cp = text2num(href_list["tank"]) - if (cp == 1) - src.holding.loc = src.loc - src.holding = null - if (src.t_status == 2) - src.t_status = 3 - src.updateUsrDialog() - - src.add_fingerprint(usr) - else - usr << browse(null, "window=canister") - return - return - -/obj/machinery/atmoalter/siphs/attackby(var/obj/W as obj, mob/user as mob) - - if (istype(W, /obj/item/weapon/tank)) - if (src.holding) - return - var/obj/item/weapon/tank/T = W - user.drop_item() - T.loc = src - src.holding = T - else - if (istype(W, /obj/item/weapon/screwdriver)) - var/obj/machinery/connector/con = locate(/obj/machinery/connector, src.loc) - if (src.c_status) - src.anchored = 0 - src.c_status = 0 - user.show_message("\blue You have disconnected the siphon.") - if(con) - con.connected = null - else - if (con && !con.connected) - src.anchored = 1 - src.c_status = 3 - user.show_message("\blue You have connected the siphon.") - con.connected = src - else - user.show_message("\blue There is nothing here to connect to the siphon.") - - - else - if (istype(W, /obj/item/weapon/wrench)) - src.alterable = !( src.alterable ) - if (src.alterable) - user << "\blue You unlock the interface!" - else - user << "\blue You lock the interface!" - return - - diff --git a/code/unused/spacecraft/manufacturing.dm b/code/unused/spacecraft/manufacturing.dm deleted file mode 100644 index 9036407ac5..0000000000 --- a/code/unused/spacecraft/manufacturing.dm +++ /dev/null @@ -1,247 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -// Entirely unfinished. Mostly just bouncing ideas off the code. - - -// Smelting -// Grinding -// Spraying -// Crate - -/obj/deploycrate - icon = 'icons/obj/mining.dmi' - icon_state = "deploycrate" - density = 1 - var/payload - -/obj/deploycrate/attack_hand(mob/user as mob) - switch(payload) - if(null) - return - //if("cloner") - // make a cloner - // blah blah - for (var/mob/V in hearers(src)) - V.show_message("[src] lets out a pneumatic hiss, its panels rapdily unfolding and expanding to produce its payload.", 2) - del(src) - - -/obj/machinery/nanosprayer - icon = 'icons/obj/mining.dmi' - icon_state = "sprayer" - density = 1 - anchored = 1 - var/payload - var/hacked = 0 - var/temp = 100 - - var/usr_density = 5 - var/usr_lastupdate = 0 - - var/time_started = 0 - - var/points = 0 - var/totalpoints = 0 - - var/state = 0 // 0 - Idle, 1 - Spraying, 2 - Done, 3 - Overheated - -obj/machinery/nanosprayer/proc/update_temp() - // 1 second : 1 degree - if(src.state == 0) - var/diff = (world.time - usr_lastupdate) * 10 - temp -= diff - if(temp < 100) - temp = 100 - usr_lastupdate = world.time - return temp - else if(src.state == 1) - var/diff = (world.time - usr_lastupdate) * 10 - diff = diff * usr_density - temp += diff - usr_lastupdate = world.time - return temp - -obj/machinery/nanosprayer/process() - src.time_started = world.time - totalpoints = lentext(payload) * rand(5,10) - if(!totalpoints) - totalpoints = 1 - while(src.state == 1) - // Each unit of cost is 20 seconds - density - temp += density * rand(1,4) - sleep(200 - (usr_density * 10)) - if(src.temp > 350) - src.state = 3 - src.overheat() - return 0 - points += usr_density - if(points >= totalpoints) - src.state = 2 - src.complete() - return 1 - - -obj/machinery/nanosprayer/proc/cooldown() - while(state != 1) - sleep(200) - temp -= rand(5,20) - if(temp < 100) - temp = 100 - return - -obj/machinery/nanosprayer/proc/overheat() - return - -obj/machinery/nanosprayer/proc/complete() - src.totalpoints = 0 - src.points = 0 - spawn() cooldown() - return - -obj/machinery/nanosprayer/attack_hand(user as mob) - var/dat - if(..()) - return - dat += text("Core Temp: [temp]�C
") - dat += text("Nanocloud Density: [usr_density] million
") - dat += text("\[- / +\]
") - if(payload) - dat += text("
Task: [payload]
") - switch(state) - if(0) - dat += text("Status: Idling
") - if(1) - dat += text("Status: Spraying
") - if(2) - dat += text("Status: Spray Task Complete
") - if(3) - dat += text("Status: OVERHEATED
") - if(state == 1) - if(points <= 0) - points = 1 - var/complete = (points * 100)/totalpoints - if(complete < 0) - complete = 0 - if(complete > 100) - complete = 100 - dat += text("Progress: [complete]%
") - if(state == 2) - dat += text("Progress: 100%
") - dat += text("\[Release Payload\]
") - dat += text("

Set Task
") - dat += text("Start Spray
") - dat += text("Cancel Spray") - dat += text("

Refresh") - user << browse("NANO SPRAY 1.1[dat]", "window=nanosprayer") - onclose(user, "nanosprayer") - -obj/machinery/nanosprayer/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["plus"]) - usr_density += 1 - if(href_list["minus"]) - usr_density -= 1 - if(usr_density < 1) - usr_density = 1 - if(href_list["start"]) - if(state == 0) - state = 1 - spawn() src.process() - if(href_list["stop"]) - if(state == 1) - state = 0 - points = 0 - totalpoints = 0 - spawn() cooldown() - if(href_list["settask"]) - if(state == 0) - var/temppayload = input("Set a Task:", "Job Assignment") as text|null - if(temppayload) - payload = temppayload - //if(href_list["release"]) - // if(state == 2) - // Create the crate somewhere - src.updateUsrDialog() - -/obj/machinery/smelter - icon = 'icons/obj/mining.dmi' - icon_state = "sprayer" - density = 1 - anchored = 1 - var/locked = 0 - var/closed = 0 - var/state = 0 // 0 - Idle, 1 - Smelt, 2 - Cool, 3 - Clean - var/slag = 0 - var/hacked = 0 - -obj/machinery/smelter/attack_hand(user as mob) - var/dat - if(..()) - return - dat += text("

Smelt-o-Matic Control Interface

") - dat += text("The red light is [src.closed ? "off" : "on"].
") - dat += text("The green light is [src.locked ? "on" : "off"].
") - switch(slag) - if(0) - dat += text("The meter is resting at zero.
") - if(1 to 2) - dat += text("The meter is wobbling at the mid-point marker.
") - if(3) - dat += text("The meter strains, displaying its maximum value.
") - else - dat += text("The meter has broken.
") - switch(state) - if(0) - dat += text("Status:Idle
") - if(1) - dat += text("Status:Smelting
") - if(2) - dat += text("Status:Cooling
") - if(3) - dat += text("Status:Cleaning
") - dat += text("

Turn key [src.locked ? "to upper-left position" : "to upper-right position"]
") - dat += text("Flip switch [src.closed ? "up" : "down"]
") - dat += text("Push large flashing yellow button
") - user << browse("SMELTOMATIC[dat]", "window=smelter") - onclose(user, "smelter") - - -obj/machinery/smelter/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["key"]) - src.locked = !src.locked - if(href_list["switch"]) - src.closed = !src.closed - if(href_list["button"]) - //Do stuff to actually smelt shit or something I don't know - return - src.updateUsrDialog() - - -/obj/machinery/slaggrinder - icon = 'icons/obj/mining.dmi' - - density = 1 - anchored = 1 - - - -/obj/machinery/adminmachine - icon = 'icons/obj/mining.dmi' - icon_state = "sprayer" - density = 1 - anchored = 1 - - var/gameticker - var/gameworld - - New() - ..() - gameticker = ticker - gameworld = world diff --git a/code/unused/spacecraft/shipcore.dm b/code/unused/spacecraft/shipcore.dm deleted file mode 100644 index 6df889c0b1..0000000000 --- a/code/unused/spacecraft/shipcore.dm +++ /dev/null @@ -1,348 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/obj/machinery/shipcore - icon = 'craft.dmi' - icon_state = "core" - density = 1 - - var/width = 6 - var/height = 8 - var/list/turfs = list() - var/list/builders - var/list/components = list() - var/build_status = "unbuilt" - - - proc/group_self() - builders = list() - turfs = list() - components = list() - - src.anchored = 1 - - var/obj/ship_builder/L = new(locate(src.x, src.y, src.z)) - L.set_dir(WEST) - L.distance = width/2 - L.core = src - - var/obj/ship_builder/R = new(locate(src.x+1, src.y, src.z)) - R.set_dir(EAST) - R.distance = (width/2)-1 - R.core = src - - builders.Add(L, R) - - spawn() L.scan() - spawn() R.scan() - - var/h - for(h=1, h[src.wires[wire] ? "Mend" : "Cut"] Pulse
") - - dat += text("The red light is [src.disabled ? "off" : "on"].
") - dat += text("The green light is [src.shocked ? "off" : "on"].
") - dat += text("The blue light is [src.hacked ? "off" : "on"].
") -*/ - switch(src.build_status) - if("unbuilt") - dat += "

Core Status: Undeployed


" - dat += "Build Ship
" - if("built") - dat += "

Core Status: Deployed


" - dat += "Move
" - if("rebuilding") - dat += "

Core Status: Recalibrating


" - user << browse("Ship Core[dat]","window=shipcore") - onclose(user, "shipcore") - return - user << browse("Ship Core Control Panel[dat]", "window=shipcore") - onclose(user, "shipcore") - return - -obj/machinery/shipcore/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["groupself"]) - src.group_self() - if (href_list["move"]) - var/list/beacons = list() - for(var/obj/effect/ship_landing_beacon/b in world) - if(istype(b, /obj/effect/ship_landing_beacon)) - if(b.active) - beacons.Add(b) - if(!beacons.len) - return - var/obj/choice = input("Choose a beacon to land at.", "Beacon Selection") in beacons - if(choice) - src.MoveShip(choice.loc) - - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) - src.updateUsrDialog() - return - - - -obj/machinery/ship_component - name = "ship component" - icon = 'craft.dmi' - var/obj/machinery/shipcore/core - var/required_draw = 0 - var/active = 1 - - proc - draw_power(var/n as num) - if(!n) - n = required_draw - if(core.draw_power(n)) - return 1 - else - return 0 - -obj/machinery/ship_component/thruster - name = "thruster" - icon_state = "thruster" - density = 1 - opacity = 1 - - var/cooldown = 600 // In 1/10th seconds - var/lastused - var/ready = 0 - required_draw = 100 - - proc - check_ready() - if(ready) - return 1 - if(lastused + cooldown <= world.time) - for(var/turf/T in range(1,src)) - if(istype(T, /turf/space)) - src.ready = 1 - break - else - src.ready = 0 - return src.ready - - fire() - src.check_ready() - if(!ready) - return 0 - if(src.draw_power()) - src.ready = 0 - src.lastused = world.time - return 1 - else - return 0 - -obj/machinery/ship_component/engine - name = "engine" - icon_state = "engine" - density = 1 - opacity = 1 - - var/charge = 1000 - var/capacity = 1000 - - draw_power(var/n as num) - if(charge >= n) - charge -= n - return 1 - else - return 0 - -obj/machinery/ship_component/control_panel - name = "control panel" - icon_state = "controlpanel" - density = 1 - opacity = 0 - - attack_hand(user as mob) - var/dat - if(..()) - return - if(!src.core) - dat += "No linked core found. Deploy ship core first." - else - dat += "Ship Status: [src.core.build_status]

" - dat += "

Installed Components:



" - dat += "" - for(var/obj/machinery/ship_component/C in core.components) - dat += "" - if(istype(C, /obj/machinery/ship_component/engine)) - dat += "" - if(istype(C, /obj/machinery/ship_component/thruster)) - dat += "" - dat += "
[C.name][C.active ? "Active" : "Inactive"]
Fuel: [C:charge]/[C:capacity]
Status: [C:check_ready() ? "Ready" : "On Cooldown"]
" - user << browse("Ship Controls[dat]","window=shipcontrols") - onclose(user, "shipcontrols") - - Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - - - - - - - - -/obj/ship_builder - icon = 'craft.dmi' - icon_state = "builder" - density = 0 - opacity = 0 - - var/obj/machinery/shipcore/core - var/distance = 0 - - proc/scan() - if(distance < 0) - cleanup_self() - var/i - for(i=0, iworld.maxx-4 || T.x<4) continue //putting them at the edge is dumb - if(T.y>world.maxy-4 || T.y<4) continue - turfs += T - if(!turfs.len) turfs += pick(/turf in orange(6)) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(10, 0, usr.loc) - smoke.start() - var/turf/picked = pick(turfs) - if(!isturf(picked)) return - usr.loc = picked - usr.verbs -= /client/proc/blink - spawn(40) - usr.verbs += /client/proc/blink - -//TELEPORT - -/mob/proc/teleport() - set category = "Spells" - set name = "Teleport" - set desc = "This spell teleports you to a type of area of your selection." - if(usr.stat) - src << "Not when you are incapacitated." - return - if(!usr.casting()) return - var/A - usr.verbs -= /mob/proc/teleport -/* - var/list/theareas = new/list() - for(var/area/AR in world) - if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station)) continue - if(theareas.Find(AR.name)) continue - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z == src.z) - theareas += AR.name - theareas[AR.name] = AR -*/ - - A = input("Area to jump to", "BOOYEA", A) in teleportlocs - - spawn(600) - usr.verbs += /mob/proc/teleport - - var/area/thearea = teleportlocs[A] - - usr.say("SCYAR NILA [uppertext(A)]") - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, usr.loc) - smoke.attach(usr) - smoke.start() - var/list/L = list() - for(var/turf/T in get_area_turfs(thearea.type)) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." - return - - var/attempt = 0 - var/success = 0 - while(!success) - success = Move(pick(L)) - if(attempt > 20) break //Failsafe - if(!success) - usr.loc = pick(L) - - smoke.start() - - -//JAUNT - -/client/proc/jaunt() - set category = "Spells" - set name = "Ethereal Jaunt" - set desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - if(usr.stat) - src << "Not when you are incapacitated." - return - if(!usr.casting()) return - usr.verbs -= /client/proc/jaunt - spawn(300) - usr.verbs += /client/proc/jaunt - spell_jaunt(usr) - -/proc/spell_jaunt(var/mob/H, time = 50) - if(H.stat) return - spawn(0) - var/mobloc = get_turf(H.loc) - var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) - var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc ) - animation.name = "water" - animation.density = 0 - animation.anchored = 1 - animation.icon = 'icons/mob/mob.dmi' - animation.icon_state = "liquify" - animation.layer = 5 - animation.master = holder - flick("liquify",animation) - H.loc = holder - H.client.eye = holder - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() - steam.set_up(10, 0, mobloc) - steam.start() - sleep(time) - mobloc = get_turf(H.loc) - animation.loc = mobloc - steam.location = mobloc - steam.start() - H.canmove = 0 - sleep(20) - flick("reappear",animation) - sleep(5) - if(!H.Move(mobloc)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - var/turf/T = get_step(mobloc, direction) - if(T) - if(H.Move(T)) - break - H.canmove = 1 - H.client.eye = H - del(animation) - del(holder) -/* -/obj/effect/dummy/spell_jaunt - name = "water" - icon = 'icons/effects/effects.dmi' - icon_state = "nothing" - var/canmove = 1 - density = 0 - anchored = 1 - -/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction) - if (!src.canmove) return - switch(direction) - if(NORTH) - src.y++ - if(SOUTH) - src.y-- - if(EAST) - src.x++ - if(WEST) - src.x-- - if(NORTHEAST) - src.y++ - src.x++ - if(NORTHWEST) - src.y++ - src.x-- - if(SOUTHEAST) - src.y-- - src.x++ - if(SOUTHWEST) - src.y-- - src.x-- - src.canmove = 0 - spawn(2) src.canmove = 1 - -/obj/effect/dummy/spell_jaunt/ex_act(blah) - return -/obj/effect/dummy/spell_jaunt/bullet_act(blah,blah) - return -*/ -//MUTATE - -/client/proc/mutate() - set category = "Spells" - set name = "Mutate" - set desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." - if(usr.stat) - src << "Not when you are incapacitated." - return - if(!usr.casting()) return - usr.verbs -= /client/proc/mutate - spawn(400) - usr.verbs += /client/proc/mutate - - usr.say("BIRUZ BENNAR") - - usr << text("\blue You feel strong! You feel pressure building behind your eyes!") - if (!(HULK in usr.mutations)) - usr.mutations.Add(HULK) - if (!(LASER in usr.mutations)) - usr.mutations.Add(LASER) - spawn (300) - if (LASER in usr.mutations) usr.mutations.Remove(LASER) - if (HULK in usr.mutations) usr.mutations.Remove(HULK) - return - -//BODY SWAP /N - -/mob/proc/swap(mob/living/M as mob in oview()) - set category = "Spells" - set name = "Mind Transfer" - set desc = "This spell allows the user to switch bodies with a target." - if(usr.stat) - src << "Not when you are incapacitated." - return - - if(M.client && M.mind) - if(M.mind.special_role != "Wizard" || "Fake Wizard" || "Changeling" || "Cultist" || "Space Ninja")//Wizards, changelings, ninjas, and cultists are protected. - if( (istype(M, /mob/living/carbon/human)) || (istype(M, /mob/living/carbon/monkey)) && M.stat != 2) - var/mob/living/carbon/human/H = M //so it does not freak out when looking at the variables. - var/mob/living/carbon/human/U = src - - U.whisper("GIN'YU CAPAN") - U.verbs -= /mob/proc/swap - //Remove special verbs from both mobs - if(U.mind.special_verbs.len) - for(var/V in U.mind.special_verbs) - U.verbs -= V - if(H.mind.special_verbs.len) - for(var/V in H.mind.special_verbs) - H.verbs -= V - - //empty out H - var/mob/dead/observer/G = H.ghostize(0) //Transfers H to a temporary mob - - //Start the Transfer - U.mind.transfer_to(H) - G.mind.transfer_to(U) - U.key = G.key //has to be called explicitly since ghostize() set the datum/mind/var/active = 0 - - //Re-add those special verbs and stuff - if(H.mind.special_verbs.len) - var/spell_loss = 1//Can lose only one spell during transfer. - var/probability = 95 //To determine the chance of wizard losing their spell. - for(var/V in H.mind.special_verbs) - if(spell_loss == 0) - H.verbs += V - else - if(prob(probability)) - H.verbs += V - probability -= 7//Chance of of keeping spells goes down each time a spell is added. Less spells means less chance of losing them. - else - spell_loss = 0 - H.mind.special_verbs -= V - spawn(500) - H << "The mind transfer has robbed you of a spell." - - if(U.mind.special_verbs.len)//Basic fix to swap verbs for any mob if needed. - for(var/V in U.mind.special_verbs) - U.verbs += V - - spawn(500) - U << "Something about your body doesn't seem quite right..." - - U.Paralyse(20) - H.Paralyse(20) - - spawn(600) - H.verbs += /mob/proc/swap - - else - src << "Their mind is not compatible." - return - else - src << "Their mind is resisting your spell." - return - - else - src << "They appear to be brain-dead." - return \ No newline at end of file diff --git a/code/unused/tensioner.dm b/code/unused/tensioner.dm deleted file mode 100644 index 1cf5eb2acd..0000000000 --- a/code/unused/tensioner.dm +++ /dev/null @@ -1,876 +0,0 @@ -#define PLAYER_WEIGHT 5 -#define HUMAN_DEATH -5000 -#define OTHER_DEATH -5000 -#define EXPLO_SCORE -10000 //boum - -#define COOLDOWN_TIME 12000 // Twenty minutes -#define MIN_ROUND_TIME 18000 - - -#define FLAT_PERCENT 0 - -//estimated stats -//80 minute round -//60 player server -//48k player-ticks - -//60 deaths (ideally) -//20 explosions - - -var/global/datum/tension/tension_master - -/datum/tension - var/score - - var/deaths - var/human_deaths - var/explosions - var/adminhelps - var/air_alarms - - var/nuketeam = 0 - var/malfAI = 0 - var/wizard = 0 - - var/forcenexttick = 0 - var/supress = 0 - var/eversupressed = 0 - var/cooldown = 0 - - var/round1 = 0 - var/round2 = 0 - var/round3 = 0 - var/round4 = 0 - - var/list/antagonistmodes = null - - - - var/list/potentialgames = list() - - New() - score = 0 - deaths=0 - human_deaths=0 - explosions=0 - adminhelps=0 - air_alarms=0 - - if(FLAT_PERCENT) // I cannot into balance - antagonistmodes = list ( - "POINTS_FOR_TRATIOR" = 6, - "POINTS_FOR_CHANGLING" = 6, - "POINTS_FOR_REVS" = 3, - "POINTS_FOR_MALF" = 1, - "POINTS_FOR_WIZARD" = 2, - "POINTS_FOR_CULT" = 3, - "POINTS_FOR_NUKETEAM" = 2, - "POINTS_FOR_ALIEN" = 5, - "POINTS_FOR_NINJA" = 3, - "POINTS_FOR_DEATHSQUAD" = 2, - "POINTS_FOR_BORGDEATHSQUAD" = 2 - ) - - else - antagonistmodes = list ( - "POINTS_FOR_TRATIOR" = 100000, - "POINTS_FOR_CHANGLING" = 120000, - "POINTS_FOR_REVS" = 150000, - "POINTS_FOR_MALF" = 250000, - "POINTS_FOR_WIZARD" = 150000, - "POINTS_FOR_CULT" = 150000, - "POINTS_FOR_NUKETEAM" = 250000, - "POINTS_FOR_ALIEN" = 200000, - "POINTS_FOR_NINJA" = 200000, - "POINTS_FOR_DEATHSQUAD" = 500000, - "POINTS_FOR_BORGDEATHSQUAD" = 500000 - ) - - proc/process() - score += get_num_players()*PLAYER_WEIGHT - - if(config.Tensioner_Active) - if(world.time > MIN_ROUND_TIME) - round1++ - if(!supress && !cooldown) - if(prob(1) || forcenexttick) - round2++ - if(prob(10) || forcenexttick) - round3++ - if(forcenexttick) - forcenexttick = 0 - - for (var/client/C in admin_list) - C << " The tensioner wishes to create additional antagonists! Press (this) in 60 seconds to abort!" - - spawn(600) - if(!supress) - cooldown = 1 - spawn(COOLDOWN_TIME) - cooldown = 0 - round4++ - - if(!antagonistmodes.len) - return - - var/thegame = null - - if(FLAT_PERCENT) - thegame = pickweight(antagonistmodes) - antagonistmodes.Remove(thegame) - - else - for(var/V in antagonistmodes) // OH SHIT SOMETHING IS GOING TO HAPPEN NOW - if(antagonistmodes[V] < score) - potentialgames.Add(V) - antagonistmodes.Remove(V) - if(potentialgames.len) - thegame = pick(potentialgames) - - - if(thegame) - - - log_admin("The tensioner fired, and decided on [thegame]") - - switch(thegame) - if("POINTS_FOR_TRATIOR") - if(!makeTratiors()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - if("POINTS_FOR_CHANGLING") - if(!makeChanglings()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - if("POINTS_FOR_REVS") - if(!makeRevs()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - if("POINTS_FOR_MALF") - if(!makeMalfAImode()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - if("POINTS_FOR_WIZARD") - if(!makeWizard()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_CULT") - if(!makeCult()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_NUKETEAM") - if(!makeNukeTeam()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_ALIEN") - if(!makeAliens()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_NINJA") - if(!makeSpaceNinja()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_DEATHSQUAD") - if(!makeDeathsquad()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - if("POINTS_FOR_BORG_DEATHSQUAD") - if(!makeBorgDeathsquad()) - forcenexttick = 1 - else - potentialgames.Remove(thegame) - - - proc/get_num_players() - var/peeps = 0 - for (var/mob/M in player_list) - if (!M.client) - continue - peeps += 1 - - return peeps - - proc/death(var/mob/M) - if (!M) return - deaths++ - - if (istype(M,/mob/living/carbon/human)) - score += HUMAN_DEATH - human_deaths++ - else - score += OTHER_DEATH - - - proc/explosion() - score += EXPLO_SCORE - explosions++ - - proc/new_adminhelp() - adminhelps++ - - proc/new_air_alarm() - air_alarms++ - - - Topic(href, href_list) - - if(!usr || !usr.client) - return //This shouldnt happen - - if(!usr.client.holder) - message_admins("\red [key_name(usr)] tried to use the tensioner without authorization.") - log_admin("[key_name(usr)] tried to use the tensioner without authorization.") - return - - log_admin("[key_name(usr)] used a tensioner override. The override was [href]") - message_admins("[key_name(usr)] used a tensioner override. The override was [href]") - - - if(href_list["addScore"]) - score += 50000 - - if (href_list["makeTratior"]) - makeTratiors() - - else if (href_list["makeChanglings"]) - makeChanglings() - - else if (href_list["makeRevs"]) - makeRevs() - - else if (href_list["makeWizard"]) - makeWizard() - - else if (href_list["makeCult"]) - makeCult() - - else if (href_list["makeMalf"]) - makeMalfAImode() - - else if (href_list["makeNukeTeam"]) - makeNukeTeam() - - else if (href_list["makeAliens"]) - makeAliens() - - else if (href_list["makeSpaceNinja"]) - makeSpaceNinja() - - else if (href_list["makeDeathsquad"]) - makeDeathsquad() - - else if (href_list["makeBorgDeathsquad"]) - makeBorgDeathsquad() - - else if (href_list["Supress"]) - supress = 1 - eversupressed++ - spawn(6000) - supress = 0 - - else if (href_list["ToggleStatus"]) - config.Tensioner_Active = !config.Tensioner_Active - - - proc/makeMalfAImode() - - var/list/mob/living/silicon/AIs = list() - var/mob/living/silicon/malfAI = null - var/datum/mind/themind = null - - for(var/mob/living/silicon/ai/ai in player_list) - if(ai.client) - AIs += ai - - if(AIs.len) - malfAI = pick(AIs) - - else - return 0 - - if(malfAI) - themind = malfAI.mind - themind.make_AI_Malf() - return 1 - -/* - if(BE_CHANGELING) roletext="changeling" - if(BE_TRAITOR) roletext="traitor" - if(BE_OPERATIVE) roletext="operative" - if(BE_WIZARD) roletext="wizard" - if(BE_REV) roletext="revolutionary" - if(BE_CULTIST) roletext="cultist" - - - for(var/mob/new_player/player in world) - if(player.client && player.ready) - if(player.preferences.be_special & role) -*/ - - - proc/makeTratiors() - - var/datum/game_mode/traitor/temp = new - - if(config.protect_roles_from_antagonist) - temp.restricted_jobs += temp.protected_jobs - - var/list/mob/living/carbon/human/candidates = list() - var/mob/living/carbon/human/H = null - - for(var/mob/living/carbon/human/applicant in player_list) - - var/datum/preferences/preferences = new - - if(applicant.stat < 2) - if(applicant.mind) - if (!applicant.mind.special_role) - if(!jobban_isbanned(applicant, "traitor") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - if(applicant.client) - if(preferences.savefile_load(applicant, 0)) - if(preferences.be_special & BE_TRAITOR) - candidates += applicant - - if(candidates.len) - var/numTratiors = min(candidates.len, 3) - - for(var/i = 0, i300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.client) - candidates.Remove(G) - - spawn(0) - if(candidates.len) - while((!theghost || !theghost.client) && candidates.len) - theghost = pick(candidates) - candidates.Remove(theghost) - if(!theghost) - return 0 - var/mob/living/carbon/human/new_character=makeBody(theghost) - new_character.mind.make_Wizard() - - return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode. - - - proc/makeCult() - - var/datum/game_mode/cult/temp = new - if(config.protect_roles_from_antagonist) - temp.restricted_jobs += temp.protected_jobs - - var/list/mob/living/carbon/human/candidates = list() - var/mob/living/carbon/human/H = null - - for(var/mob/living/carbon/human/applicant in player_list) - - var/datum/preferences/preferences = new - - if(applicant.stat < 2) - if(applicant.mind) - if (!applicant.mind.special_role) - if(!jobban_isbanned(applicant, "cultist") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - if(applicant.client) - if(preferences.savefile_load(applicant, 0)) - if(preferences.be_special & BE_CULTIST) - candidates += applicant - - if(candidates.len) - var/numCultists = min(candidates.len, 4) -// var/list/runeWords = list() - - for(var/i = 0, i300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.client) - candidates.Remove(G) - - spawn(0) - if(candidates.len) - var/numagents = 5 - syndicate_begin() - - for(var/i = 0, iAlert: The shuttle is going back!
" - - var/syndicate_commando_number = syndicate_commandos_possible //for selecting a leader - - */ - var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned. - - //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - - - for(var/mob/dead/observer/G in player_list) - spawn(0) - switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.key) - candidates.Remove(G) - - if(candidates.len) - var/numagents = 6 - //Spawns commandos and equips them. - for (var/obj/effect/landmark/L in /area/syndicate_mothership/elite_squad) - if(numagents<=0) - break - if (L.name == "Syndicate-Commando") - syndicate_leader_selected = numagents == 1?1:0 - - var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected) - - - while((!theghost || !theghost.client) && candidates.len) - theghost = pick(candidates) - candidates.Remove(theghost) - - if(!theghost) - del(new_syndicate_commando) - break - - new_syndicate_commando.key = theghost.key - new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" - - //So they don't forget their code or mission. - - - new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red [input]" - - numagents-- - - //Spawns the rest of the commando gear. - // for (var/obj/effect/landmark/L) - // if (L.name == "Commando_Manual") - //new /obj/item/weapon/gun/energy/pulse_rifle(L.loc) - // var/obj/item/weapon/paper/P = new(L.loc) - // P.info = "

Good morning soldier!. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:
#1 Work as a team.
#2 Accomplish your objective at all costs.
#3 Leave no witnesses.
You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.
If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.

In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations LEADER is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.

Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.
First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.
To make the device functional:
#1 Place bomb in designated detonation zone
#2 Extend and anchor bomb (attack with hand).
#3 Insert Nuclear Auth. Disk into slot.
#4 Type numeric code into keypad ([nuke_code]).
Note: If you make a mistake press R to reset the device.
#5 Press the E button to log onto the device.
You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.
Note: Toggle off the SAFETY.
Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
Note: THE BOMB IS STILL SET AND WILL DETONATE
Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.

The nuclear authorization code is: [nuke_code ? nuke_code : "None provided"]

Good luck, soldier!

" - // P.name = "Spec. Ops. Manual" - - for (var/obj/effect/landmark/L in /area/shuttle/syndicate_elite) - if (L.name == "Syndicate-Commando-Bomb") - new /obj/effect/spawner/newbomb/timer/syndicate(L.loc) - // del(L) - - return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode. - - - proc/makeBorgDeathsquad() - var/list/mob/dead/observer/candidates = list() - var/mob/dead/observer/theghost = null - var/time_passed = world.time - var/list/namelist = list("Tyr","Fenrir","Lachesis","Clotho","Atropos","Nyx") - - //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - - for(var/mob/dead/observer/G in player_list) - spawn(0) - switch(alert(G,"Do you wish to be considered for a cyborg strike team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.client || !G.key) - candidates.Remove(G) - - if(candidates.len) - var/numagents = 3 - - //Spawns commandos and equips them. - for (var/obj/effect/landmark/L in /area/borg_deathsquad) - if(numagents<=0) - break - if (L.name == "Borg-Deathsquad") - - var/name = pick(namelist) - namelist.Remove(name) - - var/mob/living/silicon/robot/new_borg_deathsquad = create_borg_death_commando(L, name) - - - - while((!theghost || !theghost.client) && candidates.len) - theghost = pick(candidates) - candidates.Remove(theghost) - - if(!theghost) - del(new_borg_deathsquad) - break - - new_borg_deathsquad.key = theghost.key - - //So they don't forget their code or mission. - - - new_borg_deathsquad << "You are a borg deathsquad operative. Follow your laws." - numagents-- - - //Spawns the rest of the commando gear. - // for (var/obj/effect/landmark/L) - // if (L.name == "Commando_Manual") - //new /obj/item/weapon/gun/energy/pulse_rifle(L.loc) - // var/obj/item/weapon/paper/P = new(L.loc) - // P.info = "

Good morning soldier!. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:
#1 Work as a team.
#2 Accomplish your objective at all costs.
#3 Leave no witnesses.
You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.
If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.

In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations LEADER is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.

Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.
First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.
To make the device functional:
#1 Place bomb in designated detonation zone
#2 Extend and anchor bomb (attack with hand).
#3 Insert Nuclear Auth. Disk into slot.
#4 Type numeric code into keypad ([nuke_code]).
Note: If you make a mistake press R to reset the device.
#5 Press the E button to log onto the device.
You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.
Note: Toggle off the SAFETY.
Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
Note: THE BOMB IS STILL SET AND WILL DETONATE
Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.

The nuclear authorization code is: [nuke_code ? nuke_code : "None provided"]

Good luck, soldier!

" - // P.name = "Spec. Ops. Manual" - - - return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode. - - - proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character - if(!G_found || !G_found.key) return - - //First we spawn a dude. - var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. - - new_character.gender = pick(MALE,FEMALE) - - var/datum/preferences/A = new() - A.randomize_appearance_for(new_character) - if(new_character.gender == MALE) - new_character.real_name = "[pick(first_names_male)] [pick(last_names)]" - else - new_character.real_name = "[pick(first_names_female)] [pick(last_names)]" - new_character.name = new_character.real_name - new_character.age = rand(17,45) - - new_character.dna.ready_dna(new_character) - new_character.key = G_found.key - - return new_character - - /proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0) - var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc) - var/syndicate_commando_leader_rank = pick("Lieutenant", "Captain", "Major") - var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") - var/syndicate_commando_name = pick(last_names) - - new_syndicate_commando.gender = pick(MALE, FEMALE) - - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_syndicate_commando) - - new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]" - new_syndicate_commando.name = new_syndicate_commando.real_name - new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45) - - new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA. - - //Creates mind stuff. - new_syndicate_commando.mind_initialize() - new_syndicate_commando.mind.assigned_role = "MODE" - new_syndicate_commando.mind.special_role = "Syndicate Commando" - - //Adds them to current traitor list. Which is really the extra antagonist list. - ticker.mode.traitors += new_syndicate_commando.mind - new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected) - - return new_syndicate_commando - - - - - - /proc/create_borg_death_commando(obj/spawn_location, name) - - var/mob/living/silicon/robot/new_borg_deathsquad = new(spawn_location.loc, 1) - - new_borg_deathsquad.real_name = name - new_borg_deathsquad.name = name - - //Creates mind stuff. - new_borg_deathsquad.mind_initialize() - new_borg_deathsquad.mind.assigned_role = "MODE" - new_borg_deathsquad.mind.special_role = "Borg Commando" - - //Adds them to current traitor list. Which is really the extra antagonist list. - ticker.mode.traitors += new_borg_deathsquad.mind - //del(spawn_location) // Commenting this out for multiple commando teams. - return new_borg_deathsquad - - - - - -/obj/machinery/computer/Borg_station - name = "Cyborg Station Terminal" - icon = 'icons/obj/computer.dmi' - icon_state = "syndishuttle" - req_access = list() - var/temp = null - var/hacked = 0 - var/jumpcomplete = 0 - -/obj/machinery/computer/Borg_station/attack_hand() - if(jumpcomplete) - return - if(alert(usr, "Are you sure you want to send a cyborg deathsquad?", "Confirmation", "Yes", "No") == "Yes") - var/area/start_location = locate(/area/borg_deathsquad/start) - var/area/end_location = locate(/area/borg_deathsquad/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - del(T) - - start_location.move_contents_to(end_location) - - for(var/obj/machinery/door/poddoor/P in end_location) - P.open() - jumpcomplete = 1 - command_alert("DRADIS contact! Set condition one throughout the station!") diff --git a/code/unused/toilets.dm b/code/unused/toilets.dm deleted file mode 100644 index f943a1cc54..0000000000 --- a/code/unused/toilets.dm +++ /dev/null @@ -1,96 +0,0 @@ -/* -CONTAINS: -TOILET - -/obj/item/weapon/storage/toilet - name = "toilet" - w_class = 4.0 - anchored = 1.0 - density = 0.0 - var/status = 0.0 - var/clogged = 0.0 - anchored = 1.0 - icon = 'icons/obj/stationobjs.dmi' - icon_state = "toilet" - item_state = "syringe_kit" - -/obj/item/weapon/storage/toilet/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if (src.contents.len >= 7) - user << "The toilet is clogged!" - return - if (istype(W, /obj/item/weapon/disk/nuclear)) - user << "This is far too important to flush!" - return - if (istype(W, /obj/item/weapon/storage/)) - return - if (istype(W, /obj/item/weapon/grab)) - playsound(src.loc, 'sound/effects/slosh.ogg', 50, 1) - for(var/mob/O in viewers(user, null)) - O << text("\blue [] gives [] a swirlie!", user, W) - return - var/t - for(var/obj/item/weapon/O in src) - t += O.w_class - t += W.w_class - if (t > 30) - user << "You cannot fit the item inside." - return - user.u_equip(W) - W.loc = src - if ((user.client && user.s_active != src)) - user.client.screen -= W - src.orient2hud(user) - W.dropped(user) - add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue [] has put [] in []!", user, W, src), 1) - return - -/obj/item/weapon/storage/toilet/MouseDrop_T(mob/M as mob, mob/user as mob) - if (!ticker) - user << "You can't help relieve anyone before the game starts." - return - if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat)) - return - if (M == usr) - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] sits on the toilet.", user) - else - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] is seated on the toilet by []!", M, user) - M.anchored = 1 - M.buckled = src - M.loc = src.loc - src.add_fingerprint(user) - return - -/obj/item/weapon/storage/toilet/attack_hand(mob/user as mob) - for(var/mob/M in src.loc) - if (M.buckled) - if (M != user) - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] is zipped up by [].", M, user) - else - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] zips up.", M) -// world << "[M] is no longer buckled to [src]" - M.anchored = 0 - M.buckled = null - src.add_fingerprint(user) - if((src.clogged < 1) || (src.contents.len < 7) || (user.loc != src.loc)) - for(var/mob/O in viewers(user, null)) - O << text("\blue [] flushes the toilet.", user) - src.clogged = 0 - src.contents.len = 0 - else if((src.clogged >= 1) || (src.contents.len >= 7) || (user.buckled != src.loc)) - for(var/mob/O in viewers(user, null)) - O << text("\blue The toilet is clogged!") - return - - -*/ \ No newline at end of file diff --git a/code/unused/traps.dm b/code/unused/traps.dm deleted file mode 100644 index 94681d1929..0000000000 --- a/code/unused/traps.dm +++ /dev/null @@ -1,225 +0,0 @@ -/obj/effect/pressure_plate - name = "pressure plate" - desc = "A pressure plate that triggers a trap or a few of them." - density = 0 - var/list/connected_traps_names = list() //mappers, edit this when you place pressure plates on the map. don't forget to make the connected traps have an UNIQUE name - var/list/connected_traps = list() //actual references to the connected traps. leave empty, it is generated at runtime from connected_traps_names - var/trigger_type = "mob and obj" //can be "mob", "obj" or "mob and obj", the only moveable types - -/obj/effect/pressure_plate/New() - ..() - src:visibility = 0 - refresh() - -/obj/effect/pressure_plate/verb/refresh() - set name = "Refresh Pressure Plate Links" - set category = "Object" - set src in view() - connected_traps = list() //emptying the list first - for(var/trap_name in connected_traps_names) - for(var/obj/effect/trap/the_trap in world) - if(the_trap.name == trap_name) - connected_traps += the_trap //adding the trap with the matching name - -/obj/effect/pressure_plate/HasEntered(atom/victim as mob|obj) - if(victim.density && (trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj)))) - for(var/obj/effect/trap/T in connected_traps) - T.trigger(victim) - -/obj/effect/pressure_plate/Bumped(atom/victim as mob|obj) - if(victim.density && (trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj)))) - for(var/obj/effect/trap/T in connected_traps) - T.trigger(victim) - -/obj/effect/trap //has three subtypes - /aoe, /area (ie affects an entire area), /single (only the victim is affected) - name = "trap" - desc = "It's a trap!" - density = 0 - var/uses = 1 //how many times it can be triggered - var/trigger_type = "mob and obj" //can be "mob", "obj" or "mob and obj", the only moveable types. can also be "none" to not be triggered by entering its square (needs to have a pressure plate attached in that case) - var/target_type = "mob" //if it targets mobs, turfs or objs - var/include_dense = 1 //if it includes dense targets in the aoe (may be important for some reason). you'll probably want to change it to 1 if you target mobs or objs - -/obj/effect/trap/New() - ..() - src:visibility = 0 //seriously, it keeps saying "undefined var" when I try to do it in the define - -/obj/effect/trap/HasEntered(victim as mob|obj) - if(trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj))) - trigger(victim) - -/obj/effect/trap/Bumped(victim as mob|obj) - if(trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj))) - trigger(victim) - -/obj/effect/trap/proc/trigger(victim) - if(!uses) - return - uses-- - activate(victim) - -/obj/effect/trap/proc/activate() - -/obj/effect/trap/aoe - name = "aoe trap" - desc = "This trap affects a number of mobs, turfs or objs in an aoe" - var/aoe_radius = 3 //radius of aoe - var/aoe_range_or_view = "view" //if it includes all tiles in [radius] range or view - -/obj/effect/trap/aoe/proc/picktargets() - - var/list/targets = list() - - switch(target_type) - if("turf") - switch(aoe_range_or_view) - if("view") - for(var/turf/T in view(src,aoe_radius)) - if(!T.density || include_dense) - targets += T - if("range") - for(var/turf/T in range(src,aoe_radius)) - if(!T.density || include_dense) - targets += T - if("mob") - switch(aoe_range_or_view) - if("view") - for(var/mob/living/M in view(src,aoe_radius)) - if(!M.density || include_dense) - targets += M - if("range") - for(var/mob/living/M in range(src,aoe_radius)) - if(!M.density || include_dense) - targets += M - if("obj") - switch(aoe_range_or_view) - if("view") - for(var/obj/O in view(src,aoe_radius)) - if(!O.density || include_dense) - targets += O - if("range") - for(var/obj/O in range(src,aoe_radius)) - if(!O.density || include_dense) - targets += O - - return targets - -/obj/effect/trap/aoe/rocksfall - name = "rocks fall trap" - desc = "Your DM must really hate you." - target_type = "turf" - include_dense = 0 - var/rocks_amt = 10 //amount of rocks falling - var/rocks_min_dmg = 50 //min damage per rock - var/rocks_max_dmg = 100 //max damage per rock - var/rocks_hit_chance = 100 //the chance for a rock to hit you - var/list/rocks_type = list() //what rocks might it drop on the target. with var editing, not even limited to rocks. - -/obj/effect/trap/aoe/rocksfall/New() - - ..() - - rocks_type = pick_rock_types() - -/obj/effect/trap/aoe/rocksfall/proc/pick_rock_types() //since we may want subtypes of the trap with completely different rock types, which is best done this way - - var/list/varieties = list() - - varieties = typesof(/obj/item/weapon/ore) - varieties -= /obj/item/weapon/ore/diamond //don't want easily available rare ores, hmm? - varieties -= /obj/item/weapon/ore/uranium - varieties -= /obj/item/weapon/ore/slag //that'd be just stupid - - return varieties - -/obj/effect/trap/aoe/rocksfall/activate() - - var/list/targets = list() - targets = picktargets() - - if(target_type == "turf") - for(var/i=0,i 0) - step(src, src.dir) - sleep(1) - t1-- - else - var/t1 = round(src.speed / 5) - while(t1 > 0) - step(src, src.dir) - t1-- - return - -/obj/machinery/vehicle/meteorhit(var/obj/O as obj) - for (var/obj/item/I in src) - I.loc = src.loc - - for (var/mob/M in src) - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - del(src) - -/obj/machinery/vehicle/ex_act(severity) - switch (severity) - if (1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - //SN src = null - del(src) - if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - //SN src = null - del(src) - -/obj/machinery/vehicle/blob_act() - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) - -/obj/machinery/vehicle/Bump(var/atom/A) - //world << "[src] bumped into [A]" - spawn (0) - ..() - src.speed = 0 - return - return - -/obj/machinery/vehicle/relaymove(mob/user as mob, direction) - if (user.stat) - return - - if ((user in src)) - if (direction & 1) - src.speed = max(src.speed - 1, 1) - else if (direction & 2) - src.speed = min(src.maximum_speed, src.speed + 1) - else if (src.can_rotate && direction & 4) - src.set_dir(turn(src.dir, -90.0)) - else if (src.can_rotate && direction & 8) - src.set_dir(turn(src.dir, 90)) - else if (direction & 16 && src.can_maximize_speed) - src.speed = src.maximum_speed - -/obj/machinery/vehicle/verb/eject() - set src = usr.loc - - if (usr.stat) - return - - var/mob/M = usr - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - step(M, turn(src.dir, 180)) - return - -/obj/machinery/vehicle/verb/board() - set src in oview(1) - - if (usr.stat) - return - - if (src.one_person_only && locate(/mob, src)) - usr << "There is no room! You can only fit one person." - return - - var/mob/M = usr - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - - M.loc = src - -/obj/machinery/vehicle/verb/unload(var/atom/movable/A in src) - set src in oview(1) - - if (usr.stat) - return - - if (istype(A, /atom/movable)) - A.loc = src.loc - for(var/mob/O in view(src, null)) - if ((O.client && !(O.blinded))) - O << text("\blue [] unloads [] from []!", usr, A, src) - - if (ismob(A)) - var/mob/M = A - if (M.client) - M.client.perspective = MOB_PERSPECTIVE - M.client.eye = M - -/obj/machinery/vehicle/verb/load() - set src in oview(1) - - if (usr.stat) - return - - if (((istype(usr, /mob/living/carbon/human)) && (!(ticker) || (ticker && ticker.mode != "monkey")))) - var/mob/living/carbon/human/H = usr - - if ((H.pulling && !(H.pulling.anchored))) - if (src.one_person_only && !(istype(H.pulling, /obj/item/weapon))) - usr << "You may only place items in." - else - H.pulling.loc = src - if (ismob(H.pulling)) - var/mob/M = H.pulling - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] loads [] into []!", H, H.pulling, src) - - H.stop_pulling() - - -/obj/machinery/vehicle/space_ship - icon = 'escapepod.dmi' - icon_state = "pod" - var/datum/global_iterator/space_ship_inertial_movement/pr_inertial_movement - var/datum/global_iterator/space_ship_speed_increment/pr_speed_increment - var/last_relay = 0 - var/obj/machinery/portable_atmospherics/canister/internal_tank - var/health = 100 - var/datum/effects/system/spark_spread/spark_system = new - - New() - ..() - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - pr_inertial_movement = new /datum/global_iterator/space_ship_inertial_movement(list(src),0) - pr_speed_increment = new /datum/global_iterator/space_ship_speed_increment(list(src),0) - src.spark_system.set_up(2, 0, src) - src.spark_system.attach(src) - return - - proc/inspace() - if(istype(src.loc, /turf/space)) - return 1 - return 0 - - remove_air(amount) - if(src.internal_tank) - return src.internal_tank.air_contents.remove(amount) - else - var/turf/T = get_turf(src) - return T.remove_air(amount) - - return_air() - if(src.internal_tank) - return src.internal_tank.return_air() - return - - proc/return_pressure() - if(src.internal_tank) - return src.internal_tank.return_pressure() - return 0 - - proc/return_temperature() - if(src.internal_tank) - return src.internal_tank.return_temperature() - return 0 - - Bump(var/atom/movable/A) - if(istype(A)) - step(A, src.dir) - else - if(pr_inertial_movement.cur_delay<2) - take_damage(25) - pr_speed_increment.stop() - pr_inertial_movement.stop() - return - - proc/take_damage(value) - if(isnum(value)) - src.health -= value - if(src.health>0) - src.spark_system.start() -// world << "[src] health is [health]" - else - src.ex_act(1) - return - - process() - return - - proc/get_desired_speed() - return (pr_inertial_movement.max_delay-pr_inertial_movement.desired_delay)/(pr_inertial_movement.max_delay-pr_inertial_movement.min_delay)*100 - - proc/get_current_speed() - return (pr_inertial_movement.max_delay-pr_inertial_movement.cur_delay)/(pr_inertial_movement.max_delay-pr_inertial_movement.min_delay)*100 - -/obj/machinery/vehicle/space_ship/relaymove(mob/user as mob, direction) - spawn() - if (user.stat || world.time-last_relay<2) - return - last_relay = world.time - var/speed_change = 0 - if(direction & NORTH) - pr_inertial_movement.desired_delay = between(pr_inertial_movement.min_delay, pr_inertial_movement.desired_delay-1, pr_inertial_movement.max_delay) - speed_change = 1 - else if (direction & SOUTH) - pr_inertial_movement.desired_delay = between(pr_inertial_movement.min_delay, pr_inertial_movement.desired_delay+1, pr_inertial_movement.max_delay) - speed_change = 1 - else if (src.can_rotate && direction & 4) - src.set_dir(turn(src.dir, -90.0)) - else if (src.can_rotate && direction & 8) - src.set_dir(turn(src.dir, 90)) - if(speed_change) -// user << "Desired speed: [get_desired_speed()]%" - src.pr_speed_increment.start() - src.pr_inertial_movement.start() - return - -//should try two directional iterator datums, one for vertical, one for horizontal movement. -/datum/global_iterator/space_ship_inertial_movement - delay = 1 - var/min_delay = 0 - var/max_delay = 15 - var/desired_delay - var/cur_delay - var/last_move - - New() - ..() - desired_delay = max_delay - cur_delay = max_delay - - stop() - src.cur_delay = max_delay - src.desired_delay = max_delay - return ..() - - process(var/obj/machinery/vehicle/space_ship/SS as obj) - if(cur_delay >= max_delay) - return src.stop() - if(world.time - last_move < cur_delay) - return - last_move = world.time -/* - if(src.delay>=SS.max_delay) - return src.stop() -*/ - if(!step(SS, SS.dir) || !SS.inspace()) - src.stop() - return - - proc/set_desired_delay(var/num as num) - src.desired_delay = num - return - -/datum/global_iterator/space_ship_speed_increment - delay = 5 - - process(var/obj/machinery/vehicle/space_ship/SS as obj) - if(SS.pr_inertial_movement.desired_delay!=SS.pr_inertial_movement.cur_delay) - var/delta = SS.pr_inertial_movement.desired_delay - SS.pr_inertial_movement.cur_delay - SS.pr_inertial_movement.cur_delay += delta>0?1:-1 -/* - for(var/mob/M in SS) - M << "Current speed: [SS.get_current_speed()]" -*/ - else - src.stop() - return diff --git a/code/world.dm b/code/world.dm index f53e039e4f..3897c24729 100644 --- a/code/world.dm +++ b/code/world.dm @@ -212,8 +212,6 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite C << link("byond://[config.server]") - else - C << link("byond://[world.address]:[world.port]") ..(reason) diff --git a/config/example/config.txt b/config/example/config.txt index eb9ab2195f..333082d189 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -85,7 +85,7 @@ LOG_PDA ## set to 0 to disable that mode PROBABILITY EXTENDED 1 PROBABILITY MALFUNCTION 1 -PROBABILITY NUCLEAR 1 +PROBABILITY MERCENARY 1 PROBABILITY WIZARD 1 PROBABILITY CHANGELING 1 PROBABILITY CULT 1 diff --git a/html/changelog.html b/html/changelog.html index c5c115f383..ceb9870229 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,18 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

1 September 2015

+

updated:

+
    +
  • Voice changers no longer use ID cards. They have Toggle and Set Voice verbs on the actual mask object now.
  • +

    Zuhayr updated:

    +
      +
    • Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to face current dir.
    • +
    +
+ +

22 November 2014

Zuhayr updated:

diff --git a/icons/atmos/heat.dmi b/icons/atmos/heat.dmi index 6d1ed47e7e..1014c2015b 100644 Binary files a/icons/atmos/heat.dmi and b/icons/atmos/heat.dmi differ diff --git a/icons/atmos/junction.dmi b/icons/atmos/junction.dmi index 70286bde15..892f5823f2 100644 Binary files a/icons/atmos/junction.dmi and b/icons/atmos/junction.dmi differ diff --git a/code/WorkInProgress/Cael_Aislinn/covershield.dmi b/icons/covershield.dmi similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/covershield.dmi rename to icons/covershield.dmi diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi b/icons/jungle.dmi similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi rename to icons/jungle.dmi diff --git a/code/WorkInProgress/Cael_Aislinn/meteor_turret.dmi b/icons/meteor_turret.dmi similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/meteor_turret.dmi rename to icons/meteor_turret.dmi diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 4525fea606..0653f3b482 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/OnFire.dmi b/icons/mob/OnFire.dmi new file mode 100644 index 0000000000..8bf6e2c774 Binary files /dev/null and b/icons/mob/OnFire.dmi differ diff --git a/code/WorkInProgress/Susan/biocraps.dmi b/icons/mob/biocraps.dmi similarity index 100% rename from code/WorkInProgress/Susan/biocraps.dmi rename to icons/mob/biocraps.dmi diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi index a82446462f..3525678125 100644 Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index b3a24f07c7..c66d9cceba 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 53cf56309f..b70af9c656 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 cae6ddf042..c6183f6ff5 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index 68d802193f..f5fef65c74 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 391366d320..5196ec25f8 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index ffc7169614..2ac5635932 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a899995b25..2aba03d266 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 43f9eb909b..c57f93464d 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/doors/DoorHazard.dmi b/icons/obj/doors/DoorHazard.dmi index 037c1475f2..35f4c474bf 100644 Binary files a/icons/obj/doors/DoorHazard.dmi and b/icons/obj/doors/DoorHazard.dmi differ diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 2fa39fec04..1ad833316d 100644 Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 92b3aed2b9..ffad059da4 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index b40ae3db6e..5aacb99234 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi b/icons/rust.dmi similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi rename to icons/rust.dmi diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/rust_old.dmi b/icons/rust_old.dmi similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Rust/rust_old.dmi rename to icons/rust_old.dmi diff --git a/code/WorkInProgress/Susan/desert.dmi b/icons/turf/desert.dmi similarity index 100% rename from code/WorkInProgress/Susan/desert.dmi rename to icons/turf/desert.dmi diff --git a/interface/skin.dmf b/interface/skin.dmf index 330d547944..8eee4e1817 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -23,6 +23,10 @@ macro "macro" name = "NORTHWEST" command = ".northwest" is-disabled = false + elem + name = "ALT+WEST" + command = "westfaceperm" + is-disabled = false elem name = "CTRL+WEST" command = "westface" @@ -31,6 +35,10 @@ macro "macro" name = "WEST+REP" command = ".west" is-disabled = false + elem + name = "ALT+NORTH" + command = "northfaceperm" + is-disabled = false elem name = "CTRL+NORTH" command = "northface" @@ -39,6 +47,10 @@ macro "macro" name = "NORTH+REP" command = ".north" is-disabled = false + elem + name = "ALT+EAST" + command = "eastfaceperm" + is-disabled = false elem name = "CTRL+EAST" command = "eastface" @@ -47,6 +59,10 @@ macro "macro" name = "EAST+REP" command = ".east" is-disabled = false + elem + name = "ALT+SOUTH" + command = "southfaceperm" + is-disabled = false elem name = "CTRL+SOUTH" command = "southface" diff --git a/maps/RandomZLevels/stationCollision.dmm b/maps/RandomZLevels/stationCollision.dmm index e401ac1ed4..cbdd44a7c8 100644 --- a/maps/RandomZLevels/stationCollision.dmm +++ b/maps/RandomZLevels/stationCollision.dmm @@ -263,7 +263,7 @@ "fc" = (/turf/simulated/floor,/area/awaymission/northblock) "fd" = (/obj/machinery/light/small,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/northblock) "fe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/awaymission/northblock) -"ff" = (/obj/structure/table,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor{pixel_x = -3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_y = -3; step_y = 0},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) +"ff" = (/obj/structure/table,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor{pixel_x = -3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_y = -3},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fg" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fh" = (/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stock_parts/micro_laser{pixel_x = -3; pixel_y = -3},/obj/item/weapon/stock_parts/micro_laser{pixel_x = 3; pixel_y = 3},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fi" = (/obj/machinery/computer/crew,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/awaymission/northblock) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 3dd3dec5c5..10228b682f 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -372,9 +372,9 @@ "ahh" = (/obj/machinery/photocopier,/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahi" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Security Warden Office"; dir = 2; network = list("SS13")},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahk" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/paper{info = "\[center]\[Large]\[b]NSS Exodus\[/b]\[/large]\[br] \[small]Armoury Inventory\[/small]\[/center] \[hr] \[hr] \[br] \[b]Weaponry\[/b]\[br] \[field] Energy Gun(s)\[br] \[field] Laser Gun(s)\[br] \[field] Ion Rifle(s)\[br] \[field] Combat Shotgun(s) \[hr] \[b]Armour\[/b]\[br] \[field] Bulletproof Vest(s)\[br] \[field] Abalative Vest(s)\[br] \[field] Biohazard Suit(s)\[br] \[field] Bomb Suit(s) \[hr] \[b]Auxiliary Equipment\[/b]\[br] \[field] Gasmask(s)\[br] \[field] box(es) of Flashbangs\[br] \[field] box(es) of Handcuffs\[br] \[field] box(es) of R.O.B.U.S.T. Cartridges \[hr] \[b]Riot Equipment\[/b]\[br] \[field] Stun Baton(s)\[br] \[field] Riot Suit(s)\[br] \[field] Riot Shield(s) \[hr] \[b]Tactical Equipment\[/b]\[br] \[field] Tactical Armour(s)\[br] \[field] Tactical Helmet(s)\[br] \[field] Tactical Jumpsuit(s)\[br] \[field] Green Balaclava(s)\[br] \[field] Tactical HUD(s)\[br] \[field] Combat Belt(s)\[br] \[field] Black Glove(s)\[br] \[field] Jackboot(s) \[hr] \[b]Implants\[/b]\[br] \[field] Tracking Implant Box(es)\[br] \[field] Chemical Implant Box(es) \[hr] \[b]Defense Systems\[/b]\[br] \[field] Deployable Barrier(s)\[br] \[field] Portable Flasher(s) \[hr] \[b]Other\[/b]\[br] \[field] Holobadge Box(es) \[hr] \[b]\[center]Warden's's Signature:\[/b] \[field]\[/center] \[hr]"; name = "Armory Inventory"},/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahl" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/red,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahm" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/item/weapon/stamp,/obj/item/weapon/stamp/denied{pixel_x = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"ahk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) +"ahl" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access_txt = "1"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) +"ahm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "ahn" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/main) "aho" = (/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "ahp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) @@ -431,7 +431,7 @@ "aio" = (/obj/machinery/camera{c_tag = "Security Processing"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/turf/simulated/floor,/area/security/brig) "aip" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor,/area/security/brig) "aiq" = (/obj/structure/table,/turf/simulated/floor,/area/security/brig) -"air" = (/obj/machinery/computer/secure_data,/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/security{pixel_y = -32},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"air" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "ais" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ait" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiu" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) @@ -457,8 +457,8 @@ "aiO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) "aiP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "aiQ" = (/obj/machinery/computer/secure_data,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/security/brig) -"aiR" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aiS" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"aiR" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"aiS" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/security{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiT" = (/obj/machinery/computer/prisoner,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiU" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiV" = (/obj/structure/closet/secure_closet/warden,/obj/item/device/megaphone,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) @@ -466,8 +466,8 @@ "aiX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aiY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aiZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aja" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"ajb" = (/obj/structure/table,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -32},/obj/item/clothing/tie/holobadge,/obj/item/clothing/tie/holobadge,/obj/item/clothing/tie/holobadge/cord,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) +"aja" = (/obj/machinery/camera{c_tag = "Brig East"; dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/computer/guestpass{pixel_y = -29},/turf/simulated/floor,/area/security/brig) +"ajb" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "ajc" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall,/area/crew_quarters/heads/hos) "ajd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "HoS Office South"; dir = 1},/obj/structure/flora/pottedplant,/obj/machinery/newscaster/security_unit{pixel_x = -30},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "aje" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) @@ -483,9 +483,9 @@ "ajo" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "ajp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) -"ajr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access_txt = "1"},/turf/simulated/floor,/area/security/brig) -"ajs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) -"ajt" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig) +"ajr" = (/obj/machinery/computer/secure_data,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"ajs" = (/obj/machinery/camera{c_tag = "Common Brig Northwest"; dir = 4; network = list("SS13","Prison")},/obj/machinery/computer/arcade,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/prison) +"ajt" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonentry"; name = "Brig Entry"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "aju" = (/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/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "ajv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) @@ -523,7 +523,7 @@ "akc" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "akd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "ake" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) -"akf" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) +"akf" = (/obj/structure/table,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/tie/holobadge,/obj/item/clothing/tie/holobadge,/obj/item/clothing/tie/holobadge/cord,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "akg" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) "akh" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "aki" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) @@ -557,7 +557,7 @@ "akK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) "akL" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "akM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"akN" = (/obj/machinery/camera{c_tag = "Brig East"; dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) +"akN" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "akO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "akP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) "akQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/security/brig) @@ -645,7 +645,7 @@ "amu" = (/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/substation/security) "amv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/power/sensor{name = "Powernet Sensor - Security Subgrid"; name_tag = "Security Subgrid"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/maintenance/substation/security) "amw" = (/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/substation/security) -"amx" = (/turf/simulated/floor/plating,/area/space) +"amx" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/space) "amy" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/fore) "amz" = (/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/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/hallway/primary/fore) "amA" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera{c_tag = "Brig Toxin Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/security/brig) @@ -693,7 +693,7 @@ "anq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "anr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/wall,/area/security/prison) "ans" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"ant" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonentry"; name = "Brig Entry"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) +"ant" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/weapon/paper{info = "\[center]\[Large]\[b]NSS Exodus\[/b]\[/large]\[br] \[small]Armoury Inventory\[/small]\[/center] \[hr] \[hr] \[br] \[b]Weaponry\[/b]\[br] \[field] Energy Gun(s)\[br] \[field] Laser Gun(s)\[br] \[field] Ion Rifle(s)\[br] \[field] Combat Shotgun(s) \[hr] \[b]Armour\[/b]\[br] \[field] Bulletproof Vest(s)\[br] \[field] Abalative Vest(s)\[br] \[field] Biohazard Suit(s)\[br] \[field] Bomb Suit(s) \[hr] \[b]Auxiliary Equipment\[/b]\[br] \[field] Gasmask(s)\[br] \[field] box(es) of Flashbangs\[br] \[field] box(es) of Handcuffs\[br] \[field] box(es) of R.O.B.U.S.T. Cartridges \[hr] \[b]Riot Equipment\[/b]\[br] \[field] Stun Baton(s)\[br] \[field] Riot Suit(s)\[br] \[field] Riot Shield(s) \[hr] \[b]Tactical Equipment\[/b]\[br] \[field] Tactical Armour(s)\[br] \[field] Tactical Helmet(s)\[br] \[field] Tactical Jumpsuit(s)\[br] \[field] Green Balaclava(s)\[br] \[field] Tactical HUD(s)\[br] \[field] Combat Belt(s)\[br] \[field] Black Glove(s)\[br] \[field] Jackboot(s) \[hr] \[b]Implants\[/b]\[br] \[field] Tracking Implant Box(es)\[br] \[field] Chemical Implant Box(es) \[hr] \[b]Defense Systems\[/b]\[br] \[field] Deployable Barrier(s)\[br] \[field] Portable Flasher(s) \[hr] \[b]Other\[/b]\[br] \[field] Holobadge Box(es) \[hr] \[b]\[center]Warden's's Signature:\[/b] \[field]\[/center] \[hr]"; name = "Armory Inventory"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "anu" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "anv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/security/prison) "anw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) @@ -735,7 +735,7 @@ "aog" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/prison) "aoh" = (/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13","Prison")},/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "aoi" = (/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/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"aoj" = (/obj/machinery/camera{c_tag = "Common Brig Northwest"; dir = 4; network = list("SS13","Prison")},/obj/machinery/computer/arcade,/turf/simulated/floor,/area/security/prison) +"aoj" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aok" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) "aol" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/security/prison) "aom" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southleft,/turf/simulated/floor,/area/security/prison) @@ -763,7 +763,7 @@ "aoI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aoJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aoK" = (/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aoL" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dorm_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aoL" = (/turf/simulated/floor/plating/airless,/area/maintenance/dormitory) "aoM" = (/obj/machinery/door/blast/regular{id = "Cell 2"; name = "Cell Door"},/turf/simulated/floor,/area/security/prison) "aoN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) "aoO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) @@ -854,7 +854,7 @@ "aqv" = (/obj/structure/table,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/maintenance/dormitory) "aqw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/dormitory) "aqx" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aqy" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/dormitory) +"aqy" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dorm_sensor"; pixel_x = 25; pixel_y = -8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/dormitory) "aqz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aqA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aqB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -878,7 +878,7 @@ "aqT" = (/turf/simulated/floor/plating/airless,/area/solar/fore) "aqU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"aqW" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/junction,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"aqW" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqX" = (/obj/machinery/camera{c_tag = "Detective South"; dir = 1},/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aqY" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aqZ" = (/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) @@ -923,7 +923,7 @@ "arM" = (/obj/structure/stool/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/maintenance/dormitory) "arN" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/maintenance/dormitory) "arO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dorm_inner"; locked = 1; name = "Dormitory Internal Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"arP" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/space) +"arP" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dorm_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/maintenance/dormitory) "arQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "arR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/brig) "arS" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 1"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) @@ -1051,13 +1051,13 @@ "auk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/prison) "aul" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/security/prison) "aum" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/camera{c_tag = "Bedroom"; dir = 6; network = list("SS13","Prison")},/turf/simulated/floor,/area/security/prison) -"aun" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/prison) +"aun" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/cryopod{density = 0; layer = 3.3; pixel_y = 32},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 24},/turf/simulated/floor,/area/security/prison) "auo" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/generic,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aup" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/random/tech_supply,/obj/item/clothing/head/flatcap,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "auq" = (/obj/machinery/atm{pixel_x = -25},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "aur" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) "aus" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"aut" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) +"aut" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/prison) "auu" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "auv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "auw" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) @@ -1074,7 +1074,7 @@ "auH" = (/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) "auI" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) "auJ" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) -"auK" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) +"auK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "auL" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness) "auM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "auN" = (/turf/simulated/wall,/area/hallway/secondary/entry/fore) @@ -1102,10 +1102,10 @@ "avj" = (/obj/structure/cryofeed,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "avk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "avl" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"avm" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"avn" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) +"avm" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) +"avn" = (/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/crew_quarters/sleep) "avo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) -"avp" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) +"avp" = (/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/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/dormitory) "avq" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) "avr" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "avs" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) @@ -1147,11 +1147,11 @@ "awc" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets{pixel_x = -3; pixel_y = -3},/turf/simulated/floor,/area/security/prison) "awd" = (/obj/structure/table,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/head/greenbandana,/turf/simulated/floor,/area/security/prison) "awe" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/security/prison) -"awf" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor,/area/security/prison) +"awf" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor,/area/security/prison) "awg" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/security/prison) "awh" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/turf/simulated/floor,/area/security/prison) "awi" = (/obj/machinery/light,/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) -"awj" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/prison) +"awj" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "awk" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) "awl" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,/obj/item/clothing/suit/apron/overalls,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "awm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) @@ -1238,7 +1238,7 @@ "axP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "axQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/fore) "axR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) -"axS" = (/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/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"axS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "axT" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "axU" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "axV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) @@ -1289,7 +1289,7 @@ "ayO" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "ayP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) "ayQ" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) -"ayR" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) +"ayR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "ayS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Dormitory Bedroom Fore"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms) "ayT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/sleep) "ayU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) @@ -1404,7 +1404,7 @@ "aAZ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "aBa" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "aBb" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock{id_tag = "Dormitory 2"; name = "Dorm"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep) -"aBc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) +"aBc" = (/obj/machinery/camera{c_tag = "Dormitory Bedroom Aft"; dir = 1},/turf/simulated/floor/carpet{tag = "icon-carpet1-0"; icon_state = "carpet1-0"},/area/crew_quarters/sleep/bedrooms) "aBd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep) "aBe" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) "aBf" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) @@ -1847,7 +1847,7 @@ "aJA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/bar) "aJB" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = "Hydroponics"; name = "Hydroponics"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/bar) "aJC" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aJD" = (/obj/machinery/camera{c_tag = "Dormitory Bedroom Aft"; dir = 1},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) +"aJD" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "aJE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "aJF" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "aJG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar) @@ -2198,7 +2198,7 @@ "aQn" = (/turf/simulated/floor,/area/hydroponics) "aQo" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) "aQp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hydroponics) -"aQq" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) +"aQq" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) "aQr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hydroponics) "aQs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics) "aQt" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) @@ -2262,7 +2262,7 @@ "aRz" = (/obj/machinery/biogenerator,/turf/simulated/floor,/area/hydroponics) "aRA" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hydroponics) "aRB" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/hydroponics) -"aRC" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor,/area/hydroponics) +"aRC" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor,/area/hydroponics) "aRD" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) "aRE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hydroponics) "aRF" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) @@ -3329,7 +3329,7 @@ "bma" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard) "bmb" = (/turf/simulated/floor{dir = 6; icon_state = "purple"},/area/hallway/primary/starboard) "bmc" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit) -"bmd" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"bmd" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "bme" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/hallway/secondary/exit) "bmf" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bmg" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -3570,9 +3570,9 @@ "bqH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bqI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bqJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqK" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bqK" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bqL" = (/turf/simulated/wall/r_wall,/area/medical/chemistry) -"bqM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception) +"bqM" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access_txt = "10"},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plating,/area/engine/engine_room) "bqN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "bqO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "bqP" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue_ex"; tag = "icon-whiteblue (EAST)"},/area/medical/reception) @@ -5174,7 +5174,7 @@ "bVz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) "bVA" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) "bVB" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) -"bVC" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/binary/pump/on{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/engine,/area/rnd/mixing) +"bVC" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/engine,/area/rnd/mixing) "bVD" = (/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/rnd/mixing) "bVE" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) "bVF" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/mixing) @@ -5325,7 +5325,7 @@ "bYu" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYw" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry) -"bYx" = (/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/binary/pump/on{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/engine,/area/rnd/mixing) +"bYx" = (/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/engine,/area/rnd/mixing) "bYy" = (/obj/machinery/meter,/obj/machinery/door_control{id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -25; pixel_y = 5; req_access_txt = "7"},/obj/machinery/ignition_switch{id = "mixingsparker"; pixel_x = -25; pixel_y = -5},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/mixing) "bYz" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) "bYA" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing) @@ -5467,12 +5467,12 @@ "cbg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cbh" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cbi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance) -"cbj" = (/obj/machinery/airlock_sensor{command = "cycle_exterior"; frequency = 1379; id_tag = "eng_eva_ext_sensor"; master_tag = "eng_eva_airlock"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance) +"cbj" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance) "cbk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_outer"; locked = 1; name = "Engineering EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/engine/engine_eva_maintenance) "cbl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_eva_pump"},/turf/simulated/floor{dir = 9; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance) "cbm" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "eng_eva_pump"; tag_exterior_door = "eng_eva_outer"; frequency = 1379; id_tag = "eng_eva_airlock"; tag_interior_door = "eng_eva_inner"; name = "Engineering Airlock Console"; pixel_y = 25; req_access_txt = "13"; tag_chamber_sensor = "eng_eva_sensor"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor{dir = 5; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance) "cbn" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_inner"; locked = 1; name = "Engineering EVA Internal Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engine_eva_maintenance) -"cbo" = (/obj/machinery/airlock_sensor{command = "cycle_interior"; frequency = 1379; id_tag = "eng_eva_int_sensor"; master_tag = "eng_eva_airlock"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance) +"cbo" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance) "cbp" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance) "cbq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance) "cbr" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief) @@ -5675,7 +5675,7 @@ "cfg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cfh" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cfi" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cfj" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cfj" = (/obj/machinery/seed_storage/xenobotany,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cfk" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cfl" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cfm" = (/obj/machinery/botany/editor,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) @@ -5923,8 +5923,8 @@ "cjU" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor/plating,/area/engine/engine_room) "cjV" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/port) "cjW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cjX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engine_waste) -"cjY" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = null; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engine/engine_waste) +"cjX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engine_waste) +"cjY" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = null; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engine/engine_waste) "cjZ" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/atmos) "cka" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ckb" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) @@ -5934,7 +5934,7 @@ "ckf" = (/obj/structure/table,/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 7; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Surgery Emergency Phone"},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) "ckg" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/surgeryprep) "ckh" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"cki" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = null; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engine/engine_waste) +"cki" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = null; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engine/engine_waste) "ckj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) "ckk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ckl" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) @@ -6123,8 +6123,8 @@ "cnM" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access_txt = "10;24"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/aft) "cnN" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access_txt = "10;24"},/turf/simulated/floor,/area/hallway/primary/aft) "cnO" = (/turf/simulated/wall/r_wall,/area/engine/workshop) -"cnP" = (/obj/machinery/atmospherics/binary/pump{dir = 1; icon_state = "map_on"; use_power = 1},/turf/simulated/floor,/area/atmos) -"cnQ" = (/obj/machinery/atmospherics/binary/pump{icon_state = "map_on"; use_power = 1},/turf/simulated/floor,/area/atmos) +"cnP" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1},/turf/simulated/floor,/area/atmos) +"cnQ" = (/obj/machinery/atmospherics/binary/pump/on,/turf/simulated/floor,/area/atmos) "cnR" = (/turf/simulated/wall/r_wall,/area/engine/storage_hard) "cnS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engineering) "cnT" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) @@ -6389,7 +6389,7 @@ "csS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "csT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engine/workshop) "csU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/atmos) -"csV" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access_txt = "10"},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engine/engine_room) +"csV" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebotc"},/area/engine/engine_room) "csW" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "csX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/atmos) "csY" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engine/engine_room) @@ -6452,7 +6452,7 @@ "cud" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "cue" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/atmos) "cuf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_room) -"cug" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/turf/simulated/floor/plating,/area/engine/engine_room) +"cug" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/engine/engine_room) "cuh" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor,/area/atmos) "cui" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos) "cuj" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engine/engine_room) @@ -6790,6 +6790,7 @@ "cAD" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "cAE" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "cAF" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) +"cAG" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 10; pixel_y = -22},/obj/structure/sign/fire{pixel_x = -32; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cAH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/atmos) "cAI" = (/turf/simulated/wall/r_wall,/area/engine/hallway) "cAJ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access_txt = "10;24"},/turf/simulated/floor,/area/engine/hallway) @@ -6831,12 +6832,16 @@ "cBt" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/atmos) "cBu" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/atmos) "cBv" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/atmos) +"cBw" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cBx" = (/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space) +"cBy" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engine/engine_room) "cBz" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room) "cBA" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_room) "cBB" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "cBC" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "cBD" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "cBE" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) +"cBF" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) "cBG" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/atmos) "cBH" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/engine/engine_room) "cBI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engine/engine_hallway) @@ -6874,6 +6879,14 @@ "cCo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cCp" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/wall/r_wall,/area/atmos) "cCq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/computer/reconstitutor/animal,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology) +"cCr" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) +"cCs" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space) +"cCt" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/wall/r_wall,/area/engine/engine_room) +"cCu" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) +"cCv" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) +"cCw" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space) +"cCx" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) +"cCy" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) "cCz" = (/turf/simulated/wall/r_wall,/area/engine/drone_fabrication) "cCA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/drone_fabrication) "cCB" = (/turf/simulated/wall/r_wall,/area/engine/engine_hallway) @@ -6887,6 +6900,7 @@ "cCJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engine_hallway) "cCK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/engine/engine_hallway) "cCL" = (/obj/structure/sign/securearea,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engine/engine_hallway) +"cCM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/engine/engine_room) "cCN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) "cCO" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "13;11;24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engi_shuttle) "cCP" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) @@ -6894,8 +6908,7 @@ "cCR" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/engineering) "cCS" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engineering) "cCT" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cCU" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 10; pixel_y = -22},/obj/structure/sign/fire{pixel_x = -32; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/binary/pump/on,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cCV" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/binary/pump/on{dir = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cCU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engine/engine_room) "cCW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating/airless,/area/space) "cCX" = (/turf/simulated/floor/plating/airless,/area/maintenance/medbay) "cCY" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) @@ -7034,7 +7047,6 @@ "cFP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cFQ" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cFR" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFS" = (/obj/machinery/atmospherics/pipe/cap/visible{color = "#00ffff"; dir = 8},/turf/simulated/floor/plating,/area/engine/engine_room) "cFT" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Aft Port Solar"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cFU" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/engine/drone_fabrication) "cFV" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) @@ -7085,7 +7097,6 @@ "cHh" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/atmos) "cHi" = (/obj/machinery/light_switch{pixel_x = 12; pixel_y = 25},/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/turf/simulated/floor/plating,/area/engine/engine_room) "cHj" = (/turf/simulated/floor/plating,/area/engine/engine_room) -"cHk" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engine/engine_room) "cHl" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos) "cHn" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cHp" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) @@ -7103,7 +7114,6 @@ "cHE" = (/obj/machinery/atmospherics/valve/digital/open{name = "Oxygen Outlet Valve"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/atmos) "cHF" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/atmos) "cHH" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access_txt = "24"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/atmos) -"cHI" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating{icon_state = "platebotc"},/area/engine/engine_room) "cHK" = (/obj/item/stack/rods{amount = 10},/turf/space,/area/space) "cHL" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/purple,/turf/simulated/floor/plating,/area/engine/engine_waste) "cHM" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/engine_waste) @@ -7117,8 +7127,6 @@ "cHW" = (/obj/machinery/atmospherics/pipe/manifold/visible/green,/turf/simulated/floor,/area/atmos) "cHX" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/atmos_monitoring) "cHY" = (/obj/machinery/computer/security/engineering{network = list("Engineering","Power Alarms","Atmosphere Alarms","Fire Alarms","Atmospherics")},/turf/simulated/floor,/area/engine/atmos_monitoring) -"cHZ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engine_room) -"cIa" = (/obj/machinery/atmospherics/unary/freezer{dir = 8; icon_state = "freezer"; req_access_txt = "56"; set_temperature = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room) "cIb" = (/obj/structure/lattice,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space) "cIc" = (/obj/item/stack/cable_coil,/turf/space,/area/space) "cIe" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engine/engine_waste) @@ -7133,7 +7141,6 @@ "cIn" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/atmos) "cIo" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating,/area/engine/engine_room) "cIp" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/atmos) -"cIq" = (/obj/machinery/atmospherics/unary/freezer{dir = 8; icon_state = "freezer"; req_access_txt = "56"; set_temperature = 1},/turf/simulated/floor/plating,/area/engine/engine_room) "cIr" = (/turf/simulated/wall/r_wall,/area/engine/engine_waste) "cIs" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/engine/engine_waste) "cIt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/engine_waste) @@ -7153,7 +7160,6 @@ "cIN" = (/obj/machinery/camera{c_tag = "Engineering Core West"; dir = 8; network = list("SS13","Supermatter")},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engine_room) "cIQ" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engine/engine_room) "cIR" = (/obj/machinery/camera{c_tag = "Engineering Core East"; dir = 4; network = list("SS13","Supermatter")},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room) -"cIS" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engine/engine_room) "cIU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) @@ -7219,7 +7225,6 @@ "cKB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/space,/area/space) "cKU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engine/engine_room) "cKV" = (/obj/machinery/door_control{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Room Blast Doors"; pixel_x = 5; pixel_y = -25; req_access_txt = "10"},/obj/machinery/door_control{desc = "A remote control-switch for the engine charging port."; id = "EngineEmitterPort"; name = "Engine Charging Port"; pixel_x = -5; pixel_y = -25; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engine/engine_room) -"cKX" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engine/engine_room) "cKY" = (/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engine/engine_room) "cKZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engine/engine_room) "cLa" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_waste) @@ -7304,35 +7309,35 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxafyafzafAafBafAafCafDadxafEafFacQafhacQafGafHafIafJafKafLadlafMafNafOafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTageagdagfaggaghaeFagiagjagkaglagmagnagoagpagqagragsagtaguagpagvagwagxabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDarCaaTagFagGagHagIagJaeFagKagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahiahjahkahlahmahnahnahnahnaddahoahpahqahrahsahtahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahiahjbmdantaojahnahnahnahnaddahoahpahqahrahsahtahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfahBadEagWahCahDahEahFahGahHagDagZahIahFahJahKahLahLahMahNahOahPacXacXacEacXahQahRahSacQacQacQaddahTahUahVahWahXahYahZaiaaibagvahxaicabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaifabfaigadEagWaihaiiaijaikailaimagDagZahIainagWaioahLaipaiqahKahOairaisacXaitacXacXaiuacZahSacQacQaddaiwaixaiyagPagPaizagPagPaiAagvaiBaiCactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaahzaaaaaaahzahzahzahzahzahzahzaaaaaaahzaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiEaiFaiGaiHaiIahFagDaiJaiKaiLagWaiMaiNaiOaiOaiPaiQaiRaiSaiTacEaiUaiVaeFaiWaiXaiYaiZajaajbajcajdajeajfajgajhagPajiagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajjabfabfajkajlagWagWajmagWagWajnagWagWagWajoagWagWajpajqajrajsajtajuagWajvajwajxajyajqagWagWajzajAajBagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHajIajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeakfakgajzakhakiakjakkaklakmaknakoakpalaakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzakAakBakCakDakEakFakwakGakwakwakHakIakJakKakLakMakNakOakPakJakQakRakSakTakUakVakWakXakYakoalIabbamsalbactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaifabfaigadEagWaihaiiaijaikailaimagDagZahIainagWaioahLaipaiqahKahOajraisacXaitacXacXaiuacZahSacQacQaddaiwaixaiyagPagPaizagPagPaiAagvaiBaiCactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaahzaaaaaaahzahzahzahzahzahzahzaaaaaaahzaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiEaiFaiGaiHaiIahFagDaiJaiKaiLagWaiMaiNaiOaiOaiPaiQaiSaiRaiTacEaiUaiVaeFaiWaiXaiYaiZakNakfajcajdajeajfajgajhagPajiagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajjabfabfajkajlagWagWajmagWagWajnagWagWagWajoagWagWajpahkahlahmairajuagWajvajwajxajyajqagWagWajzajAajBagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHajIajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeajbakgajzakhakiakjakkaklakmaknakoakpalaakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzakAakBakCakDakEakFakwakGakwakwakHakIakJakKakLakMajaakOakPakJakQakRakSakTakUakVakWakXakYakoalIabbamsalbactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalealfagWalgalhahLalialjagWacTacuacTagWabValnabUagWalpalqalralsagDaltalualvalwalxagWabTabSabSabRagWalBalCalDalEalFalGalHakoamtanQamuanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabQaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabPalMalMalNalOalPalQalRahKalSaljagWalTalUalValWalXalYalZamaahKambahKamcamdameameamfamgamhamiamjamkamlammakoamnamoampamqalDalDamrakoadQanQamvawKamwaaaaaaamxaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamAamBamCamDagWamEalRaljamFamGagWamHamIamJalWamKamLamMamNamOamPamQamRamSamgamgamfamgamTaoWamVamWamXamYakoamZanaalDamqalDalDanbakoancandaneanfangaafamxaafaafamxaafaafaafakrakranhakrakraaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfankagWagWagWagWanlanmannanoanmanmanmanmanpaoPanpanraoQantaoRanvaoSaoTaoUanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOanPawLanRanSaaaaaaaafaaaaafamxaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaobaocagWaodaoealKaogaohaoiaojaokaolaomaonaooaonaopaoqaoraonaoOaotamgamgaouaovaowamiaoxanEamXaoyanGaozaoAaoBaoCaoDaoEaoFanGaoGanQanQanQanQaoIaoJaoHaoKaoLaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabPalMalMalNalOalPalQalRahKalSaljagWalTalUalValWalXalYalZamaahKambahKamcamdameameamfamgamhamiamjamkamlammakoamnamoampamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamAamBamCamDagWamEalRaljamFamGagWamHamIamJalWamKamLamMamNamOamPamQamRamSamgamgamfamgamTaoWamVamWamXamYakoamZanaalDamqalDalDanbakoancandaneanfangaafaaLaafaafaaLaafaafaafakrakranhakrakraaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfankagWagWagWagWanlanmannanoanmanmanmanmanpaoPanpanraoQajtaoRanvaoSaoTaoUanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOanPawLanRanSaaaaaaaafaaaaafaaLaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaobaocagWaodaoealKaogaohaoiajsaokaolaomaonaooaonaopaoqaoraonaoOaotamgamgaouaovaowamiaoxanEamXaoyanGaozaoAaoBaoCaoDaoEaoFanGaoGanQanQanQanQaoIaoJaoHaoLarPaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcapdapeapfaofaphapiaoMaonaonapkaplaonapmapnaoraonapoaonaoNapqapramgamfamgamTaosamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapDapEapFapGaoHaoHapHaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaahzahzahzahzaaaaaaahzahzahzahzahzahzahzaaaaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapLapMagWalgapNalKapOapPapQapRaokapSanWapUapVapWapXapYapZaqaanUaqcaqdaovaqeaovaqfaqgaqhaqiaqjaqkanGaqlaqmapyaqnaqoaqpaqoaqqaqraqsapFaqtaquapFaqvaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWaqCalRagWalWalWalWaqDaqEapkaqFaqGaqHaonaqIaqJaqKaqLanyaqNaqOaqPaqQaqRaqSanxaqUaqVaqWamVanGaqXaqYaqZaraarbarcardanGarearfapFaqtaqtapFargaoHarhariarjaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaobarlagWarmarnalKaogaroaoiaokarparqarrarsartaonarualWarvarwarxalLarzarAamUamzamyarEarFarGarHamjanGanGarIanGanGanGanGanGanGarJarKarLarMarMapFarNaoHaoHarOaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamxarPamxaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarQaqBagDarRapcarSarTarUaefapharWaloaonaonarYarZasaasbaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslasmasnasoasoaspaspasqasrassastastasuasvasvaswasxasyaszaqsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLamxaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarQaqBagDarRapcarSarTarUaefapharWaloaonaonarYarZasaasbaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslasmasnasoasoaspaspasqasrassastastasuasvasvaswasxasyaszaqsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAasBasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCarQapbagDapLapMagWasDasEalKapOasFaoiasGasGasHasIaonasJaonasKalWasLasMbgMasOasParAasQasRasSarEasTasUasUasVasWasVasXasYasZasZasZasZasZasZasZasZasZasmataatbatcaoKatdateatfaafatgathathatiathathatjaafaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatratqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHatIatJatKatLatMatNatOatPatPatPatPatPatPatPatPatQatRatRatRatRatRatQatPaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTatUatTatSatVatWatVatSaafatqatXatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhauiaonapnaonasJaqEaujaukaulaumaunauoauparAauqaurausarEatBasZauuaySauvatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauJauwauLatPauMatRatRatRatRatRatQatPaafaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTauOatTauNatVauPatVauNauQauRauSauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWavbavcaonavdaveaveavfavgaveavhaviavjarAavkauravlarEavmasZavnauKauvatCavpavqatFatGauzauAavravsavtatMatNavuavvauGauHauHauJavwavxavyavzatRatRatRatRatRavAatPatPatPaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBavCavDauNavEavFavGauNavHavIavJavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaavQavRavSavTavUavVavWavXanXaaaaaaalWalWalWavYavZawaalWawbawcawdaweawfawgaukawhawiawjawkawlarAawmaurawnarEatBasZawoavoawpatCawravqatFatFatFawsawtawuatFatFatNawvawwauGauHauHauJawxawyawzawAatRatRatRatRatRawBawCawDawEaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaabfxaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPavRawQawRavUawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawXawUawYaxaaxbawZaxdaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxnaxpaxqaxraxsatRatRatRatRatRaxsaxtaxuaxvaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNaxwaxxatSauNaxyaxxatSauNawMauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaxCaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaxGaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaxOaxPaxQaxRaxOaxSasZaxTaxjautatCaxVaxXaxXaxXaxZaxYayaaybaxXavqaydayeayfaygayhayhayhayiavxayjaykatRatRatRatRatRaykaylaxuaxvaaaaaaaaaaafaafaaaaafaaaaaabfyaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoayqayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyayzayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLayNayLayMayLayLayLarAayOayPayQarEaAiasZayRaycaxUatCayUayTayWayVayYayXayYayZayTazaazbazcazdazeazdazdazfazgazhaziazjatRatRatRatRatRazkazlazmaznaaaaaaaaaaaaaafaaaaafaaaazoazpazoaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwazBauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEazFazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazUazVazWazXazYazZaAaaAbazTaAcarAaAdayPayQarEaAiasZaAfaAecfSatCaxWaxXaxXaxXaxXaAjaAkaAlaAmaAnaxkaAoaApaApaApaApaAqavxavxaAraAsatRatRatRatRatRaAtatPatPatPaafaafaafaafaafaafaafaaaaAuaAvaAuaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGaAHaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawXaAgaAhaBbaBcaBdaBeaBfaBgaBhaBiaBjaBjaBkaBjatPaBlaBmaBnaBoaBpaBqaBratPaBsatRatRatRatRatRaBtatPaafaaaaaaaaaaaaaafaafaaaaafaBuaBvaBwaBxaByaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTatUatTatSatVatWatVatSaafatqatXatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhauiaonapnaonasJaqEaujaukaulaumaunauoauparAauqaurausarEatBasZaAfaySauvatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauJauwauLatPauMatRatRatRatRatRatQatPaafaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTauOatTauNatVauPatVauNauQauRauSauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWavbavcaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZawoavoawpatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauJavwavxavyavzatRatRatRatRatRavAatPatPatPaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBavCavDauNavEavFavGauNavHavIavJavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaavQavRavSavTavUavVavWavXanXaaaaaaalWalWalWavYavZawaalWawbawcawdaweawfawgaukawhawiautawkawlarAawmaurawnarEatBasZawXawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNawvawwauGauHauHauJawxawyawzawAatRatRatRatRatRawBawCawDawEaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaabfxaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPavRawQawRavUawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZauKaxjavmatCaxVavnaxdaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxnaxpaxqaxraxsatRatRatRatRatRaxsaxtaxuaxvaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNaxwaxxatSauNaxyaxxatSauNawMauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaxCaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaxGaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaxOaxPaxQaxRaxOavpasZaxSawjcfSatCaxVaxXaxXaxXaxZaxYayaaybaxXavqaydayeayfaygayhayhayhayiavxayjaykatRatRatRatRatRaykaylaxuaxvaaaaaaaaaaafaafaaaaafaaaaaabfyaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoayqayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyayzayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLayNayLayMayLayLayLarAayOayPayQarEaAiasZcfSaycaxUatCayUayTayWayVayYayXayYayZayTazaazbazcazdazeazdazdazfazgazhaziazjatRatRatRatRatRazkazlazmaznaaaaaaaaaaaaaafaaaaafaaaazoazpazoaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwazBauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEazFazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazUazVazWazXazYazZaAaaAbazTaAcarAaAdayPayQarEaAiasZauuaAeauvatCaxWaxXaxXaxXaxXaAjaAkaAlaAmaAnaxkaAoaApaApaApaApaAqavxavxaAraAsatRatRatRatRatRaAtatPatPatPaafaafaafaafaafaafaafaaaaAuaAvaAuaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGaAHaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawXaAgaAhaBbayRaBdaBeaBfaBgaBhaBiaBjaBjaBkaBjatPaBlaBmaBnaBoaBpaBqaBratPaBsatRatRatRatRatRaBtatPaafaaaaaaaaaaaaaafaafaaaaafaBuaBvaBwaBxaByaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaBEaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaBOaBPaAFaBQaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaCeaCfaCgaChaCfaCiaCjazTaCkarAaAdayPaClarEaJCasZaAZaAYaBaatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaCtatPatPatPaBtatRatRatRatRatRaBtatPaaaaaaaaaaacaaaaafaaaaaaaaaaCvaCwaCxaCyaCvaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaCHaCIaCJaAFaCKaCLaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaDcayLayLayLarAaAdayPayQarEaAiasZaxTaJDauvatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaDnaDoaDpaDqaGwaDsaafaDtaDuaDuaDuaDuaDuaDvaafaaaaaaaaaaaaaaaaafaaaaaaaaaaCvaDzaDAaDBaCvaafaaaaaaaDCaDCaDCaDCaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaCHaCIaCJaAFaCKaCLaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaDcayLayLayLarAaAdayPayQarEaAiasZaxTaBcauvatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaDnaDoaDpaDqaGwaDsaafaDtaDuaDuaDuaDuaDuaDvaafaaaaaaaaaaaaaaaaafaaaaaaaaaaCvaDzaDAaDBaCvaafaaaaaaaDCaDCaDCaDCaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaxAaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFaDYaDZaCMaEaaEbaEcaEdaEeaEfaEgaEhaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaEvaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaEMaEKaENaEOaBjaEPaEQaERaESaETaCnaDsaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaCvaEXaEYaEZaCvaFaaFbaDCaDCaFcaFdaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaFhaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkaFlaFlaFmaFnaFoaFpaFqaFlaFlaFraFsaFtaDPayuaBLaFvayxaBMazCaBMaBNaCDavHaFuaDQaFxaFwaFzaFyaFIaFJaFKaFLaFLaFLaFMaFLaFLaFNaFOaCMaaaaBYaFPaElaFQaEnaFRaBYaaaazJazOazPaFSaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYaFZazTaGaarAaGbaGcaGdarEaAiaDeaDfaDraCoaDeaCpaGjaGkaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaGqaDpaGraGsaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaCvaCvaGxaGyaCvaGzaGAaGBaFdaGCaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaGHaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaGJaGKaFlaGLaFlaGLaFlaGLaFlaGLaFlaGMaGNaGOaDPayuaBLaGPaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaFEaFCaHcaFLaFLaFLaFLaFLaFLaFLaFNaHdaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaHkaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaDyaEUaGvaDwaDxaEVaEWatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaHIaDpaHJaHKaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDsaHRaHSaHTaHUaIaaIbaDCaDCaIcaDCaIdaIeaIfaIgaGFaIhaGFaIiaIjaIkaIlbinaInaIoaIpaIqaIraIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa @@ -7354,10 +7359,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObguaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbdKbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGbgHbgIbgJaMbbgKbgLbctaWKbgNbgObgPbgQbgQbgRbgSbgTbdYbebbgUbgVbgWbgXbfvbgYbgZbebbedbhabhbbhcbhdbhebhfbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhCbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIbhJbhKbhLbhMbhNaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbhRbhSbhTbhTbhTbhTbhTbhUbhVbhWbhXbhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbdKbibbicbidaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGbilaMbbimaSzbctaSIbiobipbiqbirbisbitbiubivbdYbebbiwbixbiybiybiybgYbizbebbedbiAbiBbiCbiDbiEbiFbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjqbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbjubjvbjuaTSaTSaTSaTSbjwaTSbjxbdObdPbjybjzbgDbjAbjBbdPbfibfmbjCbgGbgGbgGbjDaMbbjEaSzbctcdNbjGbgObjHbjIbjJbjKbjLbjMbdYbjNbjObjPbiybjQbiybgVbjRbjSbedbjTbjUbjVbjWbjWbjWbjXbjYaJibjZbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkkbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktbkubkvbewbkpbkwbkxbkybhFbewbewbkzbewbewbkAbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGbkHbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObkKbkLbkMbkNbkObgrbkPbkQbkRbkRbkSbkTbkUbkVbkWbkWbkXbkYbbZbbZbbZbeZbkZbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbllbfmblmbgGblnbgGbloblpblqaSzbctaJeblrblsbltblublvblwblxblybdYbebblzblAblCblBblDblAblEbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzblTaZzaZzaZzaZzaZzaZzaVIaZzbewbewblVblWblWblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbmdaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObkKbkLbkMbkNbkObgrbkPbkQbkRbkRbkSbkTbkUbkVbkWbkWbkXbkYbbZbbZbbZbeZbkZbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbllbfmblmbgGblnbgGbloblpblqaSzbctaJeblrblsbltblublvblwblxblybdYbebblzblAblCblBblDblAblEbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzblTaZzaZzaZzaZzaZzaZzaVIaZzbewbewblVblWblWblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbqKaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpaVAbmjbmkbmkbmlbbZbdDbmmbeZbmnbbZbmobmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbmxbfgbmybmzblfbmAbfmbmBbgGbgGbmCbmDbmEblqaSzbmFbmGbmGbmGbmGbmGbmGbmGbmHbmGbdYbebbmIbmJbmKbmLbmKbmMbmNbebbedbedbmObmPbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbmUbmVbmWbmXbmYbmZbnabnbbncbndbnebncbnfbngbnhbnibnjbnkbnlbnmbnnbnobnpbnqbnrbnsbntbntbnubYfaVJblOblObZLblObZMbZMblObnzbnAbnBblObZtbZubZtblOblXblYbmbblObZnbZBbZnblObnGbnHbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaabnNbnObnPbeQbnQbgrbnRbjpbnSbnTbnUbnVbjpbnWbnXbnYbnZbmlbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbohboibojbgGbgGbgGbokblpblqaSzbolbmGbombonboobcEbvGbotbosbotaafbebboubovbowboxboybozboAbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJboKboLboMboNbYwboPboQboRboRboSboTboUboUboVboWboXboYboZbpabpbbnnbpcbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbpmbpnbpobppbpqbprbpqbpsbptbpubpvblOaZzbpwbpxblObpybpzbpAbpBbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbpLbgrbpMbpNbpObpPbpQbpRbpSaYSaXeaXeaXebpTbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPbpZbqabqbbqcbqdbqebqfbqgbqhbqibqjbqkbmAbqlbojbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbopbxsbotaafbebbebbebbebceebebbebbebbebaafbedbqzboCbqAbqBbqCbqDbqEaJibqFaRqaRpaJibqGbqHbqIbqJbqKbqLbqMbqNboUboUboUboUboUboUbqObqPbqQboYbqRbqSbqTbnnbqUbqVbqWbpfbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbrcbrdbrdbrdbrebrdbrfbrgbrhbribrjbrkbnIbrlbpCbrmbrnbrobrpbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbpLbgrbpMbpNbpObpPbpQbpRbpSaYSaXeaXeaXebpTbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPbpZbqabqbbqcbqdbqebqfbqgbqhbqibqjbqkbmAbqlbojbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbopbxsbotaafbebbebbebbebceebebbebbebbebaafbedbqzboCbqAbqBbqCbqDbqEaJibqFaRqaRpaJibqGbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbqQboYbqRbqSbqTbnnbqUbqVbqWbpfbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbrcbrdbrdbrdbrebrdbrfbrgbrhbribrjbrkbnIbrlbpCbrmbrnbrobrpbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbrubrvbrwbrxbrxbrybrzbrAbgrcedbrCbpPbrDbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbrIbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabsebscbotbosbotaafbsibsjbskbslbsmbsnbskbsobsiaafbedbspbsqbspbedbedbedbsraJibssaRqaRpbXHboJboKbstbsubsvbqLbswbqNbsxbsybszbsAbsBbsCbqObsDbnibsEbsFbsGbsHbnnbsIbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNbsObsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtcbtdbnIbrqbpFbtebnMaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbthbtibtibtibtjbtibtibgrbtkbtlbtmbpPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubtvbtwbtxbtybtzbtAbfmbfmbtBbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbtIbmGaafbtJbtKbtLbtMbtNbtMbtLbtObtPaafbspbtQbtRbtSbtTbtUbspbtVaJlbtWbbmbtXaJibtYbmUbtZbuabubbucbudbuebufbugbuhbuibujbukbulbumbnibnnbunbuobupbnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbuxbplbplbsMbuybuzbuAbuBbuCbuDbuEbuFbuGbrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbuNbnIbpEbpFbuObnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuTbeObuUbuUbuVbpHbuWbgnbgobuXbuWbgrbuYbuZbvabvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibvjbvkbvlbvmbvnbvobfmbvpbgGbvqbvrbvsbvtbvubvvbmGbmGbmGbvxbvybvzbvAbvBbvwaafbvDbvIbvHbvJbvKbvMbvNbvObvLaafbspbvPbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbvYbvZbuccdTcdUbwcbwdbwebwebwfbwgcdWcdVbwjbwkbwlbwmbwkbwkbwkbwkbwnbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbwubwvbwwbwxbwybnIbwzbwAbwBbwCbpCbwDbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbwGbwHbwIbwJbwJbwKbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7405,26 +7410,26 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpucymcpucpucpucyocpucpucpucyocpucpucpucpucpucrRcpucywcpucyncvpcpucpucylcykcuhcyjcoCctdcoCcoCcpucyiczBcxCcyGcoQcxDcoQcnOckYczEczFczGczHcoXcnOczIczJczJczKczLczMczNczOcvNcxNczPczQcxNczRczSczTcvNczUczVcrGaaaaaaaaaaaaaaaaaacqvczWcuMczXcuVczYczZcAactFcAbcAccsPcyXczWcAdcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgcAhcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacyhaaaaaacyhaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaacyhaaaaaacyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaacyxcpucymcpucqKcqMcyucqMcuacqMcyucqMcuacqMcqMcqMcyqcytcyqcyscyrcuhcyBcyCcACcADcAEcAFcoCclacnzcoCcoCcoCcoCcoCcAIcAJcAKcAJcnOcnOcnOcnOcnOcnOcnOcnOcALczJczJcAMcANcAObPxcAPcvNcAQcARcAScATcAUcAVcAWcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBecBfcBgcBhcBicBjcqvaafaafaaaaaaaaaaaabquaaacdOcBlcBmcBncBocBpcBmcBqcBrcBpcBmcBscdOaaaaaabZSaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacyhcyhcyhcyhaaacyhcyhcyhcyhcyhcyhcyhcyhcyhaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaaaaaaaaaaaaaamaaaaaaaaacyDcpucymcpucywcwscymcpucywcwscymcpucywcwscpucpucyvcpucywcwscyEczfczhczecBBcBCcBDcBEcoCcyFcBGcvqcBIcBJcBKcBLcBMcBKcBNcBKcBOcBPcBQcBRcBScBScBTcBUcBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcCccCbcCacCdcvNcrGcCecrGaaaaaaaaaaaaaaaaaacqvctFcCfcuVctFcCgcChcCictFcCjcCkcqycgvcCmcCncCocrHaaaaaaaaaaaaaaaaaacgwaafcdOcCqcluclUcomclsclpclqcomcloclVclWcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacyhcyhcyhcyhaaacyhcyhcyhcyhcyhcyhcyhcyhcyhaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaafaamaafaafaafcyDczwczAczyczgczsczqczpczkcznczmczlczoczscpuczwczvczuczrczncztcoCcoCcoCcCzcCzcCzcCzcCzcvrcCzcCBcCCcCDcCEcCFcCEcCEcCGcCEcCEcCHcCEcCDcCIcCJcCKcCLciCcCNcCOcCPcCQcAObPwcCRcCScCTcCacCUcAVcCVcCacCWaafcCXcCYcCXaaaaaaaaaaaaaaaaaacqvcCZctDcuQcDacDbcuQcDccDdcDeaafaaachxchFchEclXaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacyhcyhcyhcyhaaacyhcyhcyhcyhcyhcyhcyhcyhcyhaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaafaamaafaafaafcyDczwczAczyczgczsczqczpczkcznczmczlczoczscpuczwczvczuczrczncztcoCcoCcoCcCzcCzcCzcCzcCzcvrcCzcCBcCCcCDcCEcCFcCEcCEcCGcCEcCEcCHcCEcCDcCIcCJcCKcCLciCcCNcCOcCPcCQcAObPwcCRcCScCTcCacAGcAVcBwcCacCWaafcCXcCYcCXaaaaaaaaaaaaaaaaaacqvcCZctDcuQcDacDbcuQcDccDdcDeaafaaachxchFchEclXaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacyhcyhcyhcyhaaacyhcyhcyhcyhcyhcyhcyhcyhcyhaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcpFaaaaaaaaaaamaaaaaaaaacAzcAvcAwcAxcAycABcAAcAHcAycABcAAcAHcAycABcBucBucBvcAHcAycABcBtcoCaaacDvcDwcDxcDycDzcDAcAucDCcDDcDDcDEcDFcDGcDHcDIcDJcDHcDIcDGcDKcDLcDMcDKcCBcCBcAOcDNcDOcDPcDQcAObNUcDRcDScDTcCacCbcDUcCbcCacCWaafaaaaafaaaaaaaaaaaaaaaaaaaaacqvcCZcDVcDWcDXcDXcDWcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcClcqLcqLcqLcpEcpIcpIcpIcqLcpIcpPcpIcpGcpIcpPcpIcpGcpIcpPcpIcpGcpIcqLcpIcpRcpIcpGcpIcqNaafaaacEicEjcEkcElcEmcEncAucEocDDcEpcEqcErcEscEtcEucEvcEwcExcEscEycEzcEAcDKaaaaafcAOcEBcECcEDaafaaabNUbPxbPxbSkcCaclZcEFclYcCacCWaafaafaaaaaaaaaaaaaaaaaaaaaaaacqvcEHcuXcEIcEJcEJcEIcuQcEKcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcplcplcplcomcELcplcplcomcELcplcplcdOaacaaacrPaaaaaaaafaafaafaaaaaacmTaafaaaaaaaafaafaaaaaacrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaaaaqaaaaaaaaaaafcgRcCpcmtcmvcgRcCpcmtcmvcgRcCpcmtcmxcgRaaacgRcmycmtcmxcgRaaaaafaaacEicEQcERcEScEQcCAcDBcEUcDDcEVcEWcEXcEscEYcEZcFacFbcFccEscFdcFecFfcDKaaaaaacAOcFgcFhcFiaaaaaabNUbPxbPxbNUcCacmUcmUcmUcCacFkcmWaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcFmcFncuQcuQcuQcuQcuQcFocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcmYcmYcmYckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacmZaaaaaaaaacrPcrPcrPbZScrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaaaamaaaaaaaaaaafcgRcgCcDkcgBcgRcjbcDncjacgRciWcDqchqcgRaafcgRchpcDtchocgRaaaaafaaacEicFrcEkcEQcEQcqZcqXcFucFvcFwcFxcFycFzcFAcFBcFCcFDcFEcFFcFGcFHcFIcDKaafaaacFJcDNcFKcAOcFLaaabNUcFMbPxcFNcFOaafaafaafaaacBkaafaafaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcFPcFQcEIcEIcEIcFRcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqpbqpbqpaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcfTaafcrPaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaamaaaaaaaafaafcgRcEbcEccEbcgRcEdcEecEdcgRcEfcEgcEfcgRaaacgRcEfcEfcEhcgRaaaaafaaacEicFUcEkcEScEQcEncrVcEocDDcFWcFXcFYcEscFZcGacGbcGacGccEscGdcGecGfcDKaaLcGgcGgcGgcGgcGgcGgcGgbNUciEciDcGjaafaaaaaaaafcGkcDfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGlcEJcEJcEJcEJcEJcGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaafaamaaaaafaafaaacgRcEbcENcEbcgRcEdcEOcEdcgRcEfcEPcEfcgRaafcgRcEfcEfcEfcgRaafaafaafcGncGocGpcGqcGrcGscsacEocDDcoycGvcGwcEscGxcpwcoJcpxcGBcEscGCcGDcGEcDKaaacGgcGgcGgcGgcGgcGgcGgcGFcGGcGHbNUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZSaaaaaacgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRaaacFqcgRcgRcgRcgRaaaaaaaaaaaacCzcCzcCzcCzcCzcsccGJcGJcGJcGJcGKcGJcjIcjdcjecjdcjccGJcGJcGPcGJcGJcGJcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGTcGUcsecsfcsgcshcGZcpzcpycpCcpAcqIcHfcsZcsYctacHgcHicHjcHkcsVcHIcGJcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGTcHLctfcHtctecjTcjUctkcjJcucctZcHzcIwcHjctccHjcHjcHjcHjcugcHZcIacGJcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGTcHLcHMcHNcjXcjYcjUcwpcwocwqcufcHjcHjcxocwucyAcHjcHjcHjcugcHZcIqcGJcIbaafaaIaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGTcwmcIecIfcrQckickrcBzckecBHcBAcnycnycpDcImcEMcIocIocIocpBcHZcFScGJaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIrcGVcIscItcIucLacGZcIwcHjcFscETcKYcLbcvocIycKUcKVcKYcKZcKXcHZcFScGJaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcIMcILcGJcHjcHjcINcGJcGJcGJcujczDcIQcGJcGJcGJcIRcIScHzcGJaafaaabZSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcFTcJacJbcJcciFcJecJfcJgcJecGJcJhcHjcJicxscJkcJlczzcJnczjcJlcJpcxscJqcHjcJrcGJaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcydcxzcxycxxcxxcxxcxxcxxcxxcxxcxxcxxcxxcxxczicxzcxzcxzcypcJzcJAcJBcJCcJDcJEcJFcJGcJHcJHcJHcJIcJJcJKcGJcHjcHjcJicxscJkcJLcJMcJNcJOcJLcJpcxscJqcHjcJPcGJaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcxfaafaaaaafcxfaafaaaaafcxfaafaaaaaaaaaaaaaaacIUcIVcJRcJScJTcJUcIKcJVcJWcJecJecJXcJXcJYcGJcHjcHjcJZcxscJkcKacJMcKbcKccKacJpcxscKdcHjcHjcGJaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafcKfcIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGJcGJcGZcGJcGJcGJcGJcGJcwDcGJcGJcGJcGJcGJcGZcGJcGJaafaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHncwrcHpaafcHncwrcHpaaacHncwrcHpaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaLaaaaafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZSaaaaaacgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRcgRaaacFqcgRcgRcgRcgRaaaaaaaaaaaacCzcCzcCzcCzcCzcsccGJcGJcGJcGJcGKcGJcjIcjdcjecjdcjccGJcGJcGPcGJcGJcGJcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGTcGUcsecsfcsgcshcGZcpzcpycpCcpAcqIcHfcsZcsYctacHgcHicHjcHjbqMcsVcGJcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGTcHLctfcHtctecjTcjUctkcjJcucctZcHzcIwcHjctccHjcHjcHjcHjcHjcHjcugcGJcGgcGgcGgcGgcGgcGgcGgaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGTcHLcHMcHNcjXcjYcjUcwpcwocwqcufcHjcHjcxocwucyAcHjcHjcHjcHjcHjcBycGJcIbaafaaIaafaafaafaafaafaafaafaafaafcBxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGTcwmcIecIfcrQckickrcBzckecBHcBAcnycnycpDcImcEMcIocIocIocIocIocpBcCtcCscCrcCrcCrcCrcCrcCrcCrcCrcCrcBFaaacBxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIrcGVcIscItcIucLacGZcIwcHjcFscETcKYcLbcvocIycKUcKVcKYcKZcCUcHjcCMcCtcCscBFcCycBFcCycBFcCycBFcCycBFcCxaafcBxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcIMcILcGJcHjcHjcINcGJcGJcGJcujczDcIQcGJcGJcGJcIRcHjcHjcGJaaacCxcCxcCxcCxcCxcCxcCxcCxcCxcCxaafcBxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcFTcJacJbcJcciFcJecJfcJgcJecGJcJhcHjcJicxscJkcJlczzcJnczjcJlcJpcxscJqcHjcJrcGJaaacCxcCxcCxcCxcCxcCxcCxcCxcCxcCxaaaaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcydcxzcxycxxcxxcxxcxxcxxcxxcxxcxxcxxcxxcxxczicxzcxzcxzcypcJzcJAcJBcJCcJDcJEcJFcJGcJHcJHcJHcJIcJJcJKcGJcHjcHjcJicxscJkcJLcJMcJNcJOcJLcJpcxscJqcHjcJPcGJaaacCxcCxcCxcCxcCxcCxcCxcCxcCxcCxaafcBxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcxfaafaaaaafcxfaafaaaaafcxfaafaaaaaaaaaaaaaaacIUcIVcJRcJScJTcJUcIKcJVcJWcJecJecJXcJXcJYcGJcHjcHjcJZcxscJkcKacJMcKbcKccKacJpcxscKdcHjcHjcGJaaacCxcCxcCxcCxcCxcCxcCxcCxcCxcCxaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafcKfcIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGJcGJcGZcGJcGJcGJcGJcGJcwDcGJcGJcGJcGJcGJcGZcGJcGJaafcCwcCvcCwcCvcCwcCvcCwcCvcCwcCvaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHncwrcHpaafcHncwrcHpaaacHncwrcHpaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaLaaaaafaaaaaacBxcBxcBxcCucBxcBxaancBxcBxaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaafcHncwrcHpaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIbZSbZSaaIaaIaaaaaaaaaaaIaaIaaIaaIaaIaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaafcHncwncHpaaacHncwncHpaaacHncwncHpaafaaIaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaIaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index a9301e064d..28724abc1a 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -748,7 +748,7 @@ "ot" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) "ou" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "ov" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"ow" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs{pixel_x = 4; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"ow" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs{pixel_x = 4; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "ox" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oy" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oz" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -1050,7 +1050,7 @@ "uj" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "uk" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "ul" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/rig/ert/security,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) -"um" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) +"um" = (/obj/structure/table/rack,/obj/item/rig_module/mounted,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "un" = (/obj/structure/table/reinforced,/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "uo" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "up" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -1194,11 +1194,11 @@ "wX" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom) "wY" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom) "wZ" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) -"xa" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) +"xa" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "xb" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "xc" = (/obj/machinery/door/airlock/centcom{name = "Armory Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "xd" = (/obj/machinery/door/airlock/centcom{name = "Engineering Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) -"xe" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; use_power = 0; req_one_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"xe" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; on = 0; req_one_access = list(103); req_one_access_txt = "103"; use_power = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "xf" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "xg" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) "xh" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) @@ -1237,7 +1237,7 @@ "xO" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "xP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "xQ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"xR" = (/turf/unsimulated/floor{dir = 6; icon_state = "asteroid8"; name = "sand"},/area/centcom/specops) +"xR" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/turf/unsimulated/floor{dir = 6; icon_state = "asteroid8"; name = "sand"},/area/centcom/specops) "xS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) "xU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) @@ -1288,13 +1288,13 @@ "yN" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "yO" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "yP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) -"yQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/obj/item/device/flash,/obj/item/device/flash,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"yQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/gun/energy/stunrevolver,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "yR" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yS" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; listening = 0; name = "Station Intercom (General)"; pixel_x = -28},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "yT" = (/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) "yU" = (/obj/structure/closet/secure_closet/injection,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "yV" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) -"yW" = (/obj/structure/table/reinforced,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) +"yW" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) "yX" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "yY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "103"; tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "yZ" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) @@ -1306,10 +1306,10 @@ "zf" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "zg" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/flash,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flash,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "zh" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) -"zi" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"zi" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "zj" = (/obj/structure/table/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) "zk" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/pillbottles,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) -"zl" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) +"zl" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "zm" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "zn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_door"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom) "zo" = (/obj/structure/table/woodentable{dir = 9},/obj/item/weapon/reagent_containers/food/drinks/flask,/obj/item/clothing/mask/cigarette/cigar/havana,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) @@ -1882,9 +1882,9 @@ "Kj" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station) "Kk" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "Kl" = (/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) -"Km" = (/turf/unsimulated/floor{tag = "icon-asteroid8"; name = "plating"; icon_state = "asteroid8"},/area/wizard_station) -"Kn" = (/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) -"Ko" = (/turf/unsimulated/floor{tag = "icon-asteroid5"; name = "plating"; icon_state = "asteroid5"},/area/wizard_station) +"Km" = (/turf/unsimulated/floor{tag = "icon-ironsand8"; icon_state = "ironsand8"},/turf/unsimulated/floor{tag = "icon-asteroid8"; name = "plating"; icon_state = "asteroid8"},/area/wizard_station) +"Kn" = (/turf/unsimulated/floor{tag = "icon-ironsand11"; icon_state = "ironsand11"},/turf/unsimulated/floor{tag = "icon-asteroid5"; name = "plating"; icon_state = "asteroid5"},/area/wizard_station) +"Ko" = (/turf/unsimulated/floor{tag = "icon-ironsand7"; icon_state = "ironsand7"},/mob/living/simple_animal/crab{name = "Experiment 68a"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) "Kp" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kq" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kr" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) @@ -1902,7 +1902,7 @@ "KD" = (/obj/machinery/optable,/obj/item/organ/brain,/obj/structure/window/basic{dir = 1},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station) "KE" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "KF" = (/obj/effect/landmark{name = "Holocarp Spawn Random"},/turf/simulated/floor/holofloor{icon_state = "1"; dir = 5},/area/holodeck/source_space) -"KG" = (/mob/living/simple_animal/hostile/tribesman{name = "Experiment 69T"},/turf/unsimulated/floor{tag = "icon-asteroid2"; name = "plating"; icon_state = "asteroid2"},/area/wizard_station) +"KG" = (/turf/unsimulated/floor{tag = "icon-ironsand14"; icon_state = "ironsand14"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) "KH" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "KI" = (/mob/living/simple_animal/hostile/retaliate/goat{name = "Experiment 97d"},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "KJ" = (/obj/item/weapon/caution,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) @@ -1927,7 +1927,7 @@ "Lc" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/vox/station) "Ld" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox/station) "Le" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station) -"Lf" = (/obj/machinery/porta_turret{anchored = 1; check_records = 0; use_power = 0; req_one_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"Lf" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom) "Lg" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/rcd,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/injector,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "Lh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station) "Li" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station) @@ -1942,12 +1942,12 @@ "Lr" = (/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station) "Ls" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station) "Lt" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station) -"Lu" = (/obj/structure/jungle_plant,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station) -"Lv" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"Lu" = (/turf/unsimulated/floor{tag = "icon-ironsand7"; icon_state = "ironsand7"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) +"Lv" = (/turf/unsimulated/floor{tag = "icon-ironsand12"; icon_state = "ironsand12"},/turf/unsimulated/floor{tag = "icon-asteroid2"; name = "plating"; icon_state = "asteroid2"},/area/wizard_station) "Lw" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 0; req_access = null; req_access_txt = "150"},/obj/item/weapon/surgicaldrill,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) "Lx" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "Ly" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) - + (1,1,1) = {" aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaQ ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZabatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbrbsbtbsbtbsbrbubqbqbqbqbrbwbwbwbwbwbrbxbxbxbxbxbraMaMaMaMaMbrbybzbzbzbAbB @@ -2083,17 +2083,17 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutuuuvuwDUuhtZtZtZtZtDoNuztZtZtZuAoNuBudtwtIudtwuCtJtwtItMtwtNtxuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvcoNvxtZtZtZtZuioNvftZtZtZvgoNubtJvhubtJtwubvitwubvjtwtNtxvktxvlvmvntxufufuftxvlvmvotxvptxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvoNLytZtZtZtZvyoNvztZtZvAoNoNoNtvtvtvtvtvtvtvtvtvtvtvtNtxufufvBvCvCvCvCvCvCvCvCvCvDufufvEvqvqvqvqvqugvFuNuotxurururtxvGvGvHvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvJoNukujulLvtZoNoNumtZtZvOoNuyvQoNvRvRvRvRvRvRvSvTcZtvtNtxufufvVvWvXvXvXvXvXvXvXvYueufufugvZwawbwcwdugweuNuptxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvJoNukujulumtZoNoNxatZtZvOoNuyvQoNvRvRvRvRvRvRvSvTcZtvtNtxufufvVvWvXvXvXvXvXvXvXvYueufufugvZwawbwcwdugweuNuptxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbwjoNtvoNoNoNtZoNvetZtZtZwloNwmwnwowpwpwpwpwpwpwqtvtvtvtvtvufufvVwrwsufwtwuwvufwswrueufufugugugugugugugweuNuptxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutwxvbwyoNwzwAwBoNtZoNvNvKtZtZwEoNwmvMtvwFwGwGwGwHwGwItvwJwJwJtvufufwKwLwMwNwOwPwQwRwSwLwTufuftxwUwUwUwUwUtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwVoVoVoVoVoVoVoVoVoVoVoVoVoVwhoUoVoVoVqVwhwXwYvMwZoNxatZxboNxcoNoNoNxdoNoNoNwmwnuWxfxfxfxfxfxfxfxgxfxfxfxgufufufxhufufxiufxiufufxhufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwVoVoVoVoVoVoVoVoVoVoVoVoVoVwhoUoVoVoVqVwhwXwYvMwZoNyQtZxboNxcoNoNoNxdoNoNoNwmwnuWxfxfxfxfxfxfxfxgxfxfxfxgufufufxhufufxiufxiufufxhufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMxkoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNxlxmvMxnoNvPuhwkoNtZxqtZxrtZxsxtxttZxutvxvxwxwxxxyxzxAtvxBxBxBtvufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwVoVoVoVoVoVoVoVoVoVoVoVoVoVxHoUoVoVoVqVxHxIxJvMwnxKuhtZtZxLtZxMtZwmwmxNxNwmwmxutvxOxOxOxPxQxPxRtvtvtvtvtvufufvVwLxSufxiufxiufxSwLueufuftxxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxxXxXxXtxtxurururxYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMxkoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNLgyaoNoNoNoNoNyboNycwmydyeyfygwmxutvtvyhyiyjykylymyhaMaMaMtxufufvVtxtxynyoufypyqtxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywyxtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNyzyAxowDtZoNLfwmydyfyfygwmxpyEyFyhyGyHyIyByKyhaMaMaMtxufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMxkoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNLgyaoNoNoNoNoNyboNycwmydyeyWygwmxutvtvyhyiyjykylymyhaMaMaMtxufufvVtxtxynyoufypyqtxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywyxtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNyzyAxowDtZoNxewmydyfyfygwmxpyEyFyhyGyHyIyByKyhaMaMaMtxufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzitZtZtZtZtZtZoNxetZtZwqwqwmwmwmwmyRyhySyIyIyIyIyhaMaMaMtxufufwKyTyTyTyTyTyTyTyTyTwTufuftxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNyQtZtZtZtZtZyWoNyXtZtZyYtZtZwCvdyJzcyhyIyIyIyIzdyhtxtxtxtxtxtxzetxtxufufufufuftxtxtxtxtxtxaMaMaMaMaMtxzfystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzgzgzhyDyZzkzloNyXzmzmoNznznoNoNoNoNyhyIzozpzqzryhzsztztzszuzvufzwtxtxtxzxtxtxdCaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzltZtZtZtZtZLfoNyXtZtZyYtZtZwCvdyJzcyhyIyIyIyIzdyhtxtxtxtxtxtxzetxtxufufufufuftxtxtxtxtxtxaMaMaMaMaMtxzfystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzgzgzhyDyZxazkoNyXzmzmoNznznoNoNoNoNyhyIzozpzqzryhzsztztzszuzvufzwtxtxtxzxtxtxdCaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNzAzBzBzAaMaMaMyhyIzCzDzEzDyhzszFzFzszGzHufzwtxzIwTufwKzJtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzKururzLzLururzKaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzMzNzNzNzNzOzOzNzNzPaMyhyIyIyIyIyIyhzsztztzszQzHufzwtxueufufufvVtxaMaMaMaMaMaMaMaMaMaMaMzRzSzTzUaMaMaMaMaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYzZAaAbAcAcAdAdzNzPyhyhyhyhyhyhyhzszszszsAezHufzwtxAfuxAfAhAftxaMaMaMaMaMaMaMaMaMaMzRAiAjAkAlzUaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2192,8 +2192,8 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGJHJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuJRJSJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIYJUJVIYIUJbJLJDJBJDJBJDJLJbIUIYJXJYIYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIYJZKaIYIYIYIYIYIYKbIYIYIYIYIYIYKcKdIYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIUJKKiKjKjKjKjKjKjIYKjIYKjKjKjKjKjKjKiJKIUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKnKoJkKpKpKqJkKrKsKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIUJaKvKwKxKyKzIYKbIYKbIYKbIYKAKBKCKDKvJaIUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKnKGKnJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIUJbKvJDJDJDKLIYJDJDJDJDJDIYJDJDKMJDKvJbIUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrKsKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIUJaKvKwKxKyKzIYKbIYKbIYKbIYKAKBKCKDKvJaIUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIUJbKvJDJDJDKLIYJDJDJDJDJDIYJDJDKMJDKvJbIUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMITIYKNKOKPJlHmIYJoJDJDJDKQIYKUKVKWKXKNIYIVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMKYIYKZKZIYIYIYIYKRJDJDJDKSIYIYIYIYKZKZIYLcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMKYLdLdLcaMaMIYKTJDJDJDLaIYaMaMKYLdLdLcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2201,7 +2201,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIYLhLiLjLhLiIYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIYLkLlJDLmLnIYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIYLoLpJDLqLrIYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMKYIYLsLtLuIYLcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMKYIYLsLtJDIYLcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMKYIYIYIYLcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM "} diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm index e88029d54a..ad3f736587 100644 --- a/maps/exodus-3.dmm +++ b/maps/exodus-3.dmm @@ -101,7 +101,7 @@ "bW" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bX" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bY" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"bZ" = (/obj/machinery/power/solar/fake,/turf/simulated/floor{icon_state = "solarpanel"},/area/space) +"bZ" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) "ca" = (/turf/simulated/floor/plating/airless,/area/space) "cb" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) "cc" = (/obj/machinery/camera{c_tag = "North Solars"; dir = 8; network = list("Tcomsat")},/turf/space,/area/space) diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index 39e1ff0072..d0a2adf82a 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -33,11 +33,11 @@ "aG" = (/turf/space,/area/solar/constructionsite) "aH" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/solar/constructionsite) "aI" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/djstation/solars) -"aJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor{icon_state = "solarpanel"},/area/djstation/solars) +"aJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) "aK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/djstation/solars) -"aL" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/tracker,/turf/simulated/floor{icon_state = "solarpanel"},/area/djstation/solars) +"aL" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) "aM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/djstation/solars) -"aN" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor{icon_state = "solarpanel"},/area/djstation/solars) +"aN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/tracker,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) "aO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/djstation/solars) "aP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/djstation/solars) "aQ" = (/turf/simulated/wall,/area/djstation) @@ -58,7 +58,7 @@ "bf" = (/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/djstation/solars) "bg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/djstation/solars) "bh" = (/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access_txt = "32"},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/djstation) -"bi" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor{icon_state = "solarpanel"},/area/djstation/solars) +"bi" = (/obj/structure/cable,/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) "bj" = (/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/djstation/solars) "bk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/djstation) "bl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/djstation) @@ -86,7 +86,7 @@ "bH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/djstation) "bI" = (/obj/machinery/door/blast/regular{id = "constructiondriver2"; name = "Construction Driver Door"},/turf/simulated/floor/plating,/area/djstation) "bJ" = (/turf/simulated/floor/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/constructionsite/ai) -"bK" = (/obj/structure/cable,/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor{icon_state = "solarpanel"},/area/djstation/solars) +"bK" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/solar{id = "construction_solar"; name = "Construction Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) "bL" = (/obj/item/weapon/extinguisher,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/djstation) "bM" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 2e+006},/turf/simulated/floor/plating,/area/djstation) "bN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/djstation) @@ -403,16 +403,16 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabaaabaaabaaabacaeapapapapauauaoaoaoauauapapapapaeacabaaabaaabaaabanauauapaeacaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabaaabaaabababapaqapauauauauauaoaoaoauauauauauapaqapabababaaabaaabanaoauapaeacaFaEaFaEaFaEaFaEaFaFaEaEaEaFaFaFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaIaIaIaIaIaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanababababababapapauauauaoaoaoaoaoaoaoaoaoaoauauauauapapababababababanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIaJaKaLaMaNaIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacacacacapapauauauaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauapapacacacacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaIaJaOaJaPaNaIababaaaaaQaQaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeaeaqauauaoaoaoaoaoapapapaRapapapaoaoaoaoauauauaqaeaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaIaJaOaJaPaNaIabababaaaSaTaUaVaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacaeaeapapauauaoaoaoapapapaWaXaYaXaWapapapaoaoaoauauapapaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaIaJaOaJaPaNaIababababaZbabbaVaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeapauauauaoaoapapababaWaXaYaXaWababapapaoaoaoauauapaeaeacabanauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIaJaKaNaMaLaIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacacacacapapauauauaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauapapacacacacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaIaJaOaJaPaLaIababaaaaaQaQaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeaeaqauauaoaoaoaoaoapapapaRapapapaoaoaoaoauauauaqaeaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaIaJaOaJaPaLaIabababaaaSaTaUaVaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacaeaeapapauauaoaoaoapapapaWaXaYaXaWapapapaoaoaoauauapapaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaIaJaOaJaPaLaIababababaZbabbaVaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeapauauauaoaoapapababaWaXaYaXaWababapapaoaoaoauauapaeaeacabanauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaIaIaIaIbcbdbebcbfbgbcaIaIaIaIaQaQbhaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaababalabalalababalababalacaeapaoaoanabacaeaeapauaoaoaoapapabababaWaXaYaXaWabababapapauaoauauapaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbibibibibjbkblbmbnbobjbibibibiaQbpbqbrbsaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababalababalalalalalalalalalalalacaeapaoaoapacacaeapapauaoaoaoapabababaWaWaWbtaWaWaWabababapauauaoauapapaeacacapauaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbKbKbKbKbjbkblbmbnbobjbKbKbKbKaQbpbqbrbsaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababalababalalalalalalalalalalalacaeapaoaoapacacaeapapauaoaoaoapabababaWaWaWbtaWaWaWabababapauauaoauapapaeacacapauaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbubvbvbvbwbxaVbybzbAbwbBbBbBbCaQbpbDbEbFbGbHcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabalalalalalalalalalalalalalalalalalalacaeapaoaoapaeaeaeapauauaoaoapapababaWaWbJbJaXbJbJaWaWababapapauaoauauapaeaeaeapauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbKbKbKbKbcbLaVbMaVbNbcbKbKbKbKaQbObqaVbPaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababababavavavavavabalabalabalabalabalacacacacacacacacacacacaeapaoaoapaqapapapauauauauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauauapacacavavavababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbibibibibcbLaVbMaVbNbcbibibibiaQbObqaVbPaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababababavavavavavabalabalabalabalabalacacacacacacacacacacacaeapaoaoapaqapapapauauauauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauauapacacavavavababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbQbRbRbRbSbTbUbVaVbWbSbXbXbXaKaQbYbDbEbEbZbHcraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalabalalalalalalalalalalalalalaeaeaeaeaeaeaeaeaeaeaeaeapaoaoauauauauauauaoauauapaXaXaXaWbJbJaXaYaXbJbJaWaXaXaXapauauaoauauauauaoauauaoapaeaealalalalalalalalalalalalaaaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbKbKbKbKcbcccdcecfcgcbbKbKbKbKaQchbqaVciaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalalalalalababalalabalabalabalabalabalcjaecjaeaeaeaeaeaeaeaeaeapauauauauauauauaoauauauckaYaYaYclaXaXaXaYaXaXaXcmaYaYaYcnaoauaoaoaoaoaoaoauauauapaeaealalalalalalalalalabalabalabalalalabalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIbibibibicbcccdcecfcgcbbibibibiaQchbqaVciaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalalalalalababalalabalabalabalabalabalcjaecjaeaeaeaeaeaeaeaeaeapauauauauauauauaoauauauckaYaYaYclaXaXaXaYaXaXaXcmaYaYaYcnaoauaoaoaoaoaoaoauauauapaeaealalalalalalalalalabalabalabalalalabalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaQaQaQaQaQaQaQaQcoaQaQaQaQaQaQaQaQcpbDbEbEcqbHbIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababalalalalalalalabalabalalalalalaeaeaecjaeaeaeaeaeaeaeaeapaoaoauaoaoaoaoaoaoaoaoapaXaXaXaWbJbJaXaYaXbJbJaWcscscsapauauaoauauauauauauaoaoapaeaealalalalalalalalalalalalalalalalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabctcucvcwcwcxctcyczcAcBcCcDcEcFbEcEcDbEcGaVcHaQaQaQaQaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavabababababavavavavavavavavavavavacacacacacacacacacacacacapaoaoapcIapapapcJaucJauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauaoapacacavavavavavababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcKcucLcucucLcKcMcMcNcMcMaQaQaQaQaQaQcOcPbEcQcRcScTcUaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababaccjcVcWcWcVaeaeaecVcXcXcXcXcVcVababaWaWbJbJaXbJbJaWaWababcVcVcXcXcXcXcVaeaeaecVcWcWcXaeacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index 9fb4fa0d41..94c371d1eb 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -21,6 +21,7 @@ "au" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/mineral,/area/mine/unexplored) "av" = (/obj/structure/transit_tube{icon_state = "E-SW"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "aw" = (/obj/structure/transit_tube,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) +"ax" = (/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/airless,/area/mine/abandoned) "ay" = (/obj/structure/transit_tube/station,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/research_outpost/hallway) "az" = (/obj/structure/transit_tube,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway) "aA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/transit_tube,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) @@ -142,7 +143,7 @@ "cM" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos) "cN" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/research_outpost/atmos) "cO" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/turf/simulated/floor{icon_state = "bot"},/area/research_outpost/atmos) -"cP" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/mine/abandoned) +"cP" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cQ" = (/obj/item/stack/rods,/obj/structure/door_assembly/door_assembly_ext{name = "Broken External Airlock"},/turf/simulated/floor,/area/mine/abandoned) "cR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/abandoned) "cS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) @@ -165,7 +166,7 @@ "dj" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small,/turf/simulated/floor,/area/research_outpost/atmos) "dk" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 9},/area/shuttle/alien/mine) "dl" = (/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 1},/area/shuttle/alien/mine) -"dm" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 10},/area/shuttle/alien/mine) +"dm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "dn" = (/obj/item/stack/rods,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "do" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "dp" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SE"},/turf/space,/area/space) @@ -225,7 +226,7 @@ "er" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "es" = (/turf/simulated/mineral,/area/mine/explored) "et" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 5},/area/shuttle/alien/mine) -"eu" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 6},/area/shuttle/alien/mine) +"eu" = (/turf/simulated/floor/plating/airless,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 10},/area/shuttle/alien/mine) "ev" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "ew" = (/turf/simulated/wall,/area/mine/abandoned) "ex" = (/turf/space,/area/shuttle/research/outpost) @@ -251,7 +252,7 @@ "eR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway) "eS" = (/turf/simulated/wall/r_wall,/area/research_outpost/power) "eT" = (/obj/machinery/door/airlock/glass_atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/research_outpost/power) -"eU" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/mine/abandoned) +"eU" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "eV" = (/obj/item/stack/rods,/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "eW" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "eX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) @@ -281,7 +282,7 @@ "fv" = (/obj/machinery/light/small{dir = 8},/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "fw" = (/obj/structure/transit_tube{icon_state = "N-SW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "fx" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space) -"fy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/abandoned) +"fy" = (/turf/simulated/floor/plating/airless,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 6},/area/shuttle/alien/mine) "fz" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "fA" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "fB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) @@ -498,9 +499,9 @@ "jE" = (/turf/simulated/floor/airless,/area/mine/abandoned) "jF" = (/obj/effect/alien/weeds,/turf/simulated/floor,/area/mine/abandoned) "jG" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) -"jH" = (/obj/structure/table,/turf/simulated/floor,/area/mine/abandoned) -"jI" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/abandoned) -"jJ" = (/obj/structure/table/rack,/turf/simulated/floor,/area/mine/abandoned) +"jH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned) +"jI" = (/obj/structure/table/rack,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"jJ" = (/obj/structure/table/rack,/turf/simulated/floor/airless,/area/mine/abandoned) "jK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/transit_tube{icon_state = "D-NE"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry) "jL" = (/obj/structure/transit_tube{icon_state = "S-NW"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/research_outpost/entry) "jM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/research_outpost/entry) @@ -612,15 +613,15 @@ "lO" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/harvesting) "lP" = (/obj/machinery/artifact_scanpad,/obj/machinery/light/small,/turf/simulated/floor/bluegrid,/area/research_outpost/harvesting) "lQ" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned) -"lR" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) -"lS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) -"lT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/mine/abandoned) -"lU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/mine/abandoned) -"lV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) -"lW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) -"lX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) +"lR" = (/obj/item/weapon/table_parts,/turf/simulated/floor/airless,/area/mine/abandoned) +"lS" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged4"},/area/mine/abandoned) +"lT" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) +"lU" = (/obj/structure/transit_tube,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) +"lV" = (/obj/structure/transit_tube/station{dir = 2; icon_state = "closed"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) +"lW" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged4"},/area/mine/abandoned) +"lX" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) "lY" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor,/area/mine/abandoned) -"lZ" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"lZ" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless,/area/mine/abandoned) "ma" = (/obj/structure/transit_tube{icon_state = "S-NE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "mb" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "mc" = (/obj/structure/transit_tube{icon_state = "E-NW"},/obj/structure/lattice,/turf/space,/area/space) @@ -662,7 +663,7 @@ "mM" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "mN" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "mO" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor,/area/mine/abandoned) -"mP" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) +"mP" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless,/area/mine/abandoned) "mQ" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "mR" = (/turf/simulated/wall,/area/mine/explored) "mS" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/wall,/area/mine/explored) @@ -682,13 +683,13 @@ "ng" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/research_outpost/filtering) "nh" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor,/area/research_outpost/iso1_access) "ni" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/research_outpost/iso1_access) -"nj" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/research_outpost/iso1_access) +"nj" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso3) "nk" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor,/area/research_outpost/iso2_access) "nl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/research_outpost/iso2_access) -"nm" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/research_outpost/iso2_access) +"nm" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso1) "nn" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor,/area/research_outpost/iso3_access) "no" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/research_outpost/iso3_access) -"np" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/research_outpost/iso3_access) +"np" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2) "nq" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "nr" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "ns" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage) @@ -698,13 +699,13 @@ "nw" = (/obj/structure/transit_tube{icon_state = "W-NE"},/obj/structure/lattice,/turf/space,/area/space) "nx" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/space,/area/space) "ny" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned) -"nz" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/mine/abandoned) +"nz" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "nA" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "nB" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor,/area/mine/abandoned) "nC" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "nD" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "nE" = (/obj/machinery/door/window/westleft,/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"nF" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/explored) +"nF" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) "nG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) "nH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/research_outpost/gearstore) "nI" = (/obj/machinery/door/airlock/glass_mining{name = "Equipment storage"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/research_outpost/gearstore) @@ -718,28 +719,28 @@ "nQ" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/research_outpost/filtering) "nR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/research_outpost/filtering) "nS" = (/obj/machinery/atmospherics/unary/freezer{dir = 4; icon_state = "freezer"},/turf/simulated/floor,/area/research_outpost/iso1_access) -"nT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/research_outpost/iso1_access) -"nU" = (/obj/machinery/door_control{id = "riso1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/research_outpost/iso1_access) +"nT" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso3) +"nU" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 6; tag_west = 2},/turf/simulated/floor,/area/research_outpost/filtering) "nV" = (/obj/machinery/atmospherics/unary/freezer{dir = 4; icon_state = "freezer"},/turf/simulated/floor,/area/research_outpost/iso2_access) -"nW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/research_outpost/iso2_access) -"nX" = (/obj/machinery/door_control{id = "riso2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/research_outpost/iso2_access) +"nW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso2"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso2) +"nX" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso1"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso1) "nY" = (/obj/machinery/atmospherics/unary/freezer{dir = 4; icon_state = "freezer"},/turf/simulated/floor,/area/research_outpost/iso3_access) -"nZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/research_outpost/iso3_access) -"oa" = (/obj/machinery/door_control{id = "riso3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/research_outpost/iso3_access) +"nZ" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) +"oa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) "ob" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "oc" = (/obj/structure/dispenser,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "od" = (/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/research_outpost/longtermstorage) "oe" = (/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/research_outpost/longtermstorage) "of" = (/obj/structure/transit_tube{icon_state = "S-NE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "og" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"oh" = (/obj/effect/decal/remains/human,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/mine/abandoned) +"oh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "oi" = (/obj/effect/alien/resin,/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/mine/abandoned) "oj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) "ok" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/mine/abandoned) -"ol" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"ol" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged4"},/area/mine/abandoned) "om" = (/obj/structure/ore_box,/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "on" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"oo" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/explored) +"oo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "op" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/research_outpost/gearstore) "oq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/gearstore) "or" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_access_txt = "0"; req_one_access_txt = "47;10;24"},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/research_outpost/gearstore) @@ -751,21 +752,21 @@ "ox" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) "oy" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) "oz" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/research_outpost/filtering) -"oA" = (/obj/machinery/atmospherics/omni/filter,/turf/simulated/floor,/area/research_outpost/filtering) +"oA" = (/obj/machinery/camera{c_tag = "Isolation Room Two"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) "oB" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/research_outpost/filtering) "oC" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso1) -"oD" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/iso1) +"oD" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) "oE" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso2) -"oF" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/iso2) +"oF" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) "oG" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso3) -"oH" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/iso3) +"oH" = (/obj/machinery/camera{c_tag = "Isolation Room One"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) "oI" = (/obj/structure/closet/hydrant{pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "oJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 5},/obj/item/weapon/storage/box/samplebags{pixel_x = 3; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "oK" = (/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2) "oL" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/longtermstorage) "oM" = (/obj/structure/transit_tube{icon_state = "N-SW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"oN" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) -"oO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned) +"oN" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless,/area/mine/abandoned) +"oO" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "oP" = (/obj/machinery/door/airlock/glass{name = "Glass Airlock"; req_access_txt = "0"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/abandoned) "oQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/mine/abandoned) "oR" = (/obj/machinery/suspension_gen,/turf/simulated/floor,/area/research_outpost/gearstore) @@ -776,22 +777,22 @@ "oW" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/green,/turf/simulated/floor,/area/research_outpost/gearstore) "oX" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "oY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"oZ" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) -"pa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) -"pb" = (/obj/machinery/camera{c_tag = "Isolation Room One"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso1) -"pc" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) -"pd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) -"pe" = (/obj/machinery/camera{c_tag = "Isolation Room Two"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) -"pf" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) -"pg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) -"ph" = (/obj/machinery/camera{c_tag = "Isolation Room Three"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) +"oZ" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso2) +"pa" = (/obj/machinery/camera{c_tag = "Isolation Room Three"; dir = 8; network = list("Research","Anomaly Isolation")},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) +"pb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/research_outpost/iso3) +"pc" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso3_access) +"pd" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso1_access) +"pe" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso2_access) +"pf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso1_access) +"pg" = (/obj/machinery/door_control{id = "riso1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/research_outpost/iso1_access) +"ph" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso2_access) "pi" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "pj" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/lights/bulbs{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/lights/tubes{pixel_x = -5; pixel_y = 5},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "pk" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/mineral/random,/area/mine/unexplored) "pl" = (/obj/structure/transit_tube{icon_state = "NE-SW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "pm" = (/obj/structure/transit_tube{icon_state = "D-NW"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"pn" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor,/area/mine/abandoned) -"po" = (/obj/item/weapon/table_parts,/turf/simulated/floor,/area/mine/abandoned) +"pn" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) +"po" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "pp" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/abandoned) "pq" = (/obj/structure/table/rack,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/abandoned) "pr" = (/obj/structure/closet,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -807,14 +808,11 @@ "pB" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) "pC" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) "pD" = (/obj/machinery/conveyor_switch{id = "anosample"; req_access_txt = "65"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"pE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; use_power = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso1) -"pF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso1) +"pE" = (/obj/machinery/door_control{id = "riso2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/research_outpost/iso2_access) +"pF" = (/obj/machinery/door_control{id = "riso3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/research_outpost/iso3_access) "pG" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso1) -"pH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; use_power = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2) -"pI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2) +"pH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow,/turf/simulated/floor,/area/research_outpost/iso3_access) "pJ" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2) -"pK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; use_power = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso3) -"pL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso3) "pM" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso3) "pN" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2) "pO" = (/obj/structure/transit_tube{icon_state = "E-SW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) @@ -830,8 +828,8 @@ "pY" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SE"},/turf/space,/area/mine/explored) "pZ" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "E-SW"},/turf/space,/area/mine/explored) "qa" = (/obj/structure/lattice,/obj/structure/transit_tube,/turf/space,/area/mine/explored) -"qb" = (/obj/structure/transit_tube,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/explored) -"qc" = (/obj/structure/transit_tube/station{dir = 2; icon_state = "closed"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/explored) +"qb" = (/obj/structure/table/rack,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"qc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "qd" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "qe" = (/turf/simulated/floor/mech_bay_recharge_floor{icon_state = "recharge_floor_asteroid"},/area/mine/explored) "qf" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) @@ -875,22 +873,22 @@ "qR" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/research_outpost/gearstore) "qS" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/explored) "qT" = (/obj/machinery/door/window/westleft,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qU" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/explored) +"qU" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "qV" = (/obj/structure/transit_tube{icon_state = "E-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "qW" = (/obj/structure/transit_tube,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "qX" = (/obj/structure/transit_tube,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/unexplored) -"qY" = (/obj/structure/transit_tube,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/unexplored) -"qZ" = (/obj/structure/transit_tube/station,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/unexplored) -"ra" = (/obj/structure/transit_tube{icon_state = "W-NE"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/unexplored) +"qY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned) +"qZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned) +"ra" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "rb" = (/obj/machinery/door/airlock/external{name = "External Airlock"; req_access_txt = "0"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/abandoned) -"rc" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/mine/abandoned) +"rc" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "rd" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/explored) "re" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) "rf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "research_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null; req_one_access = list(13,65); req_one_access_txt = null},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "rg" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) "rh" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) "ri" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) -"rj" = (/obj/structure/transit_tube{icon_state = "S-NE"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/mine/explored) +"rj" = (/obj/structure/transit_tube{icon_state = "S-NE"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) "rk" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/wall/r_wall,/area/mine/explored) "rl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = -32; pixel_y = -32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "rm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/unexplored) @@ -898,7 +896,7 @@ "ro" = (/obj/machinery/door/window/westleft{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/unexplored) "rp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "rq" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = -32},/obj/machinery/door/window/westleft,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"rr" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/explored) +"rr" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) "rs" = (/obj/effect/glowshroom,/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) "rt" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "ru" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) @@ -1113,6 +1111,7 @@ "vv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/mine/living_quarters) "vw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/mine/living_quarters) "vx" = (/obj/machinery/camera{c_tag = "Storage Room"; dir = 1; network = list("MINE")},/turf/simulated/floor,/area/mine/living_quarters) +"vy" = (/obj/structure/table,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "vz" = (/turf/simulated/wall,/area/mine/production) "vA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/mine/production) "vB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/mine/production) @@ -1374,6 +1373,10 @@ "Ax" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "Ay" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "Az" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) +"AA" = (/obj/structure/transit_tube,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/unexplored) +"AB" = (/obj/structure/transit_tube{icon_state = "W-NE"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/unexplored) +"AC" = (/obj/structure/transit_tube/station,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/unexplored) +"AD" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1424,33 +1427,33 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaRababababababababaSaTaUaVaWaXaYaZbabbbcbdbebcbfbgbcbhbdaMaeaebibjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababbkbkababbkbkbkbkabbkbkbkbkbkbkbkababababababababaaaaaaaaaaaaaaaaaaaRabababababaSaSaSaSblbmaUbnbobpbpbpbqbcbrbsbtbubvbwbxbyaMaeaebzbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababbkababababababbkbkababababbkbkbkbkabbkbkbkbkbkbkbkbkbkbkbkbkbkbkabaaaaaaaaaaaaaaaaaaaRababababaSaSbBbCaSbDbDbDbDbEbFbGbGbHbcbcbcbcbIbJbKbKbKbKbKbKbLbMbNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObPbOaaaaaaaaaaababababababababababababababababababababababbkabababbkbkabbkbkbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkabbkaaaaaaaaaaaaaaaaaRababababaSbQbRbSbTbUbVbWbXbYbZcacbccbccdcebccfcgbKchcicjckclcmcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacpcqcpaeaaaaaaababababababababababababbkbkbkbkbkbkabababababababbkbkbkbkbkabababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaaaaaRababababaScrcsctaScucvcwcxcyczcAcbcBbccCcDcEcFcGcHcIcJcKcLcMcNcOcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxbPbOaaaaaaaaaaababababababababababababababababababababababbkabababbkbkabbkbkbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkabbkaaaaaaaaaaaaaaaaaRababababaSbQbRbSbTbUbVbWbXbYbZcacbccbccdcebccfcgbKchcicjckclcmcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmcqcpaeaaaaaaababababababababababababbkbkbkbkbkbkabababababababbkbkbkbkbkabababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaaaaaRababababaScrcsctaScucvcwcxcyczcAcbcBbccCcDcEcFcGcHcIcJcKcLcMcNcOcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPcQcRcSaeaaaaabababababababbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaaafcTaaabababaScrcUcVaScWcwcXcYcZdadbdadcdadadaaMdddebKdfdgcKdhdidjcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdldldmdndocpaeaaaaababababbkbkbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaedpdqaBaBaBdrdsaaabababaScrdtduaSdvdwdxdydzdAdBdCdDdEdFdGaMdHdIbKdJdKdLdMdNbKdOdPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdldleudndocpaeaaaaababababbkbkbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaedpdqaBaBaBdrdsaaabababaScrdtduaSdvdwdxdydzdAdBdCdDdEdFdGaMdHdIbKdJdKdLdMdNbKdOdPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQdRdSdTdUdVdWaeaebkbkababbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkdXdXdXaedYdsaeaeaeaeaedZaSaSaSaSaSaSeaaSbDaMaMebecdaedeeefegeheiaMejekelemeneoepeqeleresaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldleuevdoewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkdXdXdXaaaaaRexexexexexexexbceyezeAeBeCeDeEeFeGeHeIeJdaeKeLeMeNeOePdaeQeReSeSeSeTeSeSeSeresaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldlfyevdoewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkdXdXdXaaaaaRexexexexexexexbceyezeAeBeCeDeEeFeGeHeIeJdaeKeLeMeNeOePdaeQeReSeSeSeTeSeSeSeresaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeeUeVeWewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkdXaaaaaRexexexexexexexeXeYeZfaeZeZfbfceZfdfefffgfhfifjfkflfmfnfofpfqeSfrfsfufteSfvfwesesaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxfyfzfAewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaRexexexexexexexfBfCfDfEfFfGfHfIfJfKaMfLfMaMfNfOfPfQfRfSdafTfUfVfWfXfYfZgagbgcesesaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxjHfzfAewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaRexexexexexexexfBfCfDfEfFfGfHfIfJfKaMfLfMaMfNfOfPfQfRfSdafTfUfVfWfXfYfZgagbgcesesaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegdgegfewggghewewewewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaRexexexexexexexgifCfDfEfFgjgkfIfJglaMgmgnaMgodadadadagpdagqgreSgsgtgugvgwergxgygyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzgAgBgCgDgEbOdVgFewgGgHewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaRexexexexexexexbcgIgJgKfFgLgMfIgNgOaMgPgQgRgSgTgUgVaMgWgXgYgZeShahbhchdheeresesesaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehfhggAhhhihjhkhlgFhmgHhngGewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaahohphqhrhshphqhthuhvhwhxhyhyaMaMaMaMaMhzhAhBhCbghDhEaMhFhGhHhIaMhJhKhLhMhNhOhPaMhQdqaBaBaBaBaBaBaChRaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahShfhThfgBgBgghUhiewfAhVewgHhWewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaahXhYhZiaibichZidieifhZigihiiijikilimaMinhAioipiqirisaMitiuiviwaMeSixeSaMaMiyiziAiBiCiDiDiEiDiDiDiFbjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiGiHgBiIiJgBeWiKhjiLiMiNewewewewewewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabababababababababababababaaaaaaaaaaiOiPiQiQiQiQiRiSiTiUiViWiXiYijiZjajbjcjdjejfjgeZeZjhjieZeZjjjkjljmjnjojpjqeZeZjrjsjtjuiDjvjwjxjyiDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaejzjAjBgBiJjChhjDhijEewjFjGewjHgFjIjJewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabababababababababababababababaaaaaaaajKjLhZhZjMhZjNjOhZjPhZjQjRjSijjajTjUjVjWjXjYjZkakbkckdkekfkckdkdkgkhkikjkkklkmknkokpkqkrksktkukviDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaebkbkewgEkwkxkyjBkzkAhjkBbOdVkCewjHfAgFjJewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababababesesesesesesababababababkDkEaaaaaakFkGhZkHkIkJkKidkLkMkNkOkPkQijkRkSkTkUkUaMaMkVkWkWkXkWkYkYkZkYlalalblaaMlcaMldleiDlflgiDlhlikuljiDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeewewewewewewgDhilkkwhiiKllkBkBhlgFjFewjHeWlmjJewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababesesesgygygygyesesesabablnlolphRaaaaaalqlrhqhrlslslslslsltlsbcbcbcijlukUlvlwlxlylzlAkWlBlClDkYlElFlGlalHlIlJlalKlLldlMldiDiDiDlNlOlPjyiDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeewlQdVhjlRewlSlTlUewiLewlVlWlXewdVlYcqlZeWfzcqewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabababesesgygygygygygygygyesesabmambbimcaBaBaBdrdsaeaemdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmungkWmwmxmykYmzmAmBlamCmDmElamFmGldmHmImJmKiDiDiDiDiDmLcTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkewlQeWdVhhiLlYkwmMkwmNdVdVmOgFdVeWeWewcqmPeWdVewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababesesgygygygygygygygygygymQmRmSmRaaaaaaaaaaaaaaaaaemdmTmUmVmWmXmYmZnananbnckUndnelylynfmvkWnhninjkYnknlnmlannnonplanqnrldnsntntnuldnvagaBaBnwnxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkewnynzeWeWiLeWlmggeWnAmNlmkCnBeWnCfAewkwcqlYdVewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesmRgygygygygygygygygygygynDnEnFnGaaaaaaaaaaaaaaaaaemdmTmUnHnInJnKmUnLnanMijijnNnOlynPnQnRkWnSnTnUkYnVnWnXlanYnZoalaobocldodoeoeoeldofogbkaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkewnyohhhgDewoiewojokewhjewojokewhilYewmOolcqjFewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesomgygygygygygygygygygygygyonoonGaaaaaaaaaaaaaaaaaemdopmUoqmhorosotounaovijowoxoylyozoAoBoCoCoDoCoEoEoFoEoGoGoHoGoGoIoJoKldldldldoLoMabbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkewewewewewewoiewoNgFhjjFfAhikzhiiNhhewojoOoPoQewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesmQgygygygygygygygygygygygyonnFnGaaaaaaaaaaaaaaaeaemdoRoSoTmWoUosoVoWnaoXijoYoxoylylylylyoCoZpapboEpcpdpeoGpfpgphoGpipjoKabbkabpkplpmabbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkewoiewgFjFpniKdohhgFewhifAewpopppppqewadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesesgygygyprgygygygygygygygypsptaeaaaaaaaaaaaaaeaeaemdmdpupvmdmdpwpxpwmdpypzpApBpCpDgygygyoCpEpFpGoEpHpIpJoGpKpLpMoGoKoKpNpOaiaipPogababbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkewoiewjFdViNgFhifAiNewoiewewjHcqpppqpRadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSpTgypUpSpQgygygygygygygygypWpXaaaaaaaaaaaepYpZqaqbqcqdqeqfmdqgqhqimdqjpzgygygygygygygyoCqkqlqmoCqnqoqpoEqqqrqsoGabauqtogquabababababbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkbkewoiewewewewewewewewewoiewjHcqjIcqpqqvadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSgygygypSpQgygygygygygygyqwqxqyqzqzqzqzqzqzqAqBqCqDqDqEqFqFmdqGqHqImdqJgygygygygypzpzpzoCoCoCoCoCoEoEoEoEoGoGoGoGauqtogqKadqKababababbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkewoioioioioioioioioioioiewjHjIjIjIjJewadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesgygygygyqMqNgygygygygygygygyqOqPqPqPqPqPqPqPqPqOgygygygygygymdqQqRpwmdqSgygygygygyqTqUqVaiaiaiaiqWaiaiaiaiaiqXqYqZraogadadadqKkDabbkbkbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaejzjAjBgBiJjChhjDhijEewjFjGewkBkCdVjJewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabababababababababababababababaaaaaaaajKjLhZhZjMhZjNjOhZjPhZjQjRjSijjajTjUjVjWjXjYjZkakbkckdkekfkckdkdkgkhkikjkkklkmknkokpkqkrksktkukviDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaebkbkewgEkwkxkyjBkzkAhjkBbOdVkCewkBkwkCjIewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababababesesesesesesababababababkDkEaaaaaakFkGhZkHkIkJkKidkLkMkNkOkPkQijkRkSkTkUkUaMaMkVkWkWkXkWkYkYkZkYlalalblaaMlcaMldleiDlflgiDlhlikuljiDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeewewewewewewgDhilkkwhiiKllkBkBhlgFjFewkBeWfAqbewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababesesesgygygygyesesesabablnlolphRaaaaaalqlrhqhrlslslslslsltlsbcbcbcijlukUlvlwlxlylzlAkWlBlClDkYlElFlGlalHlIlJlalKlLldlMldiDiDiDlNlOlPjyiDbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeewlQhijBqUewjzqcjAewiLewqZraqYewdVlYjEoNeWfzhiewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabababesesgygygygygygygygyesesabmambbimcaBaBaBdrdsaeaemdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmungkWmwmxmykYmzmAmBlamCmDmElamFmGldmHmImJmKiDiDiDiDiDmLcTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkewlQeWjBeWoOlYkwmMkwmNdVdVmOgFdVeWeWewhioNhihiewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababesesgygygygygygygygygygymQmRmSmRaaaaaaaaaaaaaaaaaemdmTmUmVmWmXmYmZnananbnckUndnelylynfmvkWnhnipdkYnknlpelannnopclanqnrldnsntntnuldnvagaBaBnwnxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkewnyjBhieWpoeWlmggeWnAmNlmkCnBeWnCfAewmPeWiNdVewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesmRgygygygygygygygygygygynDnEpnnGaaaaaaaaaaaaaaaaaemdmTmUnHnInJnKmUnLnanMijijnNnOlynPnQnRkWnSpfpgkYnVphpElanYpHpFlaobocldodoeoeoeldofogbkaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkewnynzhigEewoiewojokeweWewojokewhilYewghlZjEmPewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesomgygygygygygygygygygygygyonlXnGaaaaaaaaaaaaaaaaaemdopmUoqmhorosotounaovijowoxoylyoznUoBoCoCnXoCoEoEnWoEoGoGnToGoGoIoJoKldldldldoLoMabbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkewewewewewewoiewiNnCeWkzolhikzhiiNhhewooohoPoQewbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesmQgygygygygygygygygygygygyonnFnGaaaaaaaaaaaaaaaeaemdoRoSoTmWoUosoVoWnaoXijoYoxoylylylylyoCnZoFoHoEoZoaoAoGoDpbpaoGpipjoKabbkabpkplpmabbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkewoiewnCfAlTkzlSeWkCewhifAewlRpppppqewadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesesgygygyprgygygygygygygygypsptaeaaaaaaaaaaaaaeaeaemdmdpupvmdmdpwpxpwmdpypzpApBpCpDgygygyoCnmnmpGoEnpnppJoGnjnjpMoGoKoKpNpOaiaipPogababbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkewoiewkzeWdolWhifAiNewoiewewkBhipppqpRadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSpTgypUpSpQgygygygygygygygypWpXaaaaaaaaaaaepYpZqalUlVqdqeqfmdqgqhqimdqjpzgygygygygygygyoCqkqlqmoCqnqoqpoEqqqrqsoGabauqtogquabababababbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbkbkbkbkbkbkbkbkbkbkbkbkewoiewewewewewewewewewoiewvydVhidVpqqvadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSgygygypSpQgygygygygygygyqwqxqyqzqzqzqzqzqzqAqBqCqDqDqEqFqFmdqGqHqImdqJgygygygygypzpzpzoCoCoCoCoCoEoEoEoEoGoGoGoGauqtogqKadqKababababbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkewoioioioioioioioioioioiewkBhijEhijJewadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesgygygygyqMqNgygygygygygygygyqOqPqPqPqPqPqPqPqPqOgygygygygygymdqQqRpwmdqSgygygygygyqTADqVaiaiaiaiqWaiaiaiaiaiqXAAACABogadadadqKkDabbkbkbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkewewewewewewewewewewewewewewoQrbrcewewadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygygypBrfpCrgrhrigygygygyonrjrkababbkbkbkbkbkbkbkbkrlrmrnroadqKadadqKabababbkbkbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkadadadewppppjIewadadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSpTgygygygygygygygygygyaaaaaaaaaaaaaaaaesesesesesesesesgygygygygygypBrppCgygygygyrqrrpzbkabbkbkbkbkbkbkbkkDqKadrsadqKadadadabababababbkbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkadadadewpppphiewadadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSpTgygygygygygygygygygyaaaaaaaaaaaaaaaaesesesesesesesesgygygygygygypBrppCgygygygyrqrrpzbkabbkbkbkbkbkbkbkkDqKadrsadqKadadadabababababbkbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkadadadewrtrurtewadadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabespSgygygygygygygygygygygyaaaaaaaaaaaaaaaaesesesababababesesesgygygygygyrvgygydXgygypzpzpzbkbkbkbkbkbkbkbkbkbkbkbkkDbkadqubkabbkbkababababbkbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkadadewrwrboQewadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabesespVryrxgygygygygyesesesaaaaaaaaaaaaaaaaaaababababababababesesesgygygyrvgygydXdXdXdXbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabbkbkbkababababbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLrArAqLqLqLqLqLqLqLqLqLqLqLqLqLqLbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkadadadrBrCrDadadadadbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkababesesesmResgygymQmQesababaaaaaaaaaaaaaaaaaabkbkbkbkbkabababababesesgygyrvgygydXdXbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkabbkbkbkbkbkababababbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/images/nanomap_z.png b/nano/images/nanomap_z.png deleted file mode 100644 index d610bb9518..0000000000 Binary files a/nano/images/nanomap_z.png and /dev/null differ diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png index bd3e8fa4fc..bed65e9b01 100644 Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ diff --git a/nano/templates/hardsuit.tmpl b/nano/templates/hardsuit.tmpl index a8d3e59ac7..b32bb621c8 100644 --- a/nano/templates/hardsuit.tmpl +++ b/nano/templates/hardsuit.tmpl @@ -78,12 +78,12 @@ Used In File(s): /code/modules/clothing/spacesuits/rig/rig.dm
{{if data.sealing == 1}} -
SEALING
+
PROCESSING
{{else}} {{if data.seals == 1}} -
OPEN
+
INACTIVE
{{else}} -
SEALED
+
ACTIVE
{{/if}} {{/if}}
diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 81a75a2500..38cc5ef945 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -294,12 +294,12 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{:helper.link('Reply', 'comment', {'choice' : "Message", 'target': data.active_conversation}, null, 'fixedLeft')}} - {{else data.mode== 41}} + {{else data.mode== 41}}
- {{if data.manifest.heads.length}} + {{if data.cached.heads.length}} - {{for data.manifest["heads"]}} + {{for data.cached["heads"]}} {{if value.rank == "Captain"}} {{else}} @@ -307,9 +307,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.sec.length}} + {{if data.cached.sec.length}} - {{for data.manifest["sec"]}} + {{for data.cached["sec"]}} {{if value.rank == "Head of Security"}} {{else}} @@ -317,9 +317,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.eng.length}} + {{if data.cached.eng.length}} - {{for data.manifest["eng"]}} + {{for data.cached["eng"]}} {{if value.rank == "Chief Engineer"}} {{else}} @@ -327,9 +327,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.med.length}} + {{if data.cached.med.length}} - {{for data.manifest["med"]}} + {{for data.cached["med"]}} {{if value.rank == "Chief Medical Officer"}} {{else}} @@ -337,9 +337,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.sci.length}} + {{if data.cached.sci.length}} - {{for data.manifest["sci"]}} + {{for data.cached["sci"]}} {{if value.rank == "Research Director"}} {{else}} @@ -347,9 +347,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.civ.length}} + {{if data.cached.civ.length}} - {{for data.manifest["civ"]}} + {{for data.cached["civ"]}} {{if value.rank == "Head of Personnel"}} {{else}} @@ -357,9 +357,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.misc.length}} + {{if data.cached.misc.length}} - {{for data.manifest["misc"]}} + {{for data.cached["misc"]}} {{/for}} {{/if}} diff --git a/nano/templates/sec_camera.tmpl b/nano/templates/sec_camera.tmpl index ea18fb2047..886cb0f87c 100644 --- a/nano/templates/sec_camera.tmpl +++ b/nano/templates/sec_camera.tmpl @@ -12,7 +12,7 @@ Used In File(s): \code\game\machinery\computer\camera.dm
None
{{/if}} -{{for data.cameras}} +{{for data.cached.cameras}} {{if data.current && value.name == data.current.name}} {{:helper.link(value.name, '', {'switchTo' : value.camera}, 'selected')}} {{else value.deact}} @@ -20,4 +20,4 @@ Used In File(s): \code\game\machinery\computer\camera.dm {{else}} {{:helper.link(value.name, '', {'switchTo' : value.camera})}} {{/if}} -{{/for}} \ No newline at end of file +{{/for}} diff --git a/nano/templates/sec_camera_map_content.tmpl b/nano/templates/sec_camera_map_content.tmpl index 52dc8aeadd..55d9e05d4d 100644 --- a/nano/templates/sec_camera_map_content.tmpl +++ b/nano/templates/sec_camera_map_content.tmpl @@ -2,7 +2,7 @@ Title: Security Camera Console (Map content) Used In File(s): \code\game\machinery\computer\camera.dm --> -{{for data.cameras}} +{{for data.cached.cameras}} {{if value.z == 1}}
{{if data.current && value.name == data.current.name}} @@ -17,4 +17,4 @@ Used In File(s): \code\game\machinery\computer\camera.dm
{{/if}} -{{/for}} \ No newline at end of file +{{/for}} diff --git a/nano/templates/smes.tmpl b/nano/templates/smes.tmpl index 8b72cefedd..799ac3911d 100644 --- a/nano/templates/smes.tmpl +++ b/nano/templates/smes.tmpl @@ -50,6 +50,14 @@
{{:helper.link('Online', 'power', {'online' : 1}, data.outputOnline ? 'selected' : null)}}{{:helper.link('Offline', 'close', {'online' : 1}, data.outputOnline ? null : 'selected')}} +   + {{if data.outputting == 2}} + [Outputting] + {{else data.outputting == 1}} + [Stored energy too low] + {{else}} + [Not Outputting] + {{/if}}
diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar index e82d12e5b4..34bdb5bdd4 100644 Binary files a/tools/dmitool/dmitool.jar and b/tools/dmitool/dmitool.jar differ diff --git a/tools/dmitool/src/main/java/dmitool/DMI.java b/tools/dmitool/src/main/java/dmitool/DMI.java index 7fbe9912f1..bb560107ae 100644 --- a/tools/dmitool/src/main/java/dmitool/DMI.java +++ b/tools/dmitool/src/main/java/dmitool/DMI.java @@ -419,6 +419,12 @@ public class DMI implements Comparator { public void printInfo() { System.out.println(totalImages + " images, " + images.size() + " states, size "+w+"x"+h); } + + public void printStateList() { + for(IconState s: images) { + System.out.println(s.getInfoLine()); + } + } @Override public boolean equals(Object obj) { if(obj == this) return true; diff --git a/tools/dmitool/src/main/java/dmitool/DMIException.java b/tools/dmitool/src/main/java/dmitool/DMIException.java index ecc9d2f062..e929316289 100644 --- a/tools/dmitool/src/main/java/dmitool/DMIException.java +++ b/tools/dmitool/src/main/java/dmitool/DMIException.java @@ -8,6 +8,9 @@ public class DMIException extends Exception { desc = descriptor; this.line = line; } + public DMIException(String what) { + super(what); + } public DMIException(String what, Exception cause) { super(what, cause); } diff --git a/tools/dmitool/src/main/java/dmitool/IconState.java b/tools/dmitool/src/main/java/dmitool/IconState.java index 568f7c5cea..c3eb2cff21 100644 --- a/tools/dmitool/src/main/java/dmitool/IconState.java +++ b/tools/dmitool/src/main/java/dmitool/IconState.java @@ -4,6 +4,9 @@ import java.util.Arrays; import ar.com.hjg.pngj.ImageInfo; import ar.com.hjg.pngj.ImageLineInt; import ar.com.hjg.pngj.PngWriter; +import ar.com.hjg.pngj.PngReader; +import ar.com.hjg.pngj.PngjInputException; +import java.io.InputStream; import java.io.OutputStream; public class IconState { @@ -16,6 +19,21 @@ public class IconState { int loop; String hotspot; boolean movement; + + public String getInfoLine() { + String extraInfo = ""; + if(rewind) extraInfo += " rewind"; + if(frames != 1) { + extraInfo += " loop(" + (loop==-1 ? "infinite" : loop) + ")"; + } + if(hotspot != null) extraInfo += " hotspot('" + hotspot + "')"; + if(movement) extraInfo += " movement"; + if(extraInfo.equals("")) { + return String.format("state \"%s\", %d dir(s), %d frame(s)", name, dirs, frames); + } else { + return String.format("state \"%s\", %d dir(s), %d frame(s),%s", name, dirs, frames, extraInfo); + } + } @Override public IconState clone() { IconState is = new IconState(name, dirs, frames, images.clone(), delays==null ? null : delays.clone(), rewind, loop, hotspot, movement); @@ -144,4 +162,88 @@ public class IconState { } out.end(); } -} \ No newline at end of file + + public static IconState importFromPNG(DMI dmi, InputStream inS, String name, float[] delays, boolean rewind, int loop, String hotspot, boolean movement) throws DMIException { + int w = dmi.w; + int h = dmi.h; + + PngReader in; + try { + in = new PngReader(inS); + } catch(PngjInputException pie) { + throw new DMIException("Bad file format!", pie); + } + int pxW = in.imgInfo.cols; + int pxH = in.imgInfo.rows; + int frames = pxW / w; + int dirs = pxH / h; + + // make sure the size is an integer multiple + if(frames * w != pxW || frames==0) throw new DMIException("Illegal image size!"); + if(dirs * h != pxH || dirs==0) throw new DMIException("Illegal image size!"); + + int[][] px = new int[pxH][]; + for(int i=0; i argq = new ArrayDeque<>(); for(String s: args) { @@ -63,9 +82,9 @@ public class Main { argq.pollFirst(); } String op = argq.pollFirst(); - + switch(op) { - case "diff": + case "diff": { if(argq.size() < 2) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -73,7 +92,7 @@ public class Main { } String a = argq.pollFirst(); String b = argq.pollFirst(); - + if(VERBOSITY >= 0) System.out.println("Loading " + a); DMI dmi = doDMILoad(a); if(VERBOSITY >= 0) dmi.printInfo(); @@ -85,22 +104,24 @@ public class Main { DMIDiff dmid = new DMIDiff(dmi, dmi2); System.out.println(dmid); break; - case "sort": + } + case "sort": { if(argq.size() < 1) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); return; } String f = argq.pollFirst(); - + if(VERBOSITY >= 0) System.out.println("Loading " + f); - dmi = doDMILoad(f); + DMI dmi = doDMILoad(f); if(VERBOSITY >= 0) dmi.printInfo(); - + if(VERBOSITY >= 0) System.out.println("Saving " + f); dmi.writeDMI(new FileOutputStream(f), true); break; - case "merge": + } + case "merge": { if(argq.size() < 4) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -113,26 +134,26 @@ public class Main { if(VERBOSITY >= 0) System.out.println("Loading " + baseF); DMI base = doDMILoad(baseF); if(VERBOSITY >= 0) base.printInfo(); - + if(VERBOSITY >= 0) System.out.println("Loading " + aF); DMI aDMI = doDMILoad(aF); if(VERBOSITY >= 0) aDMI.printInfo(); - + if(VERBOSITY >= 0) System.out.println("Loading " + bF); DMI bDMI = doDMILoad(bF); if(VERBOSITY >= 0) bDMI.printInfo(); - + DMIDiff aDiff = new DMIDiff(base, aDMI); DMIDiff bDiff = new DMIDiff(base, bDMI); DMIDiff mergedDiff = new DMIDiff(); DMI conflictDMI = new DMI(32, 32); - + Set cf = aDiff.mergeDiff(bDiff, conflictDMI, mergedDiff, aF, bF); - + mergedDiff.applyToDMI(base); - + base.writeDMI(new FileOutputStream(mergedF)); - + if(!cf.isEmpty()) { if(VERBOSITY >= 0) for(String s: cf) { System.out.println(s); @@ -145,7 +166,8 @@ public class Main { System.exit(0); } break; - case "extract": + } + case "extract": { if(argq.size() < 3) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -154,10 +176,10 @@ public class Main { String file = argq.pollFirst(), state = argq.pollFirst(), outFile = argq.pollFirst(); - - dmi = doDMILoad(file); + + DMI dmi = doDMILoad(file); if(VERBOSITY >= 0) dmi.printInfo(); - + IconState is = dmi.getIconState(state); if(is == null) { System.out.println("icon_state '"+state+"' does not exist!"); @@ -166,10 +188,10 @@ public class Main { // minDir, Maxdir, minFrame, Maxframe int mDir=0, Mdir=is.dirs-1; int mFrame=0, Mframe=is.frames-1; - + while(argq.size() > 1) { String arg = argq.pollFirst(); - + switch(arg) { case "d": case "dir": @@ -231,7 +253,120 @@ public class Main { } is.dumpToPNG(new FileOutputStream(outFile), mDir, Mdir, mFrame, Mframe); break; - case "verify": + } + case "import": { + if(argq.size() < 3) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String dmiFile = argq.pollFirst(), + stateName = argq.pollFirst(), + pngFile = argq.pollFirst(); + + boolean noDup = false; + boolean rewind = false; + int loop = 0; + boolean movement = false; + String hotspot = null; + float[] delays = null; + while(!argq.isEmpty()) { + String s = argq.pollFirst(); + switch(s.toLowerCase()) { + case "nodup": + case "nd": + case "n": + noDup = true; + break; + case "rewind": + case "rw": + case "r": + rewind = true; + break; + case "loop": + case "lp": + case "l": + loop = -1; + break; + case "loopn": + case "lpn": + case "ln": + if(!argq.isEmpty()) { + String loopTimes = argq.pollFirst(); + try { + loop = Integer.parseInt(loopTimes); + } catch(NumberFormatException nfe) { + System.out.println("Illegal number '" + loopTimes + "' as argument to '" + s + "'!"); + return; + } + } else { + System.out.println("Argument '" + s + "' requires a numeric argument following it!"); + return; + } + break; + case "movement": + case "move": + case "mov": + case "m": + movement = true; + break; + case "delays": + case "delay": + case "del": + case "d": + if(!argq.isEmpty()) { + String delaysString = argq.pollFirst(); + String[] delaysSplit = delaysString.split(","); + delays = new float[delaysSplit.length]; + for(int i=0; i= 0) System.out.println("Loading " + dmiFile); + DMI toImportTo = doDMILoad(dmiFile); + if(VERBOSITY >= 0) toImportTo.printInfo(); + IconState is = IconState.importFromPNG(toImportTo, new FileInputStream(pngFile), stateName, delays, rewind, loop, hotspot, movement); + + if(noDup) { + if(!toImportTo.setIconState(is)) { + toImportTo.addIconState(null, is); + } + } else { + toImportTo.addIconState(null, is); + } + + if(VERBOSITY >= 0) toImportTo.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Saving " + dmiFile); + toImportTo.writeDMI(new FileOutputStream(dmiFile)); + break; + } + case "verify": { if(argq.size() < 1) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -242,6 +377,23 @@ public class Main { DMI v = doDMILoad(vF); if(VERBOSITY >= 0) v.printInfo(); break; + } + case "info": { + if(argq.size() < 1) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String infoFile = argq.pollFirst(); + if(VERBOSITY >= 0) System.out.println("Loading " + infoFile); + DMI info = doDMILoad(infoFile); + info.printInfo(); + info.printStateList(); + break; + } + case "version": + System.out.println(VERSION); + return; default: System.out.println("Command '" + op + "' not found!"); case "help": @@ -249,7 +401,7 @@ public class Main { break; } } - + static int parseDir(String s, IconState is) { try { int i = Integer.parseInt(s); @@ -275,7 +427,7 @@ public class Main { return -1; } } - + static int parseFrame(String s, IconState is) { try { int i = Integer.parseInt(s); @@ -290,7 +442,7 @@ public class Main { return -1; } } - + static DMI doDMILoad(String file) { try { DMI dmi = new DMI(file); diff --git a/tools/mapmerge/clean_map_git.sh b/tools/mapmerge/clean_map_git.sh old mode 100644 new mode 100755 index 1a0c9d6592..e8ad8165e4 --- a/tools/mapmerge/clean_map_git.sh +++ b/tools/mapmerge/clean_map_git.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash for i in {1..6} do @@ -7,4 +7,4 @@ do git show HEAD:maps/$MAPFILE > tmp.dmm java -jar MapPatcher.jar -clean tmp.dmm '../../maps/'$MAPFILE '../../maps/'$MAPFILE rm tmp.dmm -done \ No newline at end of file +done
Command
{{:value.name}}{{:value.rank}}{{:value.active}}
Security
{{:value.name}}{{:value.rank}}{{:value.active}}
Engineering
{{:value.name}}{{:value.rank}}{{:value.active}}
Medical
{{:value.name}}{{:value.rank}}{{:value.active}}
Science
{{:value.name}}{{:value.rank}}{{:value.active}}
Civilian
{{:value.name}}{{:value.rank}}{{:value.active}}
Misc
{{:value.name}}{{:value.rank}}{{:value.active}}