diff --git a/COPYING b/COPYING index 5c2d485924d..a4192d74542 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,5 @@ Paradise -Copyright (C) 2010-2014 Paradise, Baystation12 and tgstation13. +Copyright (C) 2010-2016 Paradise, Baystation12, Goonstation and tgstation13. 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 @@ -13,3 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . + + + +Any files located in the Paradise/goon, Paradise/icons/goonstation, or Paradise/sound/goonstation directories, or any subdirectories of mentioned directories are licensed under the Creative Commons 3.0 BY-NC-SA license (https://creativecommons.org/licenses/by-nc-sa/3.0) from Goonstation. diff --git a/LICENSE-CC-BY-NC-SA.txt b/LICENSE-CC-BY-NC-SA.txt new file mode 100644 index 00000000000..860915c5c0e --- /dev/null +++ b/LICENSE-CC-BY-NC-SA.txt @@ -0,0 +1,60 @@ +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(g) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike. + "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + to Distribute and Publicly Perform Adaptations. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights described in Section 4(e). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(d), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(d), as requested. + You may Distribute or Publicly Perform an Adaptation only under: (i) the terms of this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). You must include a copy of, or the URI, for Applicable License with every copy of each Adaptation You Distribute or Publicly Perform. You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License. You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in con-nection with the exchange of copyrighted works. + If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(d) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + For the avoidance of doubt: + Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). + Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index eb9c08af9ea..d3b988706c0 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -33,23 +33,28 @@ CREATE TABLE `characters` ( `hair_red` smallint(4) NOT NULL, `hair_green` smallint(4) NOT NULL, `hair_blue` smallint(4) NOT NULL, + `secondary_hair_red` smallint(4) NOT NULL, + `secondary_hair_green` smallint(4) NOT NULL, + `secondary_hair_blue` smallint(4) NOT NULL, `facial_red` smallint(4) NOT NULL, `facial_green` smallint(4) NOT NULL, `facial_blue` smallint(4) NOT NULL, + `secondary_facial_red` smallint(4) NOT NULL, + `secondary_facial_green` smallint(4) NOT NULL, + `secondary_facial_blue` smallint(4) NOT NULL, `skin_tone` smallint(4) NOT NULL, `skin_red` smallint(4) NOT NULL, `skin_green` smallint(4) NOT NULL, `skin_blue` smallint(4) NOT NULL, - `markings_red` smallint(4) NOT NULL, - `markings_green` smallint(4) NOT NULL, - `markings_blue` smallint(4) NOT NULL, + `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000', `head_accessory_red` smallint(4) NOT NULL, `head_accessory_green` smallint(4) NOT NULL, `head_accessory_blue` smallint(4) NOT NULL, `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, - `marking_style_name` varchar(45) NOT NULL, + `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None', `head_accessory_style_name` varchar(45) NOT NULL, + `alt_head_name` varchar(45) NOT NULL, `eyes_red` smallint(4) NOT NULL, `eyes_green` smallint(4) NOT NULL, `eyes_blue` smallint(4) NOT NULL, diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 802c3fd352b..04e138d3e1c 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -33,23 +33,28 @@ CREATE TABLE `SS13_characters` ( `hair_red` smallint(4) NOT NULL, `hair_green` smallint(4) NOT NULL, `hair_blue` smallint(4) NOT NULL, + `secondary_hair_red` smallint(4) NOT NULL, + `secondary_hair_green` smallint(4) NOT NULL, + `secondary_hair_blue` smallint(4) NOT NULL, `facial_red` smallint(4) NOT NULL, `facial_green` smallint(4) NOT NULL, `facial_blue` smallint(4) NOT NULL, + `secondary_facial_red` smallint(4) NOT NULL, + `secondary_facial_green` smallint(4) NOT NULL, + `secondary_facial_blue` smallint(4) NOT NULL, `skin_tone` smallint(4) NOT NULL, `skin_red` smallint(4) NOT NULL, `skin_green` smallint(4) NOT NULL, `skin_blue` smallint(4) NOT NULL, - `markings_red` smallint(4) NOT NULL, - `markings_green` smallint(4) NOT NULL, - `markings_blue` smallint(4) NOT NULL, + `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000', `head_accessory_red` smallint(4) NOT NULL, `head_accessory_green` smallint(4) NOT NULL, `head_accessory_blue` smallint(4) NOT NULL, `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, - `marking_style_name` varchar(45) NOT NULL, + `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None', `head_accessory_style_name` varchar(45) NOT NULL, + `alt_head_name` varchar(45) NOT NULL, `eyes_red` smallint(4) NOT NULL, `eyes_green` smallint(4) NOT NULL, `eyes_blue` smallint(4) NOT NULL, diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 1590325df0e..15a969e7a47 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -365,7 +365,7 @@ "aha" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahb" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahc" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe/HoS{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahe" = (/turf/simulated/wall,/area/security/range) "ahf" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/clothing/suit/armor/laserproof,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "ahg" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 6a368e05b16..c09808a51f8 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -523,7 +523,7 @@ "kc" = (/obj/machinery/door/airlock{name = "Supply Closet"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "kd" = (/obj/machinery/door/airlock/glass{name = "Gateway"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "ke" = (/obj/item/weapon/melee/cultblade,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) -"kf" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"kf" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = list("1e+009" = "O-")},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) "kg" = (/obj/machinery/light{dir = 8},/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "kh" = (/obj/effect/hotel_controller,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "ki" = (/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm index ae596b4b18b..113bf83c346 100644 --- a/_maps/map_files/RandomZLevels/wildwest.dmm +++ b/_maps/map_files/RandomZLevels/wildwest.dmm @@ -255,7 +255,7 @@ "eU" = (/obj/effect/landmark/corpse/doctor{mobname = "Doctor Mugabee"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines) "eV" = (/obj/item/stack/medical/bruise_pack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines) "eW" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine) -"eX" = (/turf/simulated/wall/mineral{icon_state = "sandstone0"; mineral = "sandstone"; tag = "icon-sandstone0"; walltype = "sandstone"},/area/awaymission/wwmines) +"eX" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines) "eY" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines) "eZ" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine) "fa" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/wood,/area/awaymission/wwmines) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index d0906efa690..318b751606d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -20,16 +20,16 @@ "aat" = (/turf/simulated/wall,/area/security/permabrig) "aau" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/turf/simulated/floor/grass,/area/security/permabrig) "aav" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/turf/simulated/floor/grass,/area/security/permabrig) +"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/grass,/area/security/permabrig) "aax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aay" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/turf/simulated/floor/grass,/area/security/permabrig) +"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/grass,/area/security/permabrig) "aaA" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig) "aaB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/permabrig) "aaC" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaD" = (/turf/simulated/floor/plasteel,/area/security/permabrig) "aaE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig) -"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaG" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaI" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) @@ -39,15 +39,15 @@ "aaM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaN" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaO" = (/obj/machinery/seed_extractor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "aaQ" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "aaR" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "aaS" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaT" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "aaY" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/security/permabrig) "aba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) @@ -80,12 +80,12 @@ "abB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool,/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abD" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abF" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abG" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abI" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abJ" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abJ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abK" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "abL" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "abM" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) @@ -117,7 +117,7 @@ "acm" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig) "acn" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "aco" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) -"acp" = (/obj/machinery/power/apc{dir = 1; name = "Prisoner Transfer Center APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/chair/e_chair,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) +"acp" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) "acq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/device/assembly/signaler{code = 6; frequency = 1445},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "acr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"}) "acs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) @@ -208,7 +208,7 @@ "adZ" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "aea" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "aeb" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury) -"aec" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Head of Security APC"; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"aec" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/chair/e_chair,/obj/effect/landmark{name = "revenantspawn"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "aed" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) "aee" = (/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos) "aef" = (/obj/structure/table/woodentable,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) @@ -216,9 +216,9 @@ "aeh" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aei" = (/obj/machinery/space_heater,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay) "aej" = (/obj/spacepod/sec{req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay) -"aek" = (/turf/simulated/floor/plasteel,/area/security/prisonlockers) +"aek" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig) "ael" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonlockers) -"aem" = (/obj/machinery/power/apc{dir = 1; name = "Prisoner Lockers APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/security/prisonlockers) +"aem" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aen" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig) "aeo" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig) "aep" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/securehallway) @@ -241,7 +241,7 @@ "aeG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers) "aeH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers) "aeI" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"aeJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) +"aeJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "aeK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "aeL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "aeM" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) @@ -317,13 +317,13 @@ "age" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/securehallway) "agf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "agg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) -"agh" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/item/device/spacepod_equipment/weaponry/laser,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) +"agh" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/prisonlockers) "agi" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space) "agj" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/security/range) "agk" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/security/range) "agl" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range) "agm" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range) -"agn" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/deployable/barrier,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) +"agn" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/device/spacepod_equipment/weaponry/laser,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "ago" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/securehallway) "agp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/seceqstorage) "agq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers) @@ -420,7 +420,7 @@ "aid" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) "aie" = (/turf/simulated/floor/plasteel,/area/shuttle/gamma/station) "aif" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage) -"aig" = (/obj/machinery/power/apc{dir = 1; name = "Interrogation APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogation) +"aig" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/deployable/barrier,/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aih" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/armoury) "aii" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage) "aij" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/security,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage) @@ -436,7 +436,7 @@ "ait" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiu" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation) -"aiw" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation) +"aiw" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig) "aix" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) "aiy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main) "aiz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway) @@ -462,7 +462,7 @@ "aiT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage) "aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury) -"aiW" = (/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig) +"aiW" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aiX" = (/obj/machinery/light{dir = 4},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiY" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/interrogationhallway) @@ -501,7 +501,7 @@ "ajG" = (/turf/simulated/wall,/area/security/warden) "ajH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway) "ajI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage) -"ajJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation) +"ajJ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) "ajK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) "ajL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway) "ajM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/main) @@ -520,18 +520,18 @@ "ajZ" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay) "aka" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage) "akb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_security,/turf/simulated/floor/plasteel,/area/security/main) -"akc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/reinforced,/obj/machinery/syndicatebomb/training,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range) +"akc" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogation) "akd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main) "ake" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main) "akf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main) "akg" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main) "akh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main) "aki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/seceqstorage) -"akj" = (/obj/machinery/photocopier,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) +"akj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "akk" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Warden's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "akl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "akm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) -"akn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage) +"akn" = (/obj/structure/table/reinforced,/obj/machinery/syndicatebomb/training,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_x = 30},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range) "ako" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "akp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel,/area/security/main) "akq" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage) @@ -583,7 +583,7 @@ "alk" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main) "all" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/security/seceqstorage) "alm" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/medbay) -"aln" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "Prisoner Processing APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle) +"aln" = (/obj/machinery/photocopier,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "alo" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard) "alp" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport) "alq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport) @@ -591,8 +591,8 @@ "als" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/range) "alt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range) "alu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range) -"alv" = (/obj/machinery/power/apc{cell_type = 2500; name = "Firing Range APC"; pixel_y = -28},/obj/structure/cable,/obj/machinery/light,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range) -"alw" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "Security Medbay APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) +"alv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage) +"alw" = (/obj/structure/cable,/obj/machinery/light,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range) "alx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Brig Physician"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aly" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "alz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) @@ -629,7 +629,7 @@ "ame" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range) "amf" = (/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/security/medbay) "amg" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range) -"amh" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay) +"amh" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay) "ami" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "amj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "amk" = (/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay) @@ -733,7 +733,7 @@ "aoe" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/lobby) "aof" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway) "aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) -"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp) +"aoh" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prisonlockers) "aoi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) "aoj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) "aok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) @@ -760,12 +760,12 @@ "aoF" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aoG" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aoH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/lobby) -"aoI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Interrogation Hallway APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway) +"aoI" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aoJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/processing) "aoK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/processing) "aoL" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle) "aoM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) -"aoN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{name = "Security Office APC"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main) +"aoN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main) "aoO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) "aoP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aoQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) @@ -777,7 +777,7 @@ "aoW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aoX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/brig) "aoY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig) -"aoZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/obj/machinery/power/apc{name = "Brig APC"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"aoZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle) "apa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig) @@ -812,7 +812,7 @@ "apF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/prison/cell_block/A) "apG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "apH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"apI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "Courtroom Prosecution and Defense"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp) +"apI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apJ" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) "apK" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby) "apL" = (/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{pixel_x = 28; pixel_y = -10},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby) @@ -838,7 +838,7 @@ "aqf" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/siberia) "aqg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) "aqh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"aqi" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 1; name = "Detective APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"aqi" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) "aqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/camera{c_tag = "Brig Main Hall 2"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) "aqk" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/courtroomdandp) "aql" = (/turf/simulated/wall/r_wall,/area/security/courtroomdandp) @@ -945,7 +945,7 @@ "asi" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) "asj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "ask" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) -"asl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Security Lobby APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) +"asl" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "asm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "asn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "aso" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) @@ -982,7 +982,7 @@ "asT" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing) "asU" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B) "asV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence) -"asW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp) +"asW" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation) "asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence) "asY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle) "asZ" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A) @@ -1036,7 +1036,7 @@ "atV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "atW" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) "atX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"atY" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "Courtroom APC"; pixel_x = 26; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom) +"atY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp) "atZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom) "aua" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel,/area/security/processing) "aub" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) @@ -1090,7 +1090,7 @@ "auX" = (/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "auY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "auZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) -"ava" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Prisoner Processing APC"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) +"ava" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "avb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "avc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "avd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -1179,7 +1179,7 @@ "awI" = (/obj/machinery/camera{c_tag = "Mr. Chang's"; dir = 2; network = list("SS13")},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "awJ" = (/obj/machinery/camera{c_tag = "Barber Shop"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/dye_generator,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "awK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) -"awL" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Barber Shop APC"; pixel_y = 24},/obj/structure/stool/bed/chair/barber{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) +"awL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "awM" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "awN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "awO" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) @@ -1228,7 +1228,7 @@ "axF" = (/obj/structure/closet/secure_closet/clown,/turf/simulated/floor/wood,/area/clownoffice) "axG" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "axH" = (/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) -"axI" = (/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/power/apc{dir = 4; name = "Chinese Restaurant APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) +"axI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) "axJ" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "axK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "axL" = (/obj/effect/landmark/start{name = "Barber"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -1245,7 +1245,7 @@ "axW" = (/obj/item/flag/clown,/turf/simulated/floor/wood,/area/clownoffice) "axX" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office) "axY" = (/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice) -"axZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice) +"axZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation) "aya" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/clownoffice) "ayb" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/clownoffice) "ayc" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/wood,/area/clownoffice) @@ -1293,7 +1293,7 @@ "ayS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/wood,/area/clownoffice) "ayT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/clownoffice) "ayU" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"ayV" = (/obj/machinery/power/apc{dir = 8; name = "Clown Office APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/turf/simulated/floor/wood,/area/clownoffice) +"ayV" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom) "ayW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/clownoffice) "ayX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "ayY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/courtroomdandp) @@ -1327,7 +1327,7 @@ "azA" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "azB" = (/obj/machinery/atmospherics/trinary/filter{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "azC" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"azD" = (/obj/machinery/camera{c_tag = "Fore Port Solar Control"; dir = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"azD" = (/obj/machinery/camera{c_tag = "Fore Port Solar Control"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azE" = (/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,/area/maintenance/auxsolarport) "azF" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azG" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) @@ -1350,12 +1350,12 @@ "azX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/fore) "azY" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/maintenance/fsmaint) "azZ" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aAa" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Security Maintenance APC"; pixel_y = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"aAa" = (/obj/structure/stool/bed/chair/barber{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aAb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "aAc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "aAd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aAe" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space) -"aAf" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aAf" = (/obj/structure/stool/bed/chair/wood/wings,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "aAg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aAh" = (/obj/machinery/camera{c_tag = "Fore Starboard Solars"; dir = 1; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aAi" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint2) @@ -1551,7 +1551,7 @@ "aDQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/mimeoffice) "aDR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aDS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/magistrateoffice) -"aDT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Magistrate's Office APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/carpet,/area/magistrateoffice) +"aDT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp) "aDU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice) "aDV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice) "aDW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/turf/simulated/floor/carpet,/area/magistrateoffice) @@ -1616,7 +1616,7 @@ "aFd" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aFe" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice) "aFf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Mime's Office"; dir = 1; network = list("SS13")},/obj/structure/closet/secure_closet/mime,/turf/simulated/floor/wood,/area/mimeoffice) -"aFg" = (/obj/machinery/power/apc{name = "Mime Office APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/wood,/area/mimeoffice) +"aFg" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aFh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aFi" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/filingcabinet,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/carpet,/area/magistrateoffice) "aFj" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/folder{pixel_x = -4},/obj/machinery/door_control{id = "magistrate2"; name = "IAA Privacy Shutters Control"; pixel_x = 8; pixel_y = -25},/obj/machinery/door_control{id = "magistrate"; name = "Privacy Shutters Control"; pixel_x = -8; pixel_y = -25},/turf/simulated/floor/carpet,/area/magistrateoffice) @@ -1628,7 +1628,7 @@ "aFp" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aFq" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aFr" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/machinery/requests_console{department = "Internal Affairs Office"; name = "Internal Affairs Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) -"aFs" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = 6},/obj/machinery/power/apc{dir = 2; name = "Law Office APC"; pixel_y = -24},/obj/structure/cable,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) +"aFs" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aFt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "lawyer"; name = "Privacy Shutters Control"; pixel_y = -25},/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/machinery/camera{c_tag = "Internal Affairs Office"; dir = 1; network = list("SS13")},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/stamp/law,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aFu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "lawyer"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/lawoffice) "aFv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) @@ -1696,7 +1696,7 @@ "aGF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/lawoffice) "aGG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/lawoffice) "aGH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/lawoffice) -"aGI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "Fore Primary Hallway APC"; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) +"aGI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp) "aGJ" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "aGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/sleep) "aGL" = (/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) @@ -1721,7 +1721,7 @@ "aHe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/electrical) "aHf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/electrical) -"aHh" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical) +"aHh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/magistrateoffice) "aHi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHj" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/storage/toolbox/electrical,/obj/item/device/multitool,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical) "aHk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -1860,19 +1860,19 @@ "aJN" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJO" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJP" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aJQ" = (/obj/machinery/camera/motion{c_tag = "EVA Northwest"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aJQ" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom) "aJR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aJS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "aJT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aJU" = (/obj/machinery/power/apc{dir = 1; name = "EVA APC"; pixel_x = 3; pixel_y = 23},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aJU" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice) "aJV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aJW" = (/obj/machinery/camera{c_tag = "EVA Northeast"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aJW" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) "aJX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJY" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJZ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aKa" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aKb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aKc" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Dormitories APC"; pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aKc" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = 6},/obj/structure/cable,/obj/item/weapon/pen/multi,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aKd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aKe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/crew_quarters/sleep) "aKf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) @@ -1921,7 +1921,7 @@ "aKW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aKX" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aKY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness) -"aKZ" = (/obj/machinery/power/apc{dir = 2; name = "Dormitory APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) +"aKZ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "aLa" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) "aLb" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) "aLc" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) @@ -2119,7 +2119,7 @@ "aOM" = (/obj/effect/landmark{name = "HONKsquad"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aON" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/arrival/station) "aOO" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/arrival/station) -"aOP" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry) +"aOP" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/electrical) "aOQ" = (/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2) "aOR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/checkpoint2) "aOS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/checkpoint2) @@ -2156,7 +2156,7 @@ "aPx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) "aPy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aPz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aPA" = (/obj/machinery/power/apc{dir = 4; name = "Dormitory Bathrooms APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aPA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aPB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/toilet) "aPC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/toilet) "aPD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/crew_quarters/toilet) @@ -2310,7 +2310,7 @@ "aSv" = (/obj/structure/table,/obj/item/weapon/weldingtool,/obj/item/weapon/crowbar,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel,/area/storage/primary) "aSw" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/nuke_storage) "aSx" = (/obj/machinery/door/airlock/vault{icon_state = "door_locked"; locked = 1; req_access_txt = "53"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/security/nuke_storage) -"aSy" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel,/area/gateway) +"aSy" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aSz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway) "aSA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/gateway) "aSB" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/l3closet/scientist,/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel,/area/gateway) @@ -2373,7 +2373,7 @@ "aTG" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "aTH" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) "aTI" = (/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) -"aTJ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Escape Podbay APC"; pixel_x = -25},/turf/simulated/floor/plasteel,/area/escapepodbay) +"aTJ" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) "aTK" = (/turf/simulated/floor/plasteel,/area/escapepodbay) "aTL" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay) "aTM" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station) @@ -2411,9 +2411,9 @@ "aUs" = (/obj/item/clothing/suit/space/eva/mime,/obj/item/clothing/head/helmet/space/eva/mime,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aUt" = (/obj/item/clothing/suit/space/eva/clown,/obj/item/clothing/head/helmet/space/eva/clown,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aUu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aUv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Soutwest"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) +"aUv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/clownoffice) "aUw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aUx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA Southeast"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) +"aUx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Clown's Office"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/wood,/area/clownoffice) "aUy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aUz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aUA" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north) @@ -2421,7 +2421,7 @@ "aUC" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north) "aUD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "aUE" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/north) -"aUF" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Central Hall North APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/item/flag/nt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north) +"aUF" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry) "aUG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/north) "aUH" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "aUI" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne) @@ -2512,7 +2512,7 @@ "aWp" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "aWq" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "aWr" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) -"aWs" = (/obj/machinery/power/apc{dir = 1; name = "Bar APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aWs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aWt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aWu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aWv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2525,7 +2525,7 @@ "aWC" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) "aWD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/grass,/area/hydroponics) "aWE" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) -"aWF" = (/obj/machinery/power/apc{dir = 1; name = "Hydroponics APC"; pixel_y = 24},/obj/structure/table,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWF" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/gateway) "aWG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"; network = list("SS13")},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) "aWH" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics) @@ -2589,7 +2589,7 @@ "aXO" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw) "aXP" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/nw) "aXQ" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/nw) -"aXR" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Central Hall NW APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw) +"aXR" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/escapepodbay) "aXS" = (/turf/simulated/floor/plasteel{icon_state = "L3"},/area/hallway/primary/central/north) "aXT" = (/turf/simulated/floor/plasteel{icon_state = "L5"},/area/hallway/primary/central/north) "aXU" = (/turf/simulated/floor/plasteel{icon_state = "L7"},/area/hallway/primary/central/north) @@ -2604,7 +2604,7 @@ "aYd" = (/obj/machinery/camera{c_tag = "Central Hallway North-East"; dir = 2; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "aYe" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "aYf" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) -"aYg" = (/obj/machinery/power/apc{dir = 1; name = "Central Hall NE APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) +"aYg" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north) "aYh" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "aYi" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "aYj" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light_switch{pixel_x = 27; pixel_y = -8},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) @@ -2639,7 +2639,7 @@ "aYM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library) "aYN" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "aYO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) -"aYP" = (/obj/machinery/power/apc{dir = 8; name = "Chapel Office APC"; pixel_x = -25},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) +"aYP" = (/obj/structure/table,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/reagentgrinder,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYQ" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "aYR" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "aYS" = (/obj/machinery/camera{c_tag = "Chapel North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -2924,7 +2924,7 @@ "bel" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/storage/emergency2) "bem" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2) "ben" = (/obj/item/device/flashlight/flare,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2) -"beo" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/carpet,/area/civilian/pet_store) +"beo" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bep" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/civilian/pet_store) "beq" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store) "ber" = (/turf/simulated/wall,/area/storage/tools) @@ -3041,7 +3041,7 @@ "bgy" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access_txt = "37"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library) "bgz" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library) "bgA" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/checkout{pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/library) -"bgB" = (/obj/machinery/power/apc{dir = 8; name = "Chapel APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"bgB" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw) "bgC" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) "bgD" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) "bgE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) @@ -3192,7 +3192,7 @@ "bjt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bju" = (/turf/simulated/wall,/area/hallway/primary/starboard/east) "bjv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/library) -"bjw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Library APC"; pixel_x = -25},/turf/simulated/floor/carpet,/area/library) +"bjw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bjx" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/library) "bjy" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/wood,/area/library) "bjz" = (/obj/structure/table/woodentable,/obj/item/device/camera_film,/obj/item/device/camera_film,/turf/simulated/floor/wood,/area/library) @@ -3253,7 +3253,7 @@ "bkC" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(75)},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge) "bkD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge) "bkE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge) -"bkF" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Bridge APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge) +"bkF" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "bkG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/bridge) "bkH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/bridge) "bkI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/bridge) @@ -3310,7 +3310,7 @@ "blH" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/crew_quarters/locker) "blI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/crew_quarters/locker) "blJ" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) -"blK" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/port) +"blK" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store) "blL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/port) "blM" = (/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/meter,/turf/simulated/floor/plating,/area/maintenance/port) "blN" = (/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},/turf/simulated/floor/plating,/area/maintenance/port) @@ -3351,12 +3351,12 @@ "bmw" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bmy" = (/obj/machinery/door_control{id = "kitchenbar"; name = "Kitchen Bar Shutters Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "28"},/obj/machinery/door_control{id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"bmz" = (/obj/machinery/power/apc{dir = 2; name = "Kitchen APC"; pixel_y = -24},/obj/structure/cable,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) +"bmz" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "bmA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bmB" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bmC" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bmD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bmE" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"bmE" = (/obj/machinery/camera/motion{c_tag = "EVA North-West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) "bmF" = (/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bmG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bmH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library) @@ -3436,7 +3436,7 @@ "bod" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "boe" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/chapel/main) "bof" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"bog" = (/obj/machinery/power/apc{dir = 8; name = "Escape Hallway APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) +"bog" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/library) "boh" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/transport) "boi" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry) "boj" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/shuttle/transport) @@ -3469,7 +3469,7 @@ "boK" = (/obj/machinery/door_control{id = "heads_meeting"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "boL" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room) "boM" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Bridge Conference Room"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"boN" = (/obj/machinery/power/apc{dir = 1; name = "Conference Room APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"boN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge) "boO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/wood,/area/bridge/meeting_room) "boP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "boQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3484,7 +3484,7 @@ "boZ" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bpa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bpb" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bpc" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Captain's Office APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bpc" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/port) "bpd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bpe" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bpf" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) @@ -3567,9 +3567,9 @@ "bqE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"bqH" = (/obj/structure/cable,/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bqJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 7"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"bqJ" = (/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) "bqK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit) "bqM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit) @@ -3663,7 +3663,7 @@ "bsw" = (/obj/structure/table,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/aiModule/crewsimov,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bsx" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) "bsy" = (/obj/machinery/computer/aiupload,/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bsz" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "AI Upload APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bsz" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) "bsA" = (/obj/machinery/computer/borgupload,/obj/item/device/radio/intercom/private{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bsB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) "bsC" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneCrewMember,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/antimov,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) @@ -3675,7 +3675,7 @@ "bsI" = (/mob/living/simple_animal/pet/fox/Renault,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bsJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bsK" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8; network = list("SS13")},/obj/item/weapon/storage/lockbox/medal,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bsL" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Central Hall East APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east) +"bsL" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bsM" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/east) "bsN" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bsO" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/starboard/west) @@ -3686,14 +3686,14 @@ "bsT" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) "bsU" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/hallway/primary/starboard/west) "bsV" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) -"bsW" = (/obj/machinery/power/apc{dir = 2; name = "Starboard Hall West APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) +"bsW" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bsX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bsY" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 3"; dir = 1; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bsZ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bta" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "btb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "btc" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"btd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"btd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Sout-West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) "bte" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east) "btf" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east) "btg" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit) @@ -3729,7 +3729,7 @@ "btK" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office) "btL" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/office) "btM" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west) -"btN" = (/obj/machinery/power/apc{dir = 4; name = "Central Hall West APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west) +"btN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "btO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/bridge/meeting_room) "btP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_y = -30},/turf/simulated/floor/wood,/area/bridge/meeting_room) "btQ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3753,7 +3753,7 @@ "bui" = (/turf/simulated/wall,/area/medical/morgue) "buj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/exam_room) "buk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/permabrig) -"bul" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"bul" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "bum" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/starboard/east) "bun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "buo" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/starboard/east) @@ -3839,10 +3839,10 @@ "bvQ" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bvR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bvS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bvT" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "Morgue APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) +"bvT" = (/obj/structure/cable,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bvU" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bvV" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/plasteel,/area/medical/morgue) -"bvW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"bvW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "bvX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bvY" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bvZ" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) @@ -3917,7 +3917,7 @@ "bxq" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bxr" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bxs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bxt" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Exam Room APC"; pixel_x = 25},/obj/structure/closet/secure_closet/exam,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"bxt" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east) "bxu" = (/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) "bxv" = (/turf/simulated/floor/plasteel,/area/medical/morgue) "bxw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue) @@ -3925,13 +3925,13 @@ "bxy" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bxz" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) "bxA" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) -"bxB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"bxB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "bxC" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bxD" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bxE" = (/obj/machinery/door_control{dir = 2; id = "mechbay"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) "bxF" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/chargebay) "bxG" = (/turf/simulated/wall,/area/assembly/robotics) -"bxH" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Robotics Lab APC"; pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) +"bxH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bxI" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bxJ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bxK" = (/obj/machinery/camera{c_tag = "Research Robotics Lab"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics) @@ -3983,7 +3983,7 @@ "byE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/security/permabrig) "byF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "byG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/maintcentral) -"byH" = (/obj/machinery/power/apc{dir = 1; name = "Bridge Maintenance APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/maintcentral) +"byH" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west) "byI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "byJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room) "byK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/computer/account_database{anchored = 1},/turf/simulated/floor/plasteel,/area/bridge/meeting_room) @@ -4081,7 +4081,7 @@ "bAy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bAz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room) "bAA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/bridge/meeting_room) -"bAB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts uplink terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room) +"bAB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South-East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) "bAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room) "bAD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space) "bAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/space,/area/space) @@ -4177,7 +4177,7 @@ "bCq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/lattice,/turf/space,/area/space) "bCr" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) "bCs" = (/obj/machinery/light{dir = 4},/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) -"bCt" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Captain's Quarters APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"bCt" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bCu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bCv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bCw" = (/obj/machinery/door/airlock{name = "Private Restroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) @@ -4265,12 +4265,12 @@ "bEa" = (/obj/machinery/computer/secure_data,/obj/machinery/flasher_button{id = "hopflash"; pixel_x = 6; pixel_y = 36},/obj/machinery/door_control{id = "hopqueue"; name = "Queue Privacy Shutters Control"; pixel_x = -4; pixel_y = 25; req_access_txt = "28"},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 6; pixel_y = 25; req_access_txt = "28"},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 36},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads) "bEb" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/break_room) "bEc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/recharger/wallcharger{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) -"bEd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "Head of Personnel APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/photocopier,/turf/simulated/floor/plasteel,/area/crew_quarters/heads) +"bEd" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bEe" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bEf" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bEg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bEh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) -"bEi" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) +"bEi" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/closet/secure_closet/exam,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bEj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bEk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/space,/area/space) "bEl" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) @@ -4281,7 +4281,7 @@ "bEq" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain) "bEr" = (/turf/simulated/wall,/area/crew_quarters/captain) "bEs" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) -"bEt" = (/obj/machinery/power/apc{dir = 4; name = "Central Hall SE APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) +"bEt" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bEu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/chemistry) "bEv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/chemistry) "bEw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) @@ -4292,7 +4292,7 @@ "bEB" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/reception) "bEC" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception) "bED" = (/turf/simulated/floor/plasteel,/area/medical/reception) -"bEE" = (/obj/machinery/power/apc{dir = 2; name = "Medbay Reception APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 11; pixel_y = -22},/turf/simulated/floor/plasteel,/area/medical/reception) +"bEE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bEF" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access_txt = "5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/medical/reception) "bEG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception) "bEH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception) @@ -4317,7 +4317,7 @@ "bFa" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bFb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bFc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bFd" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Research and Development APC"; pixel_x = 26; pixel_y = 0},/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"bFd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/dresser,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bFe" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bFf" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research) "bFg" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/research) @@ -4370,7 +4370,7 @@ "bGb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry) "bGc" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bGd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/chemistry) -"bGe" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2) +"bGe" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/holofloor,/area/security/permabrig) "bGf" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2) "bGg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/medbay3) "bGh" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay3) @@ -4437,7 +4437,7 @@ "bHq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bHr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bHs" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads) -"bHt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 2; name = "Engineering Control Room APC"; pixel_y = -24; shock_proof = 1},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/engine/controlroom) +"bHt" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bHu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bHv" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bHw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) @@ -4478,7 +4478,7 @@ "bIf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bIg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bIh" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bIi" = (/obj/machinery/power/apc{dir = 4; name = "Mech Bay APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) +"bIi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/photocopier,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bIj" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/assembly/robotics) "bIk" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 4; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics) "bIl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -4531,7 +4531,7 @@ "bJg" = (/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry) "bJh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/wardrobe/chemistry_white,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry) "bJi" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry) -"bJj" = (/obj/machinery/power/apc{dir = 4; name = "Chemistry/Med APC"; pixel_x = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bJj" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 11; pixel_y = -22},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception) "bJk" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bJl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2) "bJm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3) @@ -4581,7 +4581,7 @@ "bKe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research_shuttle_dock) "bKf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bKg" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne) -"bKh" = (/obj/machinery/power/apc{dir = 1; name = "Genetics Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/genetics) +"bKh" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/structure/table/glass,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bKi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics) "bKj" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/genetics) "bKk" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research) @@ -4601,13 +4601,13 @@ "bKy" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bKz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/heads) "bKA" = (/obj/machinery/message_server,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server) -"bKB" = (/obj/machinery/power/apc{dir = 1; name = "Messaging Server APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/floor/bluegrid,/area/server) +"bKB" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/genetics) "bKC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) "bKD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/server) "bKE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) "bKF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator) "bKG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/space) -"bKH" = (/obj/machinery/power/apc{dir = 8; name = "Teleporter APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/teleporter) +"bKH" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bKI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/teleporter) "bKJ" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter) "bKK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel,/area/teleporter) @@ -4624,7 +4624,7 @@ "bKV" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3) "bKW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3) "bKX" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3) -"bKY" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/machinery/power/apc{dir = 4; name = "Medbay Equipment APC"; pixel_x = 25},/obj/structure/cable,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3) +"bKY" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bKZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bLa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2) "bLb" = (/turf/simulated/wall,/area/medical/cryo) @@ -4710,7 +4710,7 @@ "bMD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bME" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bMF" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical1,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics) -"bMG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/camera{c_tag = "Research Genetics North"; network = list("Research","SS13")},/obj/machinery/power/apc{dir = 1; name = "Genetics APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics) +"bMG" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bMH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics) "bMI" = (/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/weapon/hand_labeler,/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics) "bMJ" = (/obj/structure/closet/wardrobe/genetics_white,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics) @@ -4792,7 +4792,7 @@ "bOh" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bOi" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bOj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) -"bOk" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) +"bOk" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server) "bOl" = (/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning,/obj/item/weapon/storage/box/bodybags,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bOm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bOn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) @@ -4823,7 +4823,7 @@ "bOM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bON" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep) "bOO" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research_shuttle_dock) -"bOP" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) +"bOP" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/teleporter) "bOQ" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) "bOR" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock) "bOS" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock) @@ -4904,14 +4904,14 @@ "bQp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bQq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bQr" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) -"bQs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Central Hall SW APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) +"bQs" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3) "bQt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bQu" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bQv" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bQw" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south) "bQx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south) "bQy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south) -"bQz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Central Hall South APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) +"bQz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/camera{c_tag = "Research Genetics North"; network = list("Research","SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics) "bQA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "bQB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "bQC" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) @@ -4951,17 +4951,17 @@ "bRk" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bRl" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bRm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/medical/genetics_cloning) -"bRn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) +"bRn" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bRo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bRp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bRq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bRr" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor) "bRs" = (/obj/machinery/r_n_d/server/robotics,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "bRt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) -"bRu" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "Server Coldroom APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) +"bRu" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) "bRv" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/toxins/server) "bRw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) -"bRx" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/machinery/power/apc{dir = 1; name = "Server Room APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) +"bRx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bRy" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 73; dir = 2; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "bRz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/area_atmos,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "bRA" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) @@ -5114,7 +5114,7 @@ "bUr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bUs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bUt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/hor) -"bUu" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) +"bUu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "bUv" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bUw" = (/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("Research","SS13")},/obj/item/clothing/glasses/welding/superior,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bUx" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -5170,7 +5170,7 @@ "bVv" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo) "bVw" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo) "bVx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo) -"bVy" = (/obj/machinery/power/apc{dir = 4; name = "CMO Office APC"; pixel_x = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo) +"bVy" = (/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bVz" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2) "bVA" = (/turf/simulated/wall,/area/medical/medbreak) "bVB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/door_control{id = "staffroom"; name = "Staff Room Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak) @@ -5226,7 +5226,7 @@ "bWz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/blueshield) "bWA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/blueshield) "bWB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/blueshield) -"bWC" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 4; name = "Blueshield Office APC"; pixel_x = 24; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/blueshield) +"bWC" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "bWD" = (/obj/structure/table,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bWE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/ntrep) "bWF" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/ntrep) @@ -5278,7 +5278,7 @@ "bXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics) "bXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics) "bXB" = (/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics) -"bXC" = (/obj/machinery/power/apc{dir = 1; name = "Telescience Pad APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/engine,/area/toxins/explab_chamber) +"bXC" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "bXD" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab_chamber) "bXE" = (/turf/simulated/floor/engine,/area/toxins/explab_chamber) "bXF" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Chamber"; dir = 2; network = list("Telepad","Research","SS13"); pixel_x = 0},/obj/machinery/light{dir = 1; on = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/engine,/area/toxins/explab_chamber) @@ -5289,7 +5289,7 @@ "bXK" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "bXL" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "bXM" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/decal/warning_stripes/yellow,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) -"bXN" = (/obj/machinery/power/apc{dir = 8; name = "Misc Research APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bXN" = (/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bXO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bXP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bXQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5326,17 +5326,17 @@ "bYv" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bYw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/janitor) "bYx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Janitor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor) -"bYy" = (/obj/machinery/power/apc{dir = 8; name = "Custodial Closet APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/janitor) +"bYy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump Important Area"; pixel_x = 24; shock_proof = 0},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo) "bYz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor) "bYA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/janitor) "bYB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/janitor) "bYC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/janitor) "bYD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bYE" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic) -"bYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/amb_trolley,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) +"bYE" = (/obj/structure/stool/bed/amb_trolley,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) +"bYF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic) "bYG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic) -"bYH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) -"bYI" = (/obj/structure/closet/secure_closet/paramedic,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) +"bYH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) +"bYI" = (/obj/structure/closet/secure_closet/paramedic,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) "bYJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute2"; name = "Acute 2 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "bYK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bYL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) @@ -5407,7 +5407,7 @@ "bZY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/paramedic) "bZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/paramedic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) "caa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) -"cab" = (/obj/machinery/light,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "Paramedic APC"; pixel_y = -24},/obj/machinery/camera{c_tag = "Paramedic Bay"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) +"cab" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield) "cac" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) "cad" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) "cae" = (/obj/machinery/door_control{id = "acute2"; name = "Acute 2 Shutters Control"; pixel_x = 6; pixel_y = -25},/obj/machinery/door_control{id = "scansep"; name = "Scanning Room Separation Shutters Control"; pixel_x = -6; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) @@ -5470,10 +5470,10 @@ "cbj" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "cbk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cbl" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"cbm" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/janitor) -"cbn" = (/obj/machinery/power/apc{dir = 8; name = "Medbay Maintenance APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbm" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbn" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep) "cbo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Paramedic Maintenance"; req_access_txt = "66"},/turf/simulated/floor/plating,/area/medical/paramedic) +"cbp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Paramedic Maintenance"; req_access_txt = "66"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbq" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "scansep"; name = "Scanning Room Separation Shutters"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "cbr" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "cbs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) @@ -5498,7 +5498,7 @@ "cbL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/medical/psych) "cbM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/medical/psych) "cbN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/medical/psych) -"cbO" = (/obj/machinery/camera{c_tag = "Medbay Psych Office"; dir = 8; network = list("SS13")},/obj/machinery/power/apc{dir = 4; name = "Psychiatrist APC"; pixel_x = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/medical/psych) +"cbO" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/engine,/area/toxins/explab_chamber) "cbP" = (/turf/simulated/wall/r_wall,/area/toxins/explab) "cbQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab) "cbR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/engine,/area/toxins/explab) @@ -5538,7 +5538,7 @@ "ccz" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "ccA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint) "ccB" = (/obj/structure/stool/bed,/turf/simulated/floor/plating,/area/maintenance/apmaint) -"ccC" = (/obj/machinery/power/apc{dir = 2; name = "Cargo Maintenance APC"; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"ccC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "ccD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "ccE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; name = "HoP Office"; sortType = 15},/turf/simulated/floor/plating,/area/maintenance/apmaint) "ccF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) @@ -5596,7 +5596,7 @@ "cdF" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/toxins/explab) "cdG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/toxins/explab) "cdH" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/toxins/explab) -"cdI" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "Toxins Storage APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) +"cdI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/janitor) "cdJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "cdK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cdL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -5773,7 +5773,7 @@ "cha" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"chd" = (/obj/structure/table,/obj/machinery/power/apc{dir = 8; name = "Toxins Research APC"; pixel_x = -25},/obj/structure/cable,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) +"chd" = (/obj/machinery/light,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Paramedic Bay"; dir = 1; network = list("SS13")},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic) "che" = (/obj/structure/table,/obj/item/device/assembly/signaler{pixel_x = 8; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/signaler{pixel_x = 3; pixel_y = 4},/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "chf" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "chg" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -5853,9 +5853,9 @@ "ciC" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/toxins/test_area) "ciD" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber East"; dir = 8; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) "ciE" = (/turf/simulated/wall/r_wall,/area/storage/tech) -"ciF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Atmospherics Control Room"; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "Atmospherics Control APC"; pixel_y = 26; shock_proof = 1},/obj/structure/table,/obj/item/weapon/book/manual/atmospipes,/obj/item/device/multitool{pixel_x = 5},/turf/simulated/floor/plasteel,/area/atmos/control) +"ciF" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ciG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech) -"ciH" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "Tech Storage APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cyborgrecharger{pixel_x = -4; pixel_y = -2},/obj/item/weapon/circuitboard/mech_bay_power_console{pixel_x = 2; pixel_y = 2},/obj/item/weapon/circuitboard/mech_recharger,/obj/item/weapon/circuitboard/mechfab{pixel_y = 3},/turf/simulated/floor/plating,/area/storage/tech) +"ciH" = (/obj/machinery/camera{c_tag = "Medbay Psych Office"; dir = 8; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/carpet,/area/medical/psych) "ciI" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plating,/area/storage/tech) "ciJ" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech) "ciK" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating,/area/storage/tech) @@ -5875,11 +5875,11 @@ "ciY" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/sleeper) "ciZ" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper) "cja" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper) -"cjb" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "Medbay Treatment Center APC"; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/sleeper) +"cjb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cjc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Scanning Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "cjd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2) "cje" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) -"cjf" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 4},/obj/machinery/power/apc{dir = 2; name = "Medbay APC"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) +"cjf" = (/obj/machinery/light_switch{pixel_y = -23},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "cjg" = (/obj/structure/stool/bed/roller,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/security/medbay) "cjh" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) "cji" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) @@ -5897,7 +5897,7 @@ "cju" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/genetics) "cjv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/medbay2) "cjw" = (/obj/machinery/light,/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cjx" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "E.X.P.E.R.I-MENTOR Lab APC"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cjx" = (/obj/structure/table,/obj/structure/cable,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cjy" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Lab"; dir = 1; network = list("Research","SS13")},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cjz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cjA" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) @@ -5934,13 +5934,13 @@ "ckf" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/plasteel,/area/engine/controlroom) "ckg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/controlroom) "ckh" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom) -"cki" = (/obj/machinery/power/apc{dir = 1; name = "Construction Area APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) +"cki" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2; network = list("SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cyborgrecharger{pixel_x = -4; pixel_y = -2},/obj/item/weapon/circuitboard/mech_bay_power_console{pixel_x = 2; pixel_y = 2},/obj/item/weapon/circuitboard/mech_recharger,/obj/item/weapon/circuitboard/mechfab{pixel_y = 3},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/tech) "ckj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "ckk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "ckl" = (/turf/simulated/wall,/area/medical/ward) "ckm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/ward) "ckn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"cko" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"cko" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "ckp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/ward) "ckq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/ward) "ckr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/ward) @@ -6010,9 +6010,9 @@ "clD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clG" = (/obj/machinery/power/apc{dir = 1; name = "Recovery Ward APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clG" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/sleeper) "clH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clJ" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) @@ -6059,7 +6059,7 @@ "cmA" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Gas Pump"; on = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cmB" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cmC" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cmD" = (/obj/machinery/power/apc{dir = 4; name = "Incinerator APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cmD" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "cmE" = (/obj/machinery/light/small{dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cmF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/storage/tech) "cmG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/tech) @@ -6074,7 +6074,7 @@ "cmP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cmQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/wall,/area/engine/controlroom) "cmR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/engine/controlroom) -"cmS" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Engineering Foyer APC"; pixel_x = -24; shock_proof = 1},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel,/area/engine/break_room) +"cmS" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/item/device/radio,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cmT" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cmU" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/engine/controlroom) "cmV" = (/obj/machinery/camera{c_tag = "Engineering Construction Area"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) @@ -6088,7 +6088,7 @@ "cnd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "cne" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) "cnf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/genetics) -"cng" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Science Maintenance APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cng" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cnh" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cni" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2) "cnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/medical/biostorage) @@ -6149,7 +6149,7 @@ "com" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "coo" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "coq" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cor" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/engine/break_room) "cos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6158,7 +6158,7 @@ "cov" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) "cow" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage) "cox" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/medical/biostorage) -"coy" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Storage APC"; pixel_x = 25},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) +"coy" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "coz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint) "coA" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint) "coB" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/effect/decal/warning_stripes/southwestcorner,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -6170,7 +6170,7 @@ "coH" = (/obj/structure/closet/bombcloset,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "coI" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/camera{c_tag = "Research Test Lab West"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "coJ" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) -"coK" = (/obj/machinery/power/apc{dir = 1; name = "Testing Lab APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) +"coK" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "coL" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/table,/obj/item/device/radio/electropack,/obj/item/device/assembly/signaler,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "coM" = (/obj/structure/table,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/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/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"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "coN" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) @@ -6206,7 +6206,7 @@ "cpr" = (/obj/machinery/requests_console{department = "Tech Storage"; name = "Tech Storage Requests Console"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech) "cps" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech) "cpt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/storage/tech) -"cpu" = (/obj/machinery/power/apc{name = "Aft Hall APC"; dir = 8; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) +"cpu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cpv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cpw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/medbay2) "cpx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6217,14 +6217,14 @@ "cpC" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cpD" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cpE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) -"cpF" = (/turf/simulated/wall,/area/medical/surgery) -"cpG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/surgery) -"cpH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cpI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) -"cpJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) -"cpK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cpF" = (/turf/simulated/wall,/area/medical/surgery1) +"cpG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/surgery1) +"cpH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery1) +"cpI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cpJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery1) +"cpK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery2) "cpL" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Genetics Maintenance"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/maintenance/genetics) -"cpM" = (/turf/simulated/wall/r_wall,/area/medical/surgery) +"cpM" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/surgery1) "cpN" = (/turf/simulated/floor/plasteel,/area/medical/biostorage) "cpO" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/biostorage) "cpP" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage) @@ -6247,7 +6247,7 @@ "cqg" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "cqh" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cqi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) -"cqj" = (/obj/machinery/power/apc{dir = 4; name = "Explosives Testing APC"; pixel_x = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/toxins/test_area) +"cqj" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) "cqk" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber South"; dir = 1; network = list("Toxins","Research","SS13")},/obj/machinery/light,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) "cql" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cqm" = (/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/incinerator) @@ -6271,15 +6271,15 @@ "cqE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cqF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cqG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) -"cqH" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/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"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cqH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery2) "cqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/window/westright{dir = 8; icon_state = "left"; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/wood,/area/crew_quarters/courtroom) -"cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cqK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cqL" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cqM" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cqJ" = (/turf/simulated/wall,/area/medical/surgery2) +"cqK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/surgery2) +"cqM" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cqN" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/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"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cqO" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cqP" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/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"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cqP" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cqQ" = (/obj/machinery/light{dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/medbay2) "cqR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cqS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6294,7 +6294,7 @@ "crb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "crc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "crd" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) -"cre" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/obj/machinery/power/apc{dir = 1; name = "Atmospherics Distribution Loop APC"; pixel_y = 24; shock_proof = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/atmos/distribution) +"cre" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "crf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "crg" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "crh" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/toxins/test_area) @@ -6311,7 +6311,7 @@ "crs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/drone_fabricator,/turf/simulated/floor/plasteel,/area/engine/controlroom) "crt" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cru" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/computer/drone_control,/turf/simulated/floor/plasteel,/area/engine/controlroom) -"crv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/medical/surgery) +"crv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "crw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "crx" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cry" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) @@ -6319,9 +6319,9 @@ "crA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "crB" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine) "crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"crD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery) -"crE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery) -"crF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"crD" = (/obj/machinery/body_scanconsole,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"crE" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"crF" = (/obj/machinery/bodyscanner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "crG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "crH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "crI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6353,7 +6353,7 @@ "csi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/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/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop) "csj" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 7; name = "Research Director Requests Console"; pixel_x = -2; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "csk" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop) -"csl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 1; name = "Mechanic Workshop APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop) +"csl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "csm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Mechanic's Workshop East"; dir = 2; network = list("SS13")},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop) "csn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop) "cso" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/mechanic_workshop) @@ -6372,7 +6372,7 @@ "csB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) "csC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "csD" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft) -"csE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/medical/surgery) +"csE" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "csF" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plasteel,/area/engine/controlroom) "csG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/asmaint2) "csH" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/turf/space,/area/shuttle/syndicate_sit) @@ -6383,16 +6383,16 @@ "csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/atmos/control) "csN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/control) "csO" = (/turf/simulated/wall/r_wall,/area/atmos/control) -"csP" = (/obj/machinery/body_scanconsole,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csU" = (/obj/machinery/bodyscanner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"csP" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"csQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"csR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"csS" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/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"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"csT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"csU" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"csV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"csW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"csX" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"csY" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "csZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_a) "cta" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "ctb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_a) @@ -6444,20 +6444,20 @@ "ctV" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/break_room) "ctW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos/control) "ctX" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/control) -"ctY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "Engineering Equipment APC"; pixel_x = -24; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"ctY" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "ctZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/control) "cua" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/atmos/control) "cub" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cuc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/surgery) -"cud" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cue" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuf" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cug" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cui" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuk" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cul" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cuc" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cud" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cue" = (/turf/simulated/wall/r_wall,/area/medical/surgery2) +"cuf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cug" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cuh" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cui" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cuj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cuk" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cul" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cum" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cun" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cuo" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms) @@ -6510,10 +6510,10 @@ "cvj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel,/area/atmos/control) "cvk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel,/area/atmos/control) "cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cvm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery) -"cvn" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cvo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cvp" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvm" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cvn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cvo" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cvp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "cvq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cvr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cvs" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -6554,20 +6554,20 @@ "cwb" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/control) "cwc" = (/turf/simulated/floor/plasteel,/area/atmos/control) "cwd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/engineering,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/atmos/control) -"cwe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/surgery) -"cwf" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwg" = (/obj/machinery/power/apc{dir = 2; name = "Surgery APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwi" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwl" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cwf" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery2) +"cwg" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/consarea) +"cwh" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cwi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/surgery1) +"cwj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cwk" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cwl" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"cwm" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cwn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cwo" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwo" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cwp" = (/turf/space,/area/maintenance/asmaint) "cwq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) -"cwr" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery) +"cwr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cws" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_a) "cwt" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cwu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -6633,7 +6633,7 @@ "cxC" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit) "cxD" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit) "cxE" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Cell Door"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit) -"cxF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cxF" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "cxG" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cxH" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cxI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) @@ -6671,7 +6671,7 @@ "cyo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cyp" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft) "cyq" = (/turf/simulated/wall,/area/engine/break_room) -"cyr" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25; shock_proof = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) +"cyr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop) "cys" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/landmark/start{name = "Life Support Specialist"},/turf/simulated/floor/plasteel,/area/engine/break_room) "cyt" = (/obj/structure/table,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/break_room) "cyu" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/landmark/start{name = "Life Support Specialist"},/turf/simulated/floor/plasteel,/area/engine/break_room) @@ -6685,8 +6685,8 @@ "cyC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cyF" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/surgery) -"cyG" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cyF" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"cyG" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "cyH" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyI" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cyJ" = (/turf/simulated/wall,/area/maintenance/asmaint2) @@ -6779,11 +6779,11 @@ "cAs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cAt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cAu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) -"cAv" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Xenobiology APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/toxins/xenobiology) +"cAv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Atmospherics Control Room"; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table,/obj/item/weapon/book/manual/atmospipes,/obj/item/device/multitool{pixel_x = 5},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/control) "cAw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/engine/break_room) "cAx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/break_room) "cAy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room) -"cAz" = (/obj/machinery/power/apc{dir = 4; name = "Centcomm Rep APC"; pixel_x = 24; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/ntrep) +"cAz" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "cAA" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/engine/break_room) "cAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/engine/break_room) "cAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/atmos/control) @@ -6795,7 +6795,7 @@ "cAI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos/distribution) "cAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/wall/r_wall,/area/atmos/distribution) "cAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/distribution) -"cAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cAL" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution) "cAM" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cAN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cAO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/toxins/xenobiology) @@ -6811,7 +6811,7 @@ "cAY" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cAZ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cBb" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/power/apc{dir = 2; name = "Test Chamber APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/engine,/area/toxins/test_chamber) +"cBb" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) "cBc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBd" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/clipboard,/obj/item/weapon/hand_labeler,/turf/simulated/floor/engine,/area/toxins/test_chamber) "cBe" = (/obj/structure/closet,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line) @@ -6832,7 +6832,7 @@ "cBt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/engine/break_room) "cBu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room) "cBv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room) -"cBw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) +"cBw" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/security/permabrig) "cBx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) "cBy" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) "cBz" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) @@ -6851,7 +6851,7 @@ "cBM" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution) "cBN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/distribution) -"cBP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cBP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery1) "cBQ" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBR" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cBS" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -6934,14 +6934,14 @@ "cDr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/chiefs_office) "cDs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/chiefs_office) "cDt" = (/turf/simulated/wall/r_wall,/area/engine/chiefs_office) -"cDu" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "Engineering Hardsuit Storage APC"; pixel_y = 24; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage) +"cDu" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) "cDv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cDw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cDx" = (/obj/machinery/camera{c_tag = "Engineering Equipment North"; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cDy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cDz" = (/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) -"cDA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) -"cDB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos) +"cDA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway) +"cDB" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2) "cDC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cDD" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cDE" = (/turf/simulated/floor/plasteel,/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos) @@ -7004,7 +7004,7 @@ "cEJ" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cEK" = (/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cEL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) -"cEM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cEM" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "cEN" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cEO" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cEP" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution) @@ -7019,7 +7019,7 @@ "cEY" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_b) "cEZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/medical/virology) "cFa" = (/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) -"cFb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) +"cFb" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room) "cFc" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFd" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFe" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) @@ -7054,14 +7054,14 @@ "cFH" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft) "cFI" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) "cFJ" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/engineering) -"cFK" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering Northwest"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering) +"cFK" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 4"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "cFL" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering) -"cFM" = (/obj/machinery/power/apc{dir = 4; name = "Aft Port Solar APC"; pixel_x = 23; pixel_y = 2; shock_proof = 1},/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1; network = list("SS13")},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cFM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cFN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/hardsuitstorage) "cFO" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage) "cFP" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage) "cFQ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage) -"cFR" = (/obj/machinery/power/apc{dir = 4; name = "CE Office APC"; pixel_x = 24; pixel_y = 0; shock_proof = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) +"cFR" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/northwestcorner,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/toxins/xenobiology) "cFS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/engine/chiefs_office) "cFT" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/obj/structure/table/reinforced,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/device/megaphone,/obj/item/device/lock_buster,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cFU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/firecloset,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = -30},/turf/simulated/floor/plasteel,/area/atmos) @@ -7104,7 +7104,7 @@ "cGF" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port) "cGG" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "cGH" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cGI" = (/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Engineering Shuttle Access APC"; pixel_x = 0; pixel_y = 25; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cGI" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/engine,/area/toxins/test_chamber) "cGJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cGK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) "cGL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -7140,7 +7140,7 @@ "cHp" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution) "cHq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution) "cHr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cHs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Secure Storage APC"; pixel_x = 0; pixel_y = 25; shock_proof = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure) +"cHs" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/power/apc{cell_type = 25000; dir = 1; name = "Engineering Engine Super APC"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) "cHt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution) "cHu" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution) "cHv" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/space) @@ -7220,7 +7220,7 @@ "cIR" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) "cIS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cIT" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cIU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cIV" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cIW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology) "cIX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -7237,7 +7237,7 @@ "cJi" = (/obj/machinery/camera{c_tag = "Engineering Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cJk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) -"cJl" = (/obj/machinery/power/apc{dir = 8; name = "Atmospherics APC"; pixel_x = -24; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plasteel,/area/atmos) +"cJl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage) "cJm" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cJn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/radio/headset/headset_eng,/obj/item/device/multitool{pixel_x = 5},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cJo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/weapon/crowbar/large,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -7289,7 +7289,7 @@ "cKi" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/starboard) "cKj" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cKk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cKl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) +"cKl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/aft) "cKm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cKn" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cKo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) @@ -7619,7 +7619,7 @@ "cQA" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering) "cQB" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel,/area/engine/engineering) "cQC" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_east_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) -"cQD" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cQD" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump Engineering"; pixel_x = 24; shock_proof = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cQE" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "cQF" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "cQG" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plasteel,/area/atmos) @@ -7883,11 +7883,11 @@ "cVE" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) "cVF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) "cVG" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate) -"cVH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "AI Satellite Antechamber APC"; pixel_x = 25},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) +"cVH" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure) "cVI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) "cVJ" = (/turf/simulated/wall,/area/turret_protected/aisat_interior) "cVK" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Mini Satellite Teleporter"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) -"cVL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) +"cVL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cVM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior) "cVN" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "cVO" = (/turf/simulated/wall/r_wall,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"}) @@ -7928,7 +7928,7 @@ "cWx" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) "cWy" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera{c_tag = "AI Satellite Service Bay"; dir = 8; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"}) "cWz" = (/obj/effect/decal/warning_stripes/northeast,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) -"cWA" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "AI Satellite Atmospherics APC"; pixel_x = -25},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"}) +"cWA" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1; network = list("SS13")},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cWB" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai) "cWC" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"}) "cWD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"}) @@ -7941,7 +7941,7 @@ "cWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) "cWL" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "cWM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) -"cWN" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "AI Satellite Service Bay APC"; pixel_x = 25},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"}) +"cWN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos) "cWO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "cWP" = (/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "cWQ" = (/obj/effect/decal/warning_stripes/east,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) @@ -7980,7 +7980,7 @@ "cXx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"}) "cXy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/porta_turret{dir = 8; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) -"cXA" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior West"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat) +"cXA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "cXB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) @@ -7995,7 +7995,7 @@ "cXM" = (/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXN" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "AI Satellite Hallway"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) -"cXP" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "AI Satellite Hallway APC"; pixel_x = 25},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) +"cXP" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cXQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"}) "cXR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "cXS" = (/turf/simulated/floor/plating,/area/aisat) @@ -8144,7 +8144,7 @@ "daF" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "daG" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/structure/lattice,/turf/space,/area/space) "daH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine,/area/maintenance/turbine) -"daI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/maintenance/asmaint) +"daI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "daJ" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/binary/pump{name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "daK" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint) "daL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -8219,7 +8219,7 @@ "dcc" = (/obj/machinery/light,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/medical/patients_rooms) "dcd" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "dce" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms) -"dcf" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) +"dcf" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "dcg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms) "dch" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms) "dci" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/patients_rooms) @@ -8237,7 +8237,7 @@ "dcu" = (/obj/machinery/light{dir = 4},/obj/structure/dresser,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "dcv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) "dcw" = (/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) -"dcx" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/medical/virology) +"dcx" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcy" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) "dcz" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology) "dcA" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) @@ -8247,7 +8247,7 @@ "dcE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/engineering) "dcF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/engineering) "dcG" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"dcH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/medical/virology) +"dcH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcI" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcJ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcK" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -8325,7 +8325,7 @@ "dee" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "def" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "deg" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) -"deh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"deh" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) "dei" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dej" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "dek" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) @@ -8556,7 +8556,7 @@ "diB" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diC" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "diD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"diE" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"diE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "diF" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diH" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) @@ -8713,7 +8713,7 @@ "dlC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/space,/area/shuttle/constructionsite) "dlD" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4) "dlE" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"dlF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dlF" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "dlG" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dlH" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/hydroponics) "dlI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) @@ -8833,7 +8833,7 @@ "dnS" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel,/area/maintenance/consarea) "dnT" = (/obj/item/stack/rods{amount = 8},/turf/simulated/floor/plating,/area/maintenance/consarea) "dnU" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/maintenance/consarea) -"dnV" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Alternate Construction Area APC"; pixel_x = 25},/turf/simulated/floor/plating,/area/maintenance/consarea) +"dnV" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"}) "dnW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop) "dnX" = (/obj/machinery/door/airlock/maintenance{name = "Mechanic Workshop Maintenance"; req_access = null; req_access_txt = "70"},/turf/simulated/floor/plating,/area/maintenance/aft) "dnY" = (/obj/machinery/door_control{id = "syndicate_sit_1"; name = "Blast Doors"; pixel_x = 3; pixel_y = -28; range = 20; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit) @@ -8858,7 +8858,7 @@ "dor" = (/obj/effect/spawner/window/reinforced,/turf/simulated/wall,/area/maintenance/aft) "dos" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft) "dot" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft) -"dou" = (/obj/machinery/power/apc{dir = 8; name = "Aft Maintenance APC"; pixel_x = -24},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/aft) +"dou" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "dov" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/aft) "dow" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint) "dox" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/apmaint) @@ -8895,7 +8895,7 @@ "dpc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "dpd" = (/turf/simulated/wall/r_wall,/area/clownoffice) "dpe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/wood,/area/clownoffice) -"dpf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Prisoner Cell Block B APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) +"dpf" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/motion{c_tag = "AI Core"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "dpg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) "dph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) "dpi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) @@ -8905,14 +8905,14 @@ "dpm" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock) "dpn" = (/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock) "dpo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"dpp" = (/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpp" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos) "dpq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpr" = (/obj/machinery/camera{c_tag = "Prison East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dps" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpu" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpv" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"dpw" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/holofloor,/area/security/permabrig) +"dpw" = (/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "dpx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) "dpy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/holofloor,/area/security/permabrig) "dpz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig) @@ -8936,7 +8936,7 @@ "dpR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit) "dpS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpT" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/apc{dir = 4; name = "Prison Cell Block A APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "dpV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "dpW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) "dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig) @@ -8963,13 +8963,13 @@ "dqs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) "dqt" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) "dqu" = (/obj/machinery/door_control{id = "Prison Lockdown 3"; name = "Cell 3 Lockdown"; pixel_x = 24; pixel_y = 3; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig) -"dqv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "dqw" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig) "dqx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) "dqy" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) "dqz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dqA" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) -"dqB" = (/obj/machinery/power/apc{name = "Prison Wing APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "dqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dqD" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) "dqE" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) @@ -8989,18 +8989,18 @@ "dqS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig) "dqT" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "dqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig) -"dqV" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dqW" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dqX" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dqY" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dqZ" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dra" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"drb" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"drc" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"drd" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dqV" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"dqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/surgery1) +"dqX" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"dqY" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"dqZ" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"dra" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"drb" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"drc" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1) +"drd" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) "drf" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) -"drg" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) +"drg" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"}) "drh" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) "dri" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_sit_1"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_sit) "drj" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit) @@ -9020,14 +9020,14 @@ "drx" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "dry" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/door/window/southright{dir = 1; name = "AI Core Door"; req_access = null; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "drz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/turretid/lethal{check_synth = 1; name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; req_access_txt = "75"},/obj/machinery/flasher{id = "AI"; pixel_x = -8; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"drA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{aidisabled = 0; cell_type = 5000; dir = 2; name = "AI Core APC"; pixel_x = 5; pixel_y = -24},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/motion{c_tag = "AI Core"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"drA" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) "drB" = (/obj/item/device/radio/intercom/custom{pixel_x = -28; pixel_y = -10},/obj/item/device/radio/intercom/private{pixel_x = 28; pixel_y = -10},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/requests_console{department = "AI"; departmentType = 5; name = "AI Requests Console"; pixel_x = 32; pixel_y = -32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = -32},/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "drC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "drD" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai) "drE" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = -28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "drF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "drG" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = 28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"drH" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South West"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai) +"drH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts Uplink Terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room) "drI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "drJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "drK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall,/area/turret_protected/ai) @@ -9035,6 +9035,21 @@ "drM" = (/obj/machinery/camera/motion{c_tag = "AI Core South"; dir = 2; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "drN" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "drO" = (/obj/machinery/camera{c_tag = "AI Satellite Exterior South"; dir = 2; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai) +"drP" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint) +"drQ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint) +"drR" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering North-West"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering) +"drS" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat) +"drT" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai) +"drU" = (/obj/structure/table/glass,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"drV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"drW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"drX" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2) +"drY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/surgery2) +"drZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/medical/surgery2) +"dsa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dsb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/medical/surgery2) +"dsc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dsd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) "YDt" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 6; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 4; pixel_y = 3},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -4; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -6; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) (1,1,1) = {" @@ -9084,159 +9099,159 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaabaalaaLaaNaaMaayaaOaalbikbikaabaalaaPaaRaaQaalaalaalbikbikaabaabaabaacbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaalaaSaaTaaMaaVaaUaalbikaabaabaalaaWabhaaXabtaaYaalbikaabaabaacaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaalaaBaalaaZaatabaabbaataalabcaanaaoaalabdabeabxaataataalaalaalaalaalaalaalaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaatabwabwabzabyabyaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaataekabwabzabyaiwaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBabDabCaaDaaMabEaayaayabFabGaavabIabHabJaaGaavabMabNaatabOabOabQabPabPaaBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikaalabRaaHabSaaHabTabVabUabYabXacaabZaccacbacfaceabZacjacjacFahdahcbnHahedhqbnIbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavdiEdiDdkJdiIdpodkKdkJdkJdpqdppdpsdprdkJdptdpudkJdkJdpvdpxdpwdpydpwabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavaiWdiDdkJdiIdpodkKdkJdkJdpqakjdpsdprdkJdptdpudkJdkJdpvdpxbGedpybGeabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaldpBdpAdpDdpCdpEaatdpFdpFaatdpGdpHaatdpJdpIaalaalaalaaldpKagtaaDagtabPdpLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabnbukdpDdpPbukdpQdpSbyEdpDdpTdpOagUagXdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaatabvdqbaatdqcaaqaatdqcaaqabxdqcaaqaalaabaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaatdqddqeaatdqfdqfaatdqgdqgabxdqhdqhaalaabaEQabLabLabLdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalaabaabaabaEQabLabLaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCdqBdqAdqDdqAdqEdqFdqAdqAdqGaalbikaabaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwajJdqydqxdqAdqzdqCacpdqAdqDdqAdqEdqFdqAdqAdqGaalbikaabaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikaabaEQabLabLaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMahqaalaabaabaabbikbikbikbikbikaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackaclaiWaalacmbikbikbikbikbikbikaabaabaabdqRabLabLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikaabactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackaclcBwaalacmbikbikbikbikbikbikaabaabaabdqRabLabLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoaecacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikaabactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikbikbikbikactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEakMbikbikbikbikbikbikactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikbikactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmarWdgydhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaaladBadCacEadEadDadGadFadIadHadJacEbikbikbikbikbikbikactadKadLadMadNacXadOactadPadtadtadtadtaduadvbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhtdhtdgwdgwdgwdgmdhudgydgydgydhvdgmdgwdgwdgwdhtdhtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikaabaalachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaecaedadAaeeacXaefactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikaabaalachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaemaedadAaeeacXaefactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikaabbikbikbikaabaaladRacdacEaetadVadYadFaeaadZaevacEbikbikbikbikbikbikactaeIadLaewadNacXaexactaeyadtadtadtadtaezadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhzdgydgydgydhydgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeAaeAaeAaeAaeAaeAaeAaeAaabbikbikbikaabaabaabaabaabaabaaladBacdacEacEaeJaeLaeKafhaeMacEacEbikbikbikbikbikbikactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhBdhAdgSdhBdhAdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeWaeXaeYamdaeZaeXafaaeAaabbikbikaabadwadwadwadwadwadwaalaffafgadSacEafiadXafjaeuaflacEafmafmaepaeDahZafmafmactafnafoafpafqafractactafsaftafuafuafwadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxafxafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhDdhCdgydhEdhFdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAamdafyafzafAaeAbikbikbikaabadwadxaekadUaemaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggaghadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAamdafyafzafAaeAbikbikbikaabadwadxaohadUaghaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggagnadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkamdaglafAagmaeAaabbikbikbikadwadyaeraeqaeBagqagragsagtaeCagvagwagzagyaeFaehafeafMahlafSageafSafSafTahpafbafGafCafSafSaikagoagLagxagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAamdafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvagnahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAamdafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvaigahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyamdafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSaiXagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAamdafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitdqOahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJamdafAafyaiKaeAamcaabaabaabaabadwagTaiOaigaiwaeEaatakoaiSagvaimaiUaiVdqQaiuaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHaoIaofajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWakcajubSoclqajcajAajyajDajuahDahCajJajxajLahHajBakjakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajucjgakNakOakOakPajZajuaivainaiBaizakrahHakWakXakYakZalaalbajdaknakwakuakqaksaktakTalBakSalcakUalealdaiCalfajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualvajualwalxalyalzakQakxajuampaiQakRaiZalEajzajBalFalGaklalHalIajFaliahPaljaljallalCalgalJajXakfakealMakeakhakgahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJamdafAafyaiKaeAamcaabaabaabaabadwagTaiOakcasWaeEaatakoaiSagvaimaiUaiVdqQaiuaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHcDAaofajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWaknajubSoclqajcajAajyajDajuahDahCaxZajxajLahHajBalnakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajucjgakNakOakOakPajZajuaivainaiBaizakrahHakWakXakYakZalaalbajdalvakwakuakqaksaktakTalBakSalcakUalealdaiCalfajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualwajuaoIalxalyalzakQakxajuampaiQakRaiZalEajzajBalFalGaklalHalIajFaliahPaljaljallalCalgalJajXakfakealMakeakhakgahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaXhdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAamdamdamdamdamealKamgamdajuamfamiamjamkamhamlajualNajHammalQamnakvajGamsamtaXNamvaYjajGamXamDamqanlamYdoHaocaoNdoIasvaiCateauydoNalkahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWalnakVamZanaanbancajuajuandaneajuajualmajualAalAaufalAauLalDajGajBajCanjajEajFajGdoOatgdoPaiRaiRaiRahUahUannalLdoSalOahUahAalPahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWaoZakVamZanaanbancajuajuandaneajuajualmajualAalAaufalAauLalDajGajBajCanjajEajFajGdoOatgdoPaiRaiRaiRahUahUannalLdoSalOahUahAalPahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaoranwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTaoiaokalRaqjaoMaojaPcauwaswamoamxamwamBamAamEamCamGamFaokaojaokaolaomamHamJamIanfaEEaovapmaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTavRapcawqanpaoTapdanUaoTapdapbaqEapearZaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWapIapaaoTavRapcawqanpaoTapdanUaoTapdapbaqEapearZaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikaAnaApaAocsHaBuajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwanganianhanWawDanianiapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEaoeaodaodanXanZanYaopaooahEasaaobaoaasaahEapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikcsIcsJcsJcsJcsIacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaoraoEaoCaoFamOamRamSamSamSaxyaniasWaohaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEauHaoKaoJavaahEaqMaqNaqOaqhaqQaqiapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikcsIctRctOctRcsIacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaxtaniayYapAaoOapJapIapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikcsIcsJcsJcsJcsIacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaoraoEaoCaoFamOamRamSamSamSaxyaniaDTaGIaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEauHaoKaoJaqiahEaqMaqNaqOaqhaqQaslapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikcsIctRctOctRcsIacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaxtaniayYapAaoOapJatYapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikcsIcxDcxCcxEcsIacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSazdazdazfaqlaqkaqqaqmaqxaqwapBascasdasearzasgashasiasjaskarAasmasnasoaspasharBapyapyaosaqBaooarFarEaqFaykaqJaqIaqKahEatnatoatparNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcyUctRctRcsIacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBdpfdoYapEapEatSapEasbdpUapEatSapEasZaslasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcyUctRctRcsIacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaJQaqPaqRaqRaqRaqRarhapBapBatRapBavadoYapEapEatSapEasbawLapEatSapEasZaxIasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcKActRcLqcsIaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikarIaqPaqPaqParJaqRarKarXarLapBatPatUatTatbatVaqsatQauJauEatdatcavEavBatWaqsatfaATapyapyapyathaSWatiahEarYaryasqasrahEatXatOarMarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikcsIcKActRcLqcsIacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGdpVauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikcsIcOOctRctRcTVacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatjataatlatkcqIatmatZatYapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikcsIdbdctRctRcsIaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikdbOdnYctRdoKdbOaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikdnbdnfdnebikbikdpRdbOdridbOdrjaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhdrgadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikcsIcOOctRctRcTVacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatjataatlatkcqIatmatZayVapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikcsIdbdctRctRcsIaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKaAaawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikdbOdnYctRdoKdbOaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaAfavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikdnbdnfdnebikbikdpRdbOdridbOdrjaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhaJWadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikaxVaxVaxVaxVaxVaxVaxVaxVaabaabaxRazsayMayNaxRayOaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdplaxgaxcaxkaxiaxsazgdpabOIayXayXayZdlNazbazcayXayXayXdpbayXayXayXayXayXayXazedpcazgazgazgazhaziazjaziazkazlazmaznadQadQadQadQazoazoazoaxEapmavUazpaxHazqavVcscazraxJcvYavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikaabayCaFCaztazuayCaabbikaabbikbikaabbikbikayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVazHdrkazHazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOauOdpdawmdlVayaayaazLazJazKazKaVMazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaAaapmavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaAfaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVdrldrmazHazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaxZazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVazHdrkazHazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOauOdpdawmdlVayaayaazLazJazKazKaVMazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaFgapmavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaFsaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVdrldrmazHazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaUvazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikappaBpaBobikaBqaBsaBraabaabaAlazHaAlbikbikaabaxVdrnaBvaBwaBxaByaBzaxVaBAazHaBBaBCaBDaBEaBEaBEaBEaBEaBEaBEaBEaBFaxVbikaBGbikbikbikbikbikbikbikbikdpdaycaybayfayeaySdoRaBIaBJaBKazMaAwazOaBLafvaBNaAAaABaBOaBPaBPaBPaBPaBPaAIbjlaAKaxlaxqaxrazIaBQaBRaBSaBTaBSaBSaBUaBVaBWaBWaBWaBWaBWaBWaBXaBYaBZaCaaCbaCcaCdaCeavWavWaCfaCgaChaChaChaChaChaCgaCfaabbikbikbikbikazvaCiaCjbikaAiaCkaClaCmaCnayHayHayHayJayHayJaCoayHayHayGayHaCpaCqaCoaAkayHayGaCraCsayGayHaCtayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabdpdayVayTdpeayWazaaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaBtaCyaBtaDEaCwaDFaCwaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVbikbikbikbikbikaDMaDMaDMaDMaDMaDMaDMaDMawmaCMaDNaDOaDPaDQaDRaDSaDTaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfbikbikazvayHaEqaEraBhayJaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMdoXaCMaFfaFeaFgaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraFsaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaHTaHTaHTaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHayJaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaGcaGdaGeaDEaGcaGdaGeaEJaBzazHaGfazHazHazHazHazHaxVaGgaGhaGiaGjaGkaxVaCLaxVaEQaGlaEPaGmaGnaGoaxVaGpaxVaxVaxVaxVaGpaCLaEWbikazyazyazyazyaGqaEYaGraGsaGtaGuaGvaGwaDMaCMaBHaGxaGxaGxaGyaGzaGAaGzaGzaGzaGBaGCaGDaGEaGFaGFaGFaGFaGGaGHaGIaxqaGJazIatsaGKaGLaCZaDaaDbaEgaHTaGMaGMaGNaHTaEhaGOaGPaGPaGQaGRaFGaGSaGTaGUaGVaEhaGWaFQaChaChaChaChaChaFQaGXaGYaFQaabaabayGayHayHayJayJayJazxazxayGayGayGayJayJayJayGaHaaHbayGayJayJayGayJayJayGayGaHcaHdaHeaHfaHgaHhaHiaFXaHjaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabdpdaUxayTdpeayWazaaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaBtaCyaBtaDEaCwaDFaCwaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVbikbikbikbikbikaDMaDMaDMaDMaDMaDMaDMaDMawmaCMaDNaDOaDPaDQaDRaDSaHhaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfbikbikazvayHaEqaEraBhayJaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMdoXaCMaFfaFeaJUaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraKcaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaHTaHTaHTaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHayJaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaGcaGdaGeaDEaGcaGdaGeaEJaBzazHaGfazHazHazHazHazHaxVaGgaGhaGiaGjaGkaxVaCLaxVaEQaGlaEPaGmaGnaGoaxVaGpaxVaxVaxVaxVaGpaCLaEWbikazyazyazyazyaGqaEYaGraGsaGtaGuaGvaGwaDMaCMaBHaGxaGxaGxaGyaGzaGAaGzaGzaGzaGBaGCaGDaGEaGFaGFaGFaGFaGGaGHaKZaxqaGJazIatsaGKaGLaCZaDaaDbaEgaHTaGMaGMaGNaHTaEhaGOaGPaGPaGQaGRaFGaGSaGTaGUaGVaEhaGWaFQaChaChaChaChaChaFQaGXaGYaFQaabaabayGayHayHayJayJayJazxazxayGayGayGayJayJayJayGaHaaHbayGayJayJayGayJayJayGayGaHcaHdaHeaHfaHgaOPaHiaFXaHjaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbjNaInaCuaDEaEIaHlaCuaDEaEIaHlaCuaxVaCBaxVaxVaxVaxVaxVazHaxVazHaHnaHoazHazHaxVaCLaxVaHpaabaHpaxVaBvaGoaxVaHqaHraxVaENaBzaxVaAwaDMaDMaHsaHsaHsaHsaHsaHsaHsaHsaHsaGvaGvaGwaHtaHuaHvaHwaHxaHyaHzaHAaHBaHBaHBaHBaHCaHDaHEaHFaHGaHBaHBaHHaHHaHIaHJaHKaHLaHMaHNaGKaHOaHPaHPaDbaEgaHTaGMaHRaHSaHTaEhaGOaGPaGPaGQaKhaFGaGSaGUaGUaGVaEhaGWaFQaChaChaChaChaChaFQaHUaGYaFQbikbikayGaHVayHayHaHWayJaHXazwaHYaHZayKayGaFSayKayGaIaayHayGaIbayHayGaIcaIdaIeaFUaIfaFUaIgaIhaIiaIjaIkaIlaImaDCaDDaDDaacaacaDDaDDaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmJdmKaGddmKaIoaIoaIoaIqaIoaIoaIoaIsaItaIuaIuaIuaIuaIvaxVazHaxVaIwaIxaIyazHaIzaGpaCLaxVaxVaxVaxVaxVaxVaGpaxVazHaIyaCBazHazHaGvaIAaIBaICaIDaIDaIDaIDaIEaIDaIDaIFaIGaICaIHaIIaIIaIIaIIaIIaIIaIIaIJaIKaIKaIKaIKaILaIMaIKaINaIKaIOaILaIKaIKaIKaIKaIPaIQaIRaISaITaFzaIUaIVaHPaIWaEgaHTaIXaIYbvsaHTaEhaIZaJaaJaaJbaEiaFGaJcaJdaJdaJeaEhaJfaJgaChaChaChaChaChaJhaJiaJjaFQbikbikayGayHayHayHayHayHayHaIeaFUaFUaFUaFUaFUaFUaFUaCmayHayHayHayHaDzayHayHaDxayHaJkaJlaJmaJnaJoaFYaFYaFYaJpaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzaJqaJraJsaJtaJuaJvaJwaJxaJvaJyaJzaJvaJvaJAaxVazHaxVaJBazHazHaJCaJDaxVaEVaBFazHazHazHazHazHazHaGpaJEazHaxVaEKaEKaDMaJFaDMaJGaJHaJIaJIaJIaJJaJIaJIaJIaJKaJGaJLaJMaJMaJMaJMaJMaJMaJMaGvaIKaJNaJOaJPaJQaJRawxaJTaJUaJVaJWaJXaJOaJYaIKaJZaxqaKaazIaKbaGKaKcaKdaKdaKeaKfaKgaSsaKiaKiaKjaKkaKlaKjaKkaKkaKmaKnaKoaEhaEhaKpaEhaKqaKraChaChaChaChaChaKraCfaCfaCfayGayGayGayKayJayJaAkayGayGaDxayJayGaKsayJayGaAkayGaDxaHVayJayGaAkayGayHaHVaDxayHaKtaDCaKuaIhaKvaKwaKxaIhaKyaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaKZaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzaJqaJraJsaJtaJuaJvaJwaJxaJvaJyaJzaJvaJvaJAaxVazHaxVaJBazHazHaJCaJDaxVaEVaBFazHazHazHazHazHazHaGpaJEazHaxVaEKaEKaDMaJFaDMaJGaJHaJIaJIaJIaJJaJIaJIaJIaJKaJGaJLaJMaJMaJMaJMaJMaJMaJMaGvaIKaJNaJOaJPbmEaJRawxaJTaPAaJVbqJaJXaJOaJYaIKaJZaxqaKaazIaKbaGKaSyaKdaKdaKeaKfaKgaSsaKiaKiaKjaKkaKlaKjaKkaKkaKmaKnaKoaEhaEhaKpaEhaKqaKraChaChaChaChaChaKraCfaCfaCfayGayGayGayKayJayJaAkayGayGaDxayJayGaKsayJayGaAkayGaDxaHVayJayGaAkayGayHaHVaDxayHaKtaDCaKuaIhaKvaKwaKxaIhaKyaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaTJaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaLyaCuaLzaGdaKzaLAaLBaLCaLDaKzaGdaLEaInaCuaLFaLGaxVazHazHazHazHazHazHaKHaLHaLIaLJaLKaLLaLMaLHaKHaLNaLOaIDaIDaIDaIDaIDaIDaLPaLQaJGaabaLRaLRaLRaLRaLRaLRaLRaabaJGaJLaJMaLSaLTaLUaLVaLSaJMaGvaIKbCjbCjbCjaLWaLXaJOaLYaJOaLXaLZbCjbCjbCjaIKaJZaxqaMaazIaKbaGKaFAaCZaDaaDbaFBaMbaMcaMcaMcaMcaMcaMcaMcaMdaMcaMeaMeaMeaMeaMeaMfayGaCfaKraChaChaChaChaChaKrayGayGayHaMgaLnayJaMhayGayHayHayGayHaDxayJayHayHayGayHayHayJaDxayIayGayHayHayJaMiayHaDxayHaMjaMkaMkaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaDDaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaKAaKzaKzaKzaKzaKzaKzaKAaInaMlaCuaMmaMnaMoaMoaMoaMoaMoaMoaMpaKHaLHaMqaLJaMraMqaMqaLHaKHaMsaMtaMuaMuaMuaMuaMuaMuaMuaMuaMvbikaLRaMwaMxaMyaMzaMAaLRbikaJGaJLaJMaMBaMCaMDaMEaLSaJMaGvaIKaMFaMFaKPaMGaMHaKSaKTaKSaMHaMIaMJaKOaKOaIKaJZaxqaKaazIaMKaBRaMLaCZaDaaDbaEgaMbaMcaMMaMNaMOaMOaMcaMPaMQaMRaMeaMSaMTaMUaMeaMVayGbikaMWaMXaMXaMXaMXaMXaMYbikayGayHaMZaNaayJayJayGayGayJayJaNbaNcayJayGazxayGayGayJayJaNdaNeayGayGayGaHYaMiayHaDxayHaMjazwayKaFSayGaNfaNgaNfayGayGayGaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmdeuaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaXtaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaUFaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaXtaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaWsaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaZmaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKbCjbCjbCjaQLaLXaJOaLYaJOaLXaQMbCjbCjbCjaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaOCbbVaTCaRTaRUaQbaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpdpgaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQbaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbdphaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaWFaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQbaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLdpiaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQbaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzdeQaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqdpjaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQbaYVaGZaEsaYWaGZaGZaGZaGZaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpdpgaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaWFaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQbaXRaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbdphaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUubtdaKSaUwaKSbABaUyaUzaIKaUAaUBaUCaUDaUEaYgaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaYPaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQbaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLdpiaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWrbeoaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQbaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzdeQaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqdpjaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMbgBaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfbjwaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIbkFaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQbaYVaGZaEsaYWaGZaGZaGZaGZaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZldpkaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaJSaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnbcMaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaLbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbdfbdcbdgbbIbkZbjrcSNcIgaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbdilbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcObcNbcPbcPbcPbcPbgRbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbcYtbdddcnbdebdebdecZrcZqaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWdlHbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDbikbikbikbikbcEbcEbcEbcEbfPbfQbfRbfSbssbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEbikbikbikbikbcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbmwbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvdlHbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAbqUbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvblKbepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWdlHbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDbikbikbikbikbcEbcEbcEbcEbfPbfQbfRbfSbssbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEbikbikbikbikbcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbmwbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvdlHbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbmzbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAbqUbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecdhUbgSbgTbgUdhUbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbmwbhBbhCbmwbhDbhEbglbmwbnMbeMbeMbhFbcSbhHbhIbhJbhKbhLbeMbhMbgubhNdlHbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbKnbIzbPfbNjbiibPfddJbmKbmKbmKbmKbmKbmKbmKbmKbmKbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecdhUbgTbizbiAdhUbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbBDbjmbjnbjobjpbhLbjqaVbdlJdlIdlKbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbjwbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbdlObhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTboFblUbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbuWbnnbnobnpbnrbnrbnrbnrbnrbnqbnqbnsbnqbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbmwcakbnGbmwbnFbmwbnJdmhdmgbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEbSVbyzbyzbyzbuVboGboHboIbnrboJboKboLboMboNboOboPboQbmgboRbnvbnvbpWboTbpWbnvbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbAibmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWboUbpWbnvbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecdhUbgTbizbiAdhUbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbBDbjmbjnbjobjpbhLbjqaVbdlJdlIdlKbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbogbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEboNbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbdlObhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcobpcblLblMblNblOblPblQblRblSblRblTblTblTblTblTboFblUbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybqHbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbcFKbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbuWbnnbnobnpbnrbnrbnrbnrbnrbnqbnqbnsbnqbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbmwcakbnGbmwbnFbmwbnJdmhdmgbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbszbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEbSVbyzbyzbyzbuVboGboHboIbnrboJboKboLboMbsLboOboPboQbmgboRbnvbnvbpWboTbpWbnvbnvboVbmgboWboXboYboZbpabpbbsWbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbAibmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWboUbpWbnvbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbtNbqIcXAbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbAibpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAbnvbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddYddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbAibpIbpIbtKbtLbtMbpNbtNbnrbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbqrbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuiaZtbuibuibuibuibuibuiafkbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedaYXaYXbuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUdngbyzdnidnhbpIbuXbuYbuZbtMbpNbvabnrbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrccIbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbuiafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddYddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnrbIDbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxAbxzbxvbxAbuibDdbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbLSbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbpXbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbuibIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbaHQbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbuibDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdfMdesdesdesdesdesdfNbikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibPcbCkbCpbCpbKzbCpbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbuibIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbPcbPcbCpbEabnDbEcbEdbEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIbujbuhbuhbuibEKbELbEMbuibuibuibuibENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvcbAbKhbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbEibHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbLibLCbLBbNdbNcbNebIfbIfbIgbIhbIibxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubxybIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbKobngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibJjbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEcbAchEbIecnfcjubvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbGzbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbLwbngbLQbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbqzbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLgbLgcpLbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLIbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbvjbikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbPEbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbWSbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbISbNLbFNbNMbvjbikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMcxHbikbikbikbGxbORbJFbOPbOQbGzbOObNibGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybvTbsAbnvbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbxtbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbxHbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcdqvbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddYddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbAibpIbpIbtKbtLbtMbpNbyHbnrbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbqrbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuiaZtbuibuibuibuibuibuiafkbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedaYXaYXbuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUdngbyzdnidnhbpIbuXbuYbuZbtMbpNbvabnrbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrccIbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbCtbvUbvUbvVbuiafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeibEdbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddYddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnrbIDbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbEibuhbxubxvbxwbxxbxAbxzbxvbxAbuibDdbvXbxCbxDbxEbxFbxFbxGbEtbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbLSbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbpXbyFbyGbEEbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbuibIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAdrHbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbaHQbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbuibDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdfMdesdesdesdesdesdfNbikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibPcbCkbCpbCpbKzbCpbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbFdbCubCvbCwbCxbCybCzbCAbEsbvwbHtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbuibIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbPcbPcbCpbEabnDbEcbIibEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbJjbEFbEGbEHbuhbCTbEIbujbuhbuhbuibEKbELbEMbuibuibuibuibENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbKhbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdcDBbGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvcbAbKBbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbKHbHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbLibLCbLBbNdbNcbNebIfbIfbIgbIhbKYbxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubxybIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbKobngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibMGbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEcbAchEbIecnfcjubvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbGzbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbLwbngbLQbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbqzbKxbKybKzbKAbOkbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybOPbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbQsbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLgbLgcpLbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLIbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbvjbikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbPEbMFbQzbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbWSbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbISbNLbFNbNMbvjbikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbRnbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMcxHbikbikbikbGxbORbJFbRubOQbGzbOObNibGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebISbCmbPhbvjbvjbvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbRpbPFbPGbPHbPIbPJbPKbPLbTdbXBbLgbLhbPNbPObPNbPPbPQbPPbPPbPPbMabIvbZkbZkbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMcxHbikbikbikbGxbNfbNgbGxbGzbGxbGxbGzbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRqbPEbSFbMHbMHbMHbUzbLgbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbZkbZkbRCbPWbRDbREbWHbRGbRHbRIbRJbRrbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbRxbQtbQubQvbQwbQxbQybUubQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbVybRobRqbPEbSFbMHbMHbMHbUzbLgbPNbRsbRtbWCbRvbRwbXCbRybPPbRzbRAbRBbZkbZkbRCbPWbRDbREbWHbRGbRHbRIbRJbRrbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdmideNdePdePdePdeNdmHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbQVbSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSHbSGbPEcgQbSIbMHbSJbSKbLgbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbZkbSUdnjbSWbSXbSYbSZbTabTbbTcbRKbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLgbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbZkbUqbUrbUsbUtbUubUvbUwbUxbUybVObNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJdpmbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbPMbLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbZkbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjyddZdkDdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbTkbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZdmbbWEbWFbWGcAzbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAdoEbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbZkbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkQdkDdkDdkRdjFdjHdjHdjFdkSdjHdjHdkUdkTdjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbUGbUEbUEdeycOWbTkbTkdeAbZAbTkbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwbYybYxbYzbYAbYBbYCbVfbVibYDbVkbYEbYFbYGbYHbYIbVkbSmbQVbSnbQVbYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbZkbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZtbZsbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkWdkVdkXdjFdjHdkYdjFdkZdladjHdjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUFbUFbUFbQebUIbYfbYebZzbZAbTkbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZQbZPbZSbZRbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcElcalcamcancaocapcaqcarcIfcasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbZkcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikcaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydjydjydjydjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaacbUTcjMcjMbUTcjMcjMbUTbikbikbTgbWjbYbbWkbTgbUIbUIbUIbOVcaYdpncaZcaZcaZbOVbOVbUTcbbcbaccAcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlccicbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbZkcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcckccjcdqcclcfeccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabbikbikbikbikbikbWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbUTccBcqsbUTccBcqsbUTbikbikbYcbOTbYgbOTbZxbikaabbikbOVbOVbOVbOVbOVbOVbOVclabUTcuRcsuccCccDbZFccEccFbUVccGccHdmcbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcffcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcdCcdBcdCcdDcdEcdFcdCcdGcdHcbPcdIcdJbRBbZkbZkcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabbikbikbikbikaabbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLgbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbZkbUqbUrbUsbUtbXNbUvbUwbUxbUybVObNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJdpmbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbYybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbPMbLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbZkbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjyddZdkDdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbTkbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBcabbUZdmbbWEbWFbWGcbnbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAdoEbLhcbObXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbZkccCbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkQdkDdkDdkRdjFdjHdjHdjFdkSdjHdjHdkUdkTdjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbUGbUEbUEdeycOWbTkbTkdeAbZAbTkbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwcdIbYxbYzbYAbYBbYCbVfbVibYDbVkbYFbYEbYGbYHbYIbVkbSmbQVbSnbQVbYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbZkbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZtbZsbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkWdkVdkXdjFdjHdkYdjFdkZdladjHdjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUFbUFbUFbQebUIbYfbYebZzbZAbTkbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZQbZPbZSbZRbZTbZUbZVbZWbZXbZYbZZcaachdcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcElcalcamcancaocapcaqcarcIfcasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbZkcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikcaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydjydjydjydjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaacbUTcjMcjMbUTcjMcjMbUTbikbikbTgbWjbYbbWkbTgbUIbUIbUIbOVcaYdpncaZcaZcaZbOVbOVbUTcbbcbaccAcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfciFcbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlccicbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNciHcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbZkcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcckccjcdqcclcfeccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabbikbikbikbikbikbWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbUTccBcqsbUTccBcqsbUTbikbikbYcbOTbYgbOTbZxbikaabbikbOVbOVbOVbOVbOVbOVbOVclabUTcuRcsucjbccDbZFccEccFbUVccGccHdmcbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcffcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcdCcdBcdCcdDcdEcdFcdCcdGcdHcbPcjfcdJbRBbZkbZkcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabbikbikbikbikaabbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaacbikaacbUTcfQcqsbUTcfQcqsbUTbikbikaabaabaabaabaabaabaabaabaabbUTcqscAjcwNbUTcEvcEwbUTcGJbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAbNKbNKbNKbNKbPRbPgbPTceFceGceFceHceIceJceKchvceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfgbMmbMmcfichOcgHceYchVcfjcfjcfkcfjcflcfmcfncfocdCcfpcfqcfrcfscfrcftcfucfvcbPbZkcfwbZkbZkcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabdnkaacaabaDDaDDaacbUTbUTcekbUTbUTcekbUTbUTbUTcjMcjMcjMbUTbUTbUTbUTbUTbUTbUTcqschodnmbUTdnnbUTbUTdnobUTcfPbVccqsbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecodcodcggcghcgicgjcgkceBcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzbMVcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFciOcgJcgJcgKcgLcgMcgNcgOcgPcdCdomcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbxOchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabbikbikbikbikaabbikbikbikbikbikbikbikbWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabdnkaacaabaDDaDDaacbUTbUTcekbUTbUTcekbUTbUTbUTcjMcjMcjMbUTbUTbUTbUTbUTbUTbUTcqschodnmbUTdnnbUTbUTdnobUTcfPbVccqsbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecodcodcggcghcgicgjcgkceBcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzbMVcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFciOcgJcgJcgKcgLcgMcgNcgOcgPcdCdomcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbxOchachbchcbUAbUAbUAbUAbUAcjxcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabbikbikbikbikaabbikbikbikbikbikbikbikbWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaaccjMcqscqscqscqsdoadnxcqscqscuRdnpdnpdowdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpcsubUTchocfQchpbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchucWpchwchxchychychzchAceBbGybGychBchCchDbGybGybGycqOchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcjncjlcjlcjlcjlckacgIbSqclPchPchQchRchSchTchUclQcdCchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbxObFeciicijcikcyJbxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwciycixcizbikbikbikbikaahbikbikbikbikbikbikbikbikciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaaccjMdnrdnqdnscqscqsdoxcqscqsdnobUTbUTbUTbUTbUTbUTcekbUTbUTbUTbUTdntdntdntdntdntdntdntdntdntbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTbPSceDceCceCceCceCceEceCbGybGybPlciYciZcjacjbcjccjdchScjecjfbBccjhcjicjjcjkcjlcfdcnicxVcxVcxVcxVckNclSckUcnjcjqcjrcjscjtcbAcwncjvcdCcjwcjxcjycjzcjAcfrcjBcdCcdCbxOcgfbxObxObxOcjDcjEcjFbxObxXciicjGcjHcyJcyJcyJbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbUTcjKcjKcjKcjKcjKcjKcjLcjKdnodnubUTcqsdoydnwdnycqsdnydnvdnzdnwdntdnAdnAdntdnBdntdnDdnCdntcqscelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhceDckickjckjckjckkceCbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktckscglaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccdCcdCciVcdCckHcdCciXciWcjpcgnckLckMckvckOcwAcjCckRcxTcwAbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpdhpclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBceCbGybGycklclCbzsclEclDclGclHclHclFclJclKclMclLclNclOcotcfhcpwckGcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxckIckIcmRbHtchycmTcmUclyclAclAclAclAcmVceCbGybGycklcmWcmXcmYcmZcnacnbcnbclIbvWbulbxBclHconcklcqQcfdcrLcxVcwscvxcwEcwCcxNcxIckDcnmcnnYDtckDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnCcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcodcoccodciPciPciPckJcofclAclAcogcohceCbGycoicklcoocokcolcomcomcoqcojcnhcomcomcopclHcrCcklcrNcfdcupcxVcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPctdcoFckKcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcodcpycpzcpAcpBcpCceDcpDclAclAclAcpEceCbGybGycpFcpFcpGcpHcpIcpIcrDcyFcrEcpJcpJcpKcpFcpGcpFcqQcfdcrLdbAbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqyckQcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGceCbGybGycpFcqHcrFcqJcqKcqLcsPcpFcsUcqMcqKcqNcsVcqPcpFczecyWczgdbAdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikctUctUctUctUctUcjKdnWcrjcrjcrjcrjcrjdnQcwUcwUcwUcrjcrjcrjcrjcrjcrjcrjcwUcwUcwUdntdntdntdntdntdntdntcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcroclZcrqcrrcrscrtcrucmpcrwcrxcrycrzcrAceCbGybGycpFcuicsYcvocujcujcvpcpFcwicujcujcwjcujcwkcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcmQcsFcnBcodcoeckIcoEcorcsKcsLcsMcsNcsObGybGycpFcwlcsQcsRcsScsTcwmcpFdehcsTcsWcsXdlFdqVcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDcoGcwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNcqzctPctQcyqctSctTbEbctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhdqWcpFdqXcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLcrpdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKdqYcpFdqZcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWcoGbGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwcwAcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcwUcwUcwUcwUdnXcwUcvFcvGcvGcvHctBdlXcwUcCmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhdradrcdrbcpFdrddrcdrecqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRcoGcyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDcwAcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxaabagiaabaqZbikaqZaqZdoidoCdojdojdojdoldokcwUcwOcwPcwQcwRcwScwTcwUcwVcwWcvOcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpFcpFcxBcpFcpFcwecrvcuccuccuccxFcuccsEcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfcoGbGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTcwAcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabaabaabdoidoidohdoidoidoncEBcwUcwUcwUcwUcwUcwUcwUcwUdoicwWcvOcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcmScxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTcALceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjcoGdclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcAvcwAcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdoDbikacGbikczoczpczqbikczoczpczqbikczoczpczqbikbikdoidoocfRdopdoidoqcGKdojdojdojdojdojdojdojdojdojcEycvOcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbcwAcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczocAkczqbikczocAkczqbikczocAkczqbikaqZdoicfRcfRcfRdoidoidorczsdoidoiczsczsdoidoiczsczscwWcvOcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAPcAwcAxcAycxsczBdlYcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAbikbikbikbikdcicBTdcqcBUcoGcgmcFdbVicFmcFlcFlcFnbGycoAbikbikckPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPbikbikcwGcwGcBbcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaqZaabczocAkczqbikczocAkczqaabczocAkczqbikaabdoidondosdoqdoibikaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcrecBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikdoidoiczsdoidoibikaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctaclUciUckucjoclUcBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOckycCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaqZbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmdotcDocDncDncDpcDpcDncDqcDrcDscDtcDtctYcDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucDddoucExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDddovcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcBWcHEcHFcHGcHJcHIcqUcqUcqUcqUcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIVczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzbClcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcIWcLmcJScwAcLlcLpcLnckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaaccjMdnrdnqdnscqscqsdoxcqscqsdnobUTbUTbUTbUTbUTbUTcekbUTbUTbUTbUTdntdntdntdntdntdntdntdntdntbUTcfScejbikbikbikbikciEbaTciGckiciIciJciKciLciMciNcmPciPciQciRciSciSciTbPSceDceCceCceCceCceEceCbGybGybPlciYciZcjaclGcjccjdchScjecmDbBccjhcjicjjcjkcjlcfdcnicxVcxVcxVcxVckNclSckUcnjcjqcjrcjscjtcbAcwncjvcdCcjwcmScjycjzcjAcfrcjBcdCcdCbxOcgfbxObxObxOcjDcjEcjFbxObxXciicjGcjHcyJcyJcyJbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbUTcjKcjKcjKcjKcjKcjKcjLcjKdnodnubUTcqsdoydnwdnycqsdnydnvdnzdnwdntdnAdnAdntdnBdntdnDdnCdntcqscelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhceDcngckjckjckjckkceCbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktckscglaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccdCcdCciVcdCckHcdCciXciWcjpcgnckLckMckvckOcwAcjCckRcxTcwAbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpdhpclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBceCbGybGycklclCbzsclEclDcoyclHclHclFclJclKclMclLclNclOcotcfhcpwckGcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcoKcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxckIckIcmRcpuchycmTcmUclyclAclAclAclAcmVceCbGybGycklcmWcmXcmYcmZcnacnbcnbbulbxBbvWclIclHconcklcqQcfdcrLcxVcwscvxcwEcwCcxNcxIckDcnmcnnYDtckDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnCcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcodcoccodciPciPciPckJcofclAclAcogcohceCbGycoicklcoocokcolcomcomcoqcojcnhcomcomcopclHcrCcklcrNcfdcupcxVcxVcxUcxVcxVcxNcEickDcowcoxcqjckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPctdcoFckKcnCcoHcoIcoJcrecoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcslcpvcwqchqcodcpycpzcpAcpBcpCceDcpDclAclAclAcpEceCbGybGycpFcpFcpGcpIcpHcpHcpJcpMcpKcqHcqHcqKcqJcqLcqJcqQcfdcrLdbAbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqictYbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCcwgdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqyckQcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGceCbGybGycpFcqNcqMcrvcqPcrEcrDcpFcrFcsPcsEcsRcsQcsScqJczecyWczgdbAdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikctUctUctUctUctUcjKdnWcrjcrjcrjcrjcrjdnQcwUcwUcwUcrjcrjcrjcrjcrjcrjcrjcwUcwUcwUdntdntdntdntdntdntdntcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcroclZcrqcrrcrscrtcrucmpcrwcrxcrycrzcrAceCbGybGycpFcsUcsTcsWcsVcsVcsXcpFcsYcuccuccudcuccufcuebGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcyrcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcmQcsFcnBcodcoeckIcoEcorcsKcsLcsMcsNcsObGybGycpFcuhcugcujcuiculcukcpFcvmcvocvncwecvpcwhcwfbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDcoGcwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNcqzctPctQcyqctSctTbEbctVctWctXcAvctZcuacnqcubcwicwkcwjcwmcwlcwrcwocqJcxFcsEcyFcyGcsEcAzcwfbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLcrpdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcBPcEMcqPcrvcqPcqPdehcqJdlFcsEcsEcsRcsEdqVcwfbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWcoGbGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwcwAcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcwUcwUcwUcwUdnXcwUcvFcvGcvGcvHctBdlXcwUcCmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrdqWdqYdqXdradqZdrcdrbcqJdrddrUdredrWdrVdrXcuebikbikbikdbFdbZdbYdcadbIdccdcbdbUczRcoGcyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDcwAcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxaabagiaabaqZbikaqZaqZdoidoCdojdojdojdoldokcwUcwOcwPcwQcwRcwScwTcwUcwVcwWcvOcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrdqWcpFcpFcxBcpFcpFdqWdrZdrYdrYdrYdsadrYdsbcuebikbikbikdbFdbFdbFdbFdbFdbydcedcgcBbcoGbGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTcwAcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabaabaabdoidoidohdoidoidoncEBcwUcwUcwUcwUcwUcwUcwUcwUdoicwWcvOcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcDucxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTceJceJdscbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjcoGdclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcFRcwAcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdoDbikacGbikczoczpczqbikczoczpczqbikczoczpczqbikbikdoidoocfRdopdoidoqcGKdojdojdojdojdojdojdojdojdojcEycvOcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBcdsdcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbcwAcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczocAkczqbikczocAkczqbikczocAkczqbikaqZdoicfRcfRcfRdoidoidorczsdoidoiczsczsdoidoiczsczscwWcvOcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAPcAwcAxcAycxsczBdlYcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAbikbikbikbikdcicBTdcqcBUcoGcgmcFdbVicFmcFlcFlcFnbGycoAbikbikckPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPbikbikcwGcwGcGIcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaqZaabczocAkczqbikczocAkczqaabczocAkczqbikaabdoidondosdoqdoibikaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcFbcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcALcBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUclUclUclUclUcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikdoidoiczsdoidoibikaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcIUcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctaclUciUckucjoclUcBXcCPcBYcCRcCQclUcusbGycoAbikbikckPcxOcxOcxOckycCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaqZbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmdotcDocDncDncDpcDpcDncDqcDrcDscDtcDtcFMcDvdaIcDxcDycDzcDzdiEdppcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUclUcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucDdcKlcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzdpwcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJdrRcFLcHscFNcJlcFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikbikcDccDccDccGGcGHcWAcDddovcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcBWcHEcHFcHGcHJcHIcqUcqUcqUcqUcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUdqBczbcIVczbcIVczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcQDcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcXPcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzbClcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcIWcLmcJScwAcLlcLpcLnckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikcyJcyJbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUcOBczVcQgcPYcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikcyJcNRbxXcvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcHscNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUclUdbldcwclUcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikdrocyJbxXbxXcvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcVHcNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUclUdbldcwclUcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikdrocyJbxXbxXcvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcbikaabbikbikbikbikbikbikbikbikbikbikbikbikcJbcOdcLucLscLscLscOecMucNpcNqcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDdcxclUclUcMhclUdcHdcGcFcbVicMjcMibGycuscGvbVibGycMkcITcoAbikbikckPckPckPckPckPckPckPckPckPckPckPckPckPbikbikbikbikaabaabbikbikbwobwobwocvzcyJcMmcMlbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcJbcJbdeBcOXcOXcOXcMucOYcOZcPacPacPbcPccMzcPdcPecPfcPgcPhdcMcPicPjcPkcPlcPmcPncPidcNcPpcPqcPrcPscPtcPucPvcNHcLQcPwcPxcDFcMNcDFcPycDFcMQcMRcJBcJCcPzcJEcNMcCKcCKcCKcCKcCKcHBcoDcMncKXchCcITcMYcMocMocMocMZbVidcJdcIcFhbVicNacKVcKVcNbcHrczhbGybGycoAcoAbikbikcONaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikaabaabbikbwocyKcNccNdcyJcNfcNebxXcxHbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdrpcJbcLscLscLscOXaabaabcMucPHcPIcPacPacPJcMucPKcPLdcOcPNcPOcPPdcPcECcPRcPScPTcGOcPUcECdcQcPWcPXcPNcPNdcRcPZcECcQacLQcQbcQccDFcMNcDFcLScLTcQdcQecMScQfdcScIDcQhcDQcQicQjcQjcCKcHBcoDcNhcNgbVibVicEhbVibVibGycNibVibVicGwbVibVicNkcNjcNmcNlcNQcoAcoAcoAcoAbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbikaabaabbwocNRcunbOMcyJcyJcyJbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcLscLscLscOXaabbikcMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcLQcJlcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobwobwobwobwodrqbOMcyJcOQcOPbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcLscLscLscOXaabbikcMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcLQcWNcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobwobwobwobwodrqbOMcyJcOQcOPbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcJbcJbcOXdeBcPEbikbikcMucQVcQWcPacPacQXcMucQYcQZdcWcRacRbcRccRdcRecRfcRgcRhcRicPucRecRbcRbcRbcRjdcWcRkcRlcECcNHcRmcMNcRncRocQJcRpcRqcRrcRscRtcRucRvdcXcKQcOLcDQcRxcQjcQjcCKcHBcoAbGycORcOTcOScNYcgmbVibGybGybGycGvcOUbGycGqcFicHrbVicEhbwobikbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobxXbxXbxXcyKcsGcOVcyJcPAbxXbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjdbikbikbikbikbikbikbikbikbikbikbikbikbikbikcOgcOhcOhdeFcOhcOhcPFcMucRzcOZcPacPacRAcMucMHcRBcECcECcRecRecRecRecRCcRRcRDcPNcREcRecRecRecRecECcECcRFcRGcECcNHcLQcRHcRIcRocRJcRKcDFcDFcRLcJxcRJcJCcRMcJEcNMcCKcCKcCKcCKcCKcHBcoAcITbGycPCcPBbGycQkbVibVicQlbVicQmcdccyHcQnbVibVibVicEhbwobikbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbwobwocyJcQpcQocyKcsGbOMbxXbxXbxXcYgbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqcQTcQqcRycQUcMucRNcROcPacPacRPcMucECcRQcECcRTaaccShcRecRecRecRecSicRecRecRecRecShaaccRTcECcRUcECcECcNHcLQcRVcQFcRWcRXcRYcRZcSacRXcSacRXcSbcQJcSccNMcTbcTScTScTScTScUdcYhcYicYicYkcYjcYicYicYicYlcYncYmcQmcYobVicQmbVicYpbVicEhbwocxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwobwobwobwobwobwobwobwobwobwoczMbwocyKcyJcYqbxXcHycsGbOMcyJcyJcLecyJbwoaabczrbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqcQTcQTdlcdlCcMucSdcSecPacPacSfcMucSgcSmcSlaaccTfcTIcTIcTIcTIcTIcTQcTIcTIcTIcTIcTIcTZaacddaddbcSncECcSocMJcFUcSqcSrcSscStcSucSvcSwcDFcSxcSycSzcSAcNMcUkbikaabaabbikcYscYrdbwcKlcYwcYvcYycYxcYicqTbGybGycYzcdccYAcGvbGybGycYBcMncYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYDcYCcYCcYCcYCcmvcyJbFecnGbxXcYEczMcyJcyJcyJcLecyJcsGbOMcyJcYFbxXbxXbwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqcQTcQTdlcdlCcMucSdcSecPacPacSfcMucSgcSmcSlaaccTfcTIcTIcTIcTIcTIcTQcTIcTIcTIcTIcTIcTZaacddaddbcSncECcSocMJcFUcSqcSrcSscStcSucSvcSwcDFcSxcSycSzcSAcNMcUkbikaabaabbikcYscYrdbwdoucYwcYvcYycYxcYicqTbGybGycYzcdccYAcGvbGybGycYBcMncYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYDcYCcYCcYCcYCcmvcyJbFecnGbxXcYEczMcyJcyJcyJcLecyJcsGbOMcyJcYFbxXbxXbwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqdldcQqdlfdlecMucRzcOZcPacPacTkcMucSDcSEcSEbikddcaacaacaacaacaacaacaacaacaacaacaacddcbikcSEcSEcSDcECcMHcLQcSAcSFcSGcSHcSIcSJcSAcSHcSAcJEcSAcJEcSAcNMcUkbikacGacGcgAcYrcnocTTcYHcYKcYJcYMcYLcYibGybGybVicQmcYNbVicGvcGqcFicYPcYOcYQcYQcYQcYQcYQcYQcYScYRcYQcYQcYQcYQcYQcYQcYUcYTcYWcYVcYYcYXcYZcYZcYZcYZcZbcZacZccYZcYZcYZcYZcZdbXScyJcOPbxXcZebwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdlgcOhcOhcOhcOhcOhdlhcMucSLcSMcPacPacOicMucSOcSPdddaabddcaaccSQbikbikbikbikcSQbikbikcSQaacddcbikddecSRcSScECcMHcECaabcSTaabcSUcSVcSWcSXcSYcSXcSZcSXcSZcUmcUqcUkbikacGaabcTUcYhcYGcYIcZgcZicZhcZkcZjcYicZlbGybGycGvcZmbVicGvcGvcZncoAcoAcxHcxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwocZobxXcyJcJMbxXcyJcyJcxHcxHckVcyJcZpbxXcZpcyJdlGbOMcoVbwobwobwobwobwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcMucTccSMcPacPacOjcMucTdcSEcTebikddfddgbikbikbikbikbikdlmbikbikbikdlodlnbikcSEcSEcTdcECcMHcECcCKcTgcEVcTgcCKcTgcEVcTgcCKcThcEVcTicCKaabcUkbikacGaabcUecYhcZfcYIcZtcZvcZhcZxcZwcZycYPcZAcZzcGvcdcbGycZBcQmbVicoAbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbwocZCczfcyJcZDbxXcyJbikbikbikbikcyJbxXbxXcNRcqecqecqfcqgcqebikaabaabaabaabcZEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcMucTjcOZcPacPacTkcMucTlcTmcSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTncTocECcTpcECcCKcTqcTrcTscCKcTtcTucTvcCKcTwcTxcTycCKaabcUkbikacGbikcUecZGcZscZucZHcZJcZIcZLcZKcYicZMcQmbVicQmcZNbVicZOcQmcozcoAcoDcoDcoDazybikaabbikbikbikbikbikbikbikbikbikbwocZPcyJcyJcHxbxXcyJcyJcxHcxHcyJcyJbxXcZQczfcqecQDcrfcrgcqebikbikaabaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcMucTjcOZcPacPacTkcMucTlcTmcSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTncTocECcTpcECcCKcTqcTrcTscCKcTtcTucTvcCKcTwcTxcTycCKaabcUkbikacGbikcUecZGcZscZucZHcZJcZIcZLcZKcYicZMcQmbVicQmcZNbVicZOcQmcozcoAcoDcoDcoDazybikaabbikbikbikbikbikbikbikbikbikbwocZPcyJcyJcHxbxXcyJcyJcxHcxHcyJcyJbxXcZQczfcqedcfcrfcrgcqebikbikaabaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaccMucMucMucMucMucMucMucECcSDcSEbikddcaaccSQaabaabdlqdlpdlraabcTzbikaacddcbikcSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaabcUkbikacGbikcTUcYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazybikaabbikcxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaacaacaabaabaabacGacGcECcECcTGcSEbikddfddgbikbikaabdlscTHdltaabbikbikdlodlnbikcSEcTJcECcECcMHcECcCKcTAcTKcTAcCKcTCcTLcTCcCKcTEcTMcTEcCKaabcUkbikacGbikcTUcYhcYhcYhdahcrBcrkdajcrkcrBcZXdakbGycGzdalcFicHrcGvdamcoAcoDcoDcoDdanaabaabbikcxHdaodapcyJbxXdaqdarcNRcyJdasbxXcyJdatbxXbxXdaubxXbwobwobwocxHcxHbwocqectrctscttcqeaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaabaabbikbikaabaabacGcECcECcSDcSEbikddcaacbikcTNaabdlvdludlwaabaabcSQaacddcbikcSEcSDcECcECcMHcECcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKaabcUkbikaqZbikcTUbikbikbikdavcrBdawdaydaxcrBbGydazbGybGydaAdaBcGqdaDdaCcoAbikbikbikbikbikaabbikcxHdaEdaFdaubxXcQobxXbxXdaucZobxXcyJcyJcyJcyJcyJbxXbwoaabbikbikbikaabcuzcuzcuAcuzcuzaabaabczraabaabcZEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwaabaabaabcUebikbikbikdaGcrBcrkdaHcrkcrBcoAdaIcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwaabaabaabaabaabaabaabcUnaabaabaabaabaabaabcUeaabaabaabdaGcrBdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwaabaabaabcUebikbikbikdaGcrBcrkdaHcrkcrBdrPdrQcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwaabaabaabaabaabaabaabcUnaabaabaabaabaabaabcUeaabaabaabdaGcrBdaPdaRdaQdaSaabdrPcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcECcTXcTYdddaabddcaaccSQbikbikcSQbikbikbikbikcSQaacddcbikddecUacUbcECddlcECcECcECcECcECcECbikbikaabbikbikbikcUnbikbikcUocUocUocUocUpbikbikaabdaGcUrcrBdaVcrBcrBbikaabbikbikdaWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbwodaFdaXbwocGxaabbwobwocxHcxHczMbwobikaabbikbikbikaabbikbikcxZbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcUfcUgcUhbikddcaacaacdlxaacaacdlxaacaacdlxaacaacddcbikcUicUgcUjcECddmcTRddnddocUtcUzcUxcUucUucUDcUucUucUucULcUucUucUMcUOcUNcUPcUpbikbikaabcUQazycrBdaYcrBdaZaabaabbikbikdctbikbikbikbikbikbikbikbikbikbikbikaabaabbikaahbikbikbwodbbdbabwodbcaabbikaabbikbikaabbikbikaabbikbikbikaabbikbikcznbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECdlybikdlzcTIcTIdlAcTIcTIdlAcTIcTIdlAcTIcTIdlBbikdlycECcECcECddmcUcddpcUlddqcURcRebikbikaabbikbikbikcUncUocUocUocUTcUScUTcUpbikbikaabaabazycLodbecLoazyaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikbikbikcxHdbfcxHcxHaabczrbikaabbikbikaabbikagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -9246,20 +9261,20 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcMHcMHcUyaIraIrcUAbikbikbikbikbikbikbikbikcTUbikcVJcVJcVmcVlcVncVJcVJcVJcVJcVJaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabdbHdbjdbjbikbikbikbikbikbikbikaabbikagQaabcLrcLrcLrcLrcLrbikcIZbikcLrcLrcLrcLrcLraabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcTpcMHdlDcUBcUFcUEbikbikbikbikbikbikbikbikcTUbikcVJcVocVqcVpcVscVrcVucVtcVvcVJaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabbikagQbikaabbikaabaabaabbikcIZbikaabbikaabbikaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjebikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcUIcMHcUGaIraIrcUHbikbikbikbikbikbikbikbikcTUbikcVJcVwcVycVxcVzcWhcVBcVAcVCcVJaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikagQbikcIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECcECcECcECcECbikbikbikbikbikbikaabaabcUeaabcVJcVDcVFcVEcVIcVHcVMcVKcVNcVJaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcObaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECcECcECcECcECbikbikbikbikbikbikaabaabcUeaabcVJcVDcVFcVEcVIdpUcVMcVKcVNcVJaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcObaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcVOcVPcVOcVRcVQcVTcVScVVcVUcVRcVRcVRcVRaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcLrcLrcLrcLrcLrbikcIZaabcLrcLrcLrcLrcLrbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVOcVOcVXcVWcVOcVRcVRcVLcVYcVRcWacVZcVZcWacWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaqZbikaabbikaabbikaabbikcPDbikaabbikaabaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVOcWbcWdcWccWecVRcWgcWfcWicVRcWkcWjcWjcWlcWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikcIYcIYcIYcIYcIYaabcGEaabcIYcIYcIYcIYcIYaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVOcWmcWocWncWrcWqcWtcWscWvcWqcWxcWwcWzcWycWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcKccKdcKdcKdcKdcQQcQRcQQcKhcKhcKhcKhcObaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikcVOcWAcWDcWCcWFcWEcWHcWGcWJcWIcWMcWKcWQcWNcWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcLrcLrcLrcLrcLrbikcGEbikcLrcLrcLrcLrcLrbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikcVOdnVcWDcWCcWFcWEcWHcWGcWJcWIcWMcWKcWQdrgcWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabcLrcLrcLrcLrcLrbikcGEbikcLrcLrcLrcLrcLrbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVOcVOcWUcWScWWcVRcWYcWXcWZcVRcXbcXacXccWacWabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikaabaabaabbikbikcGEaabbikbikaabaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcWucXecXfcXdcXdcXgcXhcXdcXfcXicXfcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikcGEbikbikbikagQagQagQaqZagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXdcXkcXjcXfcXmcXocXncXpcXmcXfcXqcXrcXdbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikagQaabcSBaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcXscXjcXfcXmcXocXncXpcXmcXfcXqcXtcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXucXdcWVcXvcXfcXwcXocXxcXzcXycXfcXqcXdcXdcXAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXucXdcWVcXvcXfcXwcXocXxcXzcXycXfcXqcXdcXddrSbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcWVcXBcXfcXCcXocXncXpcXmcXfcXDcXdaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWVcXEcXGcXFcXIcXHcXpcXJcXLcXKcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWVcXMcXfcXNcXOcXncXpcXPcXfcXMcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWVcXMcXfcXNcXOcXncXpdrAcXfcXMcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcWVcXMcXfcXwcXRcXQcXpcXycXfcXMcXdaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcWVcXMcXfcXmcXocXncXpcXmcXfcXMcXdcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcXScXMcXfcXmcXocXTcXpcXmcXfcXMcXMcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -9269,9 +9284,9 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXddcdcWBcWBddudduddvddxdducWBcWBdcdcXdbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXddcdcWBboSboScWLdgYdaiboSboScWBdcdcXdbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBdrsdrrdrudrtdrwdrvdrxcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBcWPcXZdrzdrydrAdaicWRcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBcWPcXZdrzdrydpfdaicWRcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWBcWBcWBboSdgYcWTdrBcWTdrCboScWBcWBcWBaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjgbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdrDcWBcWBdrEcWLdrFcWTcWTcWTcWOcWLdrGcWBcWBdrHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdrDcWBcWBdrEcWLdrFcWTcWTcWTcWOcWLdrGcWBcWBdrTbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWBcWBcWBcWPdrIdrKdrJcWTcWLcWRcWBcWBcWBaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBdrscWLdrMdrLboScWLdrxcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBboScWLcXldrNcWLcWLboScWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index 8ce7b1ce0ba..b6c5d55e5a9 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -2,77 +2,84 @@ //node2, air2, network2 correspond to output /obj/machinery/atmospherics/binary/circulator name = "circulator/heat exchanger" - desc = "A gas circulator pump and heat exchanger." - icon = 'icons/obj/pipes.dmi' - icon_state = "circ-off" - anchored = 0 - density = 1 + desc = "A gas circulator pump and heat exchanger. Its input port is on the south side, and its output port is on the north side." + icon = 'icons/obj/atmospherics/circulator.dmi' + icon_state = "circ1-off" + + var/side = CIRC_LEFT + + var/global/const/CIRC_LEFT = WEST + var/global/const/CIRC_RIGHT = EAST - var/recent_moles_transferred = 0 - var/last_heat_capacity = 0 - var/last_temperature = 0 var/last_pressure_delta = 0 - var/last_worldtime_transfer = 0 + + var/obj/machinery/power/generator/generator -/obj/machinery/atmospherics/binary/circulator/New() - ..() - desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]." + layer = 2.45 // Just above wires + + anchored = 1 + density = 1 + + can_unwrench = 1 + +// Creating a custom circulator pipe subtype to be delivered through cargo +/obj/item/pipe/circulator + name = "circulator/heat exchanger fitting" + +/obj/item/pipe/circulator/New(loc) + var/obj/machinery/atmospherics/binary/circulator/C = new /obj/machinery/atmospherics/binary/circulator(null) + ..(loc, make_from = C) + +/obj/machinery/atmospherics/binary/circulator/Destroy() + if(generator && generator.cold_circ == src) + generator.cold_circ = null + else if(generator && generator.hot_circ == src) + generator.hot_circ = null + return ..() /obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air() - var/datum/gas_mixture/removed - if(anchored && !(stat & BROKEN)) - var/input_starting_pressure = air1.return_pressure() - var/output_starting_pressure = air2.return_pressure() - last_pressure_delta = max(input_starting_pressure - output_starting_pressure + 10, 0) + var/output_starting_pressure = air1.return_pressure() + var/input_starting_pressure = air2.return_pressure() - //only circulate air if there is a pressure difference (plus 10 kPa to represent friction in the machine) - if(air1.temperature > 0 && last_pressure_delta > 0) + if(output_starting_pressure >= input_starting_pressure - 10) + //Need at least 10 KPa difference to overcome friction in the mechanism + last_pressure_delta = 0 + return null - //Calculate necessary moles to transfer using PV = nRT - recent_moles_transferred = last_pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + //Calculate necessary moles to transfer using PV = nRT + if(air2.temperature > 0) + var/pressure_delta = (input_starting_pressure - output_starting_pressure) / 2 - //Actually transfer the gas - removed = air1.remove(recent_moles_transferred) - if(removed) - last_heat_capacity = removed.heat_capacity() - last_temperature = removed.temperature + var/transfer_moles = pressure_delta * air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) - //Update the gas networks. - parent1.update = 1 + last_pressure_delta = pressure_delta - last_worldtime_transfer = world.time - else - recent_moles_transferred = 0 + //log_debug("pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];") + + //Actually transfer the gas + var/datum/gas_mixture/removed = air2.remove(transfer_moles) + + parent1.update = 1 + parent2.update = 1 - update_icon() return removed + else + last_pressure_delta = 0 + /obj/machinery/atmospherics/binary/circulator/process() - if(!..()) - return 0 - if(last_worldtime_transfer < world.time - 50) - recent_moles_transferred = 0 - update_icon() + ..() + update_icon() /obj/machinery/atmospherics/binary/circulator/update_icon() - if(stat & (BROKEN|NOPOWER) || !anchored) - icon_state = "circ-p" - else if(last_pressure_delta > 0 && recent_moles_transferred > 0) - if(last_pressure_delta > 5*ONE_ATMOSPHERE) - icon_state = "circ-run" + if(stat & (BROKEN|NOPOWER)) + icon_state = "circ[side]-p" + else if(last_pressure_delta > 0) + if(last_pressure_delta > ONE_ATMOSPHERE) + icon_state = "circ[side]-run" else - icon_state = "circ-slow" + icon_state = "circ[side]-slow" else - icon_state = "circ-off" + icon_state = "circ[side]-off" - return 1 - -/obj/machinery/atmospherics/binary/circulator/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if(istype(W, /obj/item/weapon/wrench)) - var/turf/T = get_turf(src) - if(!istype(T, /turf/simulated)) - return ..() - anchored = !anchored - to_chat(user, "You [(anchored) ? "fasten" : "loosen"] \the [src] to the floor") - playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - else return ..() + return 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 8570977d617..244e9c26aa3 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -213,7 +213,7 @@ var/datum/gas_mixture/environment = tile.return_air() if(scrubbing) - if((environment.toxins>0.001) || (environment.carbon_dioxide>0.001) || (environment.trace_gases.len>0)) + if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0)) var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() //Take a gas sample diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 2b2adbdbaf2..61bc32d378e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -59,10 +59,14 @@ #define HAS_SKIN_TONE 64 #define HAS_ICON_SKIN_TONE 128 #define HAS_SKIN_COLOR 256 -#define HAS_MARKINGS 512 -#define TAIL_WAGGING 1024 -#define NO_EYES 2048 -#define HAS_FUR 4096 +#define HAS_HEAD_MARKINGS 512 +#define HAS_BODY_MARKINGS 1024 +#define HAS_TAIL_MARKINGS 2048 +#define HAS_MARKINGS HAS_HEAD_MARKINGS|HAS_BODY_MARKINGS|HAS_TAIL_MARKINGS +#define TAIL_WAGGING 4096 +#define NO_EYES 8192 +#define HAS_FUR 16384 +#define HAS_ALT_HEADS 32768 //Species Diet Flags #define DIET_CARN 1 diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index fd39493da80..38e820b4768 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -2,6 +2,7 @@ #define TARGET_INVALID_IS_OWNER 1 #define TARGET_INVALID_NOT_HUMAN 2 #define TARGET_INVALID_DEAD 3 +#define TARGET_INVALID_NOCKEY 4 //gamemode istype helpers #define GAMEMODE_IS_BLOB (ticker && istype(ticker.mode, /datum/game_mode/blob)) @@ -45,4 +46,4 @@ #define SPECIAL_ROLE_XENOMORPH_HUNTER "Xenomorph Hunter" #define SPECIAL_ROLE_XENOMORPH_DRONE "Xenomorph Drone" #define SPECIAL_ROLE_XENOMORPH_SENTINEL "Xenomorph Sentinel" -#define SPECIAL_ROLE_XENOMORPH_LARVA "Xenomorph Larva" \ No newline at end of file +#define SPECIAL_ROLE_XENOMORPH_LARVA "Xenomorph Larva" diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 3828392f99e..11393957fc1 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -111,3 +111,6 @@ #define GENETIC_DAMAGE_STAGE_1 80 #define GENETIC_DAMAGE_STAGE_2 65 #define GENETIC_DAMAGE_STAGE_3 35 + +#define CLONER_FRESH_CLONE "fresh" +#define CLONER_MATURE_CLONE "mature" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 85221f5cf3c..dcb4501ce6e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -208,14 +208,14 @@ #define GLOVES_LAYER 11 #define EARS_LAYER 12 #define SUIT_LAYER 13 -#define GLASSES_LAYER 14 -#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 16 -#define BACK_LAYER 17 -#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me -#define HAIR_LAYER 19 //TODO: make part of head layer? -#define HEAD_ACCESSORY_LAYER 20 -#define FHAIR_LAYER 21 +#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 15 +#define BACK_LAYER 16 +#define HAIR_LAYER 17 //TODO: make part of head layer? +#define HEAD_ACCESSORY_LAYER 18 +#define FHAIR_LAYER 19 +#define TAIL_LAYER 20 //bs12 specific. this hack is probably gonna come back to haunt me +#define GLASSES_LAYER 21 #define FACEMASK_LAYER 22 #define HEAD_LAYER 23 #define COLLAR_LAYER 24 @@ -287,3 +287,6 @@ #define SHELTER_DEPLOY_BAD_TURFS "bad turfs" #define SHELTER_DEPLOY_BAD_AREA "bad area" #define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects" + +// The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps +#define OOC_COOLDOWN 5 diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 736ca0d291f..bf9c479d3e8 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -50,6 +50,10 @@ #define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up +//Mob attribute defaults. +#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles. +#define DEFAULT_MARKING_COLOURS list("head" = "#000000", "body" = "#000000", "tail" = "#000000") //Marking colours. Use instead of initial() for m_colours. + ////////REAGENT STUFF//////// // How many units of reagent are consumed per tick, by default. #define REAGENTS_METABOLISM 0.4 @@ -72,15 +76,18 @@ #define APPEARANCE_SKIN 8 #define APPEARANCE_HAIR 16 #define APPEARANCE_HAIR_COLOR 32 -#define APPEARANCE_FACIAL_HAIR 64 -#define APPEARANCE_FACIAL_HAIR_COLOR 128 -#define APPEARANCE_EYE_COLOR 256 -#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR -#define APPEARANCE_HEAD_ACCESSORY 512 -#define APPEARANCE_MARKINGS 1024 -#define APPEARANCE_BODY_ACCESSORY 2048 -#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY -#define APPEARANCE_ALL 4095 +#define APPEARANCE_SECONDARY_HAIR_COLOR 64 +#define APPEARANCE_FACIAL_HAIR 128 +#define APPEARANCE_FACIAL_HAIR_COLOR 256 +#define APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR 512 +#define APPEARANCE_EYE_COLOR 1024 +#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_SECONDARY_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR +#define APPEARANCE_HEAD_ACCESSORY 2048 +#define APPEARANCE_MARKINGS 4096 +#define APPEARANCE_BODY_ACCESSORY 8192 +#define APPEARANCE_ALT_HEAD 16384 +#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD +#define APPEARANCE_ALL 32767 // Intents #define I_HELP "help" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 8e0b22ffc2b..155f7dfae58 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -401,23 +401,6 @@ mobs_found += M return mobs_found -/proc/GetRedPart(const/hexa) - return hex2num(copytext(hexa,2,4)) - -/proc/GetGreenPart(const/hexa) - return hex2num(copytext(hexa,4,6)) - -/proc/GetBluePart(const/hexa) - return hex2num(copytext(hexa,6,8)) - -/proc/GetHexColors(const/hexa) - return list( - GetRedPart(hexa), - GetGreenPart(hexa), - GetBluePart(hexa) - ) - - /proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon) var/area/our_area = get_area_master(the_area) for(var/C in living_mob_list) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 7398518bb03..ed0b7887e5a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -18,6 +18,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f) //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) + //alt heads + init_sprite_accessory_subtypes(/datum/sprite_accessory/alt_heads, alt_heads_list) init_subtypes(/datum/surgery_step, surgery_steps) diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 114588009ed..986cbac0bd3 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -85,3 +85,18 @@ var/gaussian_next gaussian_next = R2 * working return (mean + stddev * R1) #undef ACCURACY + + + +// oof, what a mouthful +// Used in status_procs' "adjust" to let them modify a status effect by a given +// amount, without inadverdently increasing it in the wrong direction +/proc/directional_bounded_sum(orig_val, modifier, bound_lower, bound_upper) + var/new_val = orig_val + modifier + if(modifier > 0) + if(new_val > bound_upper) + new_val = max(orig_val, bound_upper) + else if(modifier < 0) + if(new_val < bound_lower) + new_val = min(orig_val, bound_lower) + return new_val diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index edde3f13142..a2e8542b825 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,3 +1,15 @@ +proc/GetOppositeDir(var/dir) + switch(dir) + if(NORTH) return SOUTH + if(SOUTH) return NORTH + if(EAST) return WEST + if(WEST) return EAST + if(SOUTHWEST) return NORTHEAST + if(NORTHWEST) return SOUTHEAST + if(NORTHEAST) return SOUTHWEST + if(SOUTHEAST) return NORTHWEST + return 0 + proc/random_underwear(gender, species = "Human") var/list/pick_list = list() switch(gender) @@ -34,57 +46,133 @@ proc/pick_species_allowed_underwear(list/all_picks, species) return pick(valid_picks) -proc/random_hair_style(var/gender, species = "Human") +proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead) var/h_style = "Bald" - var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + if(hairstyle == "Bald") //Just in case. + valid_hairstyles += hairstyle + continue + if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE)) + continue + if(species == "Machine") //If the user is a species who can have a robotic head... + if(!robohead) + robohead = all_robolimbs["Morpheus Cyberkinetics"] + if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_hairstyles += hairstyle //Give them their hairstyles if they do. + else + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */ + valid_hairstyles += hairstyle + else //If the user is not a species who can have robotic heads, use the default handling. + if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. + valid_hairstyles += hairstyle if(valid_hairstyles.len) h_style = pick(valid_hairstyles) - return h_style + return h_style -proc/GetOppositeDir(var/dir) - switch(dir) - if(NORTH) return SOUTH - if(SOUTH) return NORTH - if(EAST) return WEST - if(WEST) return EAST - if(SOUTHWEST) return NORTHEAST - if(NORTHWEST) return SOUTHEAST - if(NORTHEAST) return SOUTHWEST - if(SOUTHEAST) return NORTHWEST - return 0 - -proc/random_facial_hair_style(var/gender, species = "Human") +proc/random_facial_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead) var/f_style = "Shaved" - - var/list/valid_facialhairstyles = list() + var/list/valid_facial_hairstyles = list() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + if(facialhairstyle == "Shaved") //Just in case. + valid_facial_hairstyles += facialhairstyle + continue + if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE)) + continue + if(species == "Machine") //If the user is a species who can have a robotic head... + if(!robohead) + robohead = all_robolimbs["Morpheus Cyberkinetics"] + if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do. + else + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */ + valid_facial_hairstyles += facialhairstyle + else //If the user is not a species who can have robotic heads, use the default handling. + if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. + valid_facial_hairstyles += facialhairstyle - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) + if(valid_facial_hairstyles.len) + f_style = pick(valid_facial_hairstyles) - return f_style + return f_style + +proc/random_head_accessory(species = "Human") + var/ha_style = "None" + var/list/valid_head_accessories = list() + for(var/head_accessory in head_accessory_styles_list) + var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory] + + if(!(species in S.species_allowed)) + continue + valid_head_accessories += head_accessory + + if(valid_head_accessories.len) + ha_style = pick(valid_head_accessories) + + return ha_style + +proc/random_marking_style(var/location = "body", species = "Human", var/datum/robolimb/robohead, var/body_accessory, var/alt_head) + var/m_style = "None" + var/list/valid_markings = list() + for(var/marking in marking_styles_list) + var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking] + if(S.name == "None") + valid_markings += marking + continue + if(S.marking_location != location) //If the marking isn't for the location we desire, skip. + continue + if(!(species in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list. + continue + if(location == "tail") + if(!body_accessory) + if(S.tails_allowed) + continue + else + if(!S.tails_allowed || !(body_accessory in S.tails_allowed)) + continue + if(location == "head") + var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name] + if(species == "Machine")//If the user is a species that can have a robotic head... + if(!robohead) + robohead = all_robolimbs["Morpheus Cyberkinetics"] + if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head. + continue + else if(alt_head && alt_head != "None") //If the user's got an alt head, validate markings for that head. + if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed)) + continue + else + if(M.heads_allowed && !("All" in M.heads_allowed)) + continue + valid_markings += marking + + if(valid_markings.len) + m_style = pick(valid_markings) + + return m_style + +proc/random_body_accessory(species = "Vulpkanin") + var/body_accessory = null + var/list/valid_body_accessories = list() + for(var/B in body_accessory_by_name) + var/datum/body_accessory/A = body_accessory_by_name[B] + if(!istype(A)) + valid_body_accessories += "None" //The only null entry should be the "None" option. + continue + if(species in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. + valid_body_accessories += B + + if(valid_body_accessories.len) + body_accessory = pick(valid_body_accessories) + + return body_accessory proc/random_name(gender, species = "Human") diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 7e4fca82c32..1265846d199 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -10,7 +10,7 @@ //Returns an integer given a hex input /proc/hex2num(hex) - if(!( istext(hex) )) + if(!(istext(hex))) return var/num = 0 @@ -59,6 +59,27 @@ hex = "0[hex]" return hex || "0" +//Returns an integer value for R of R/G/B given a hex color input. +/proc/color2R(hex) + if(!(istext(hex))) + return + + return hex2num(copytext(hex, 2, 4)) //Returning R + +//Returns an integer value for G of R/G/B given a hex color input. +/proc/color2G(hex) + if(!(istext(hex))) + return + + return hex2num(copytext(hex, 4, 6)) //Returning G + +//Returns an integer value for B of R/G/B given a hex color input. +/proc/color2B(hex) + if(!(istext(hex))) + return + + return hex2num(copytext(hex, 6, 8)) //Returning B + /proc/text2numlist(text, delimiter="\n") var/list/num_list = list() for(var/x in splittext(text, delimiter)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index d409d6e54c9..713289c737c 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -23,6 +23,8 @@ var/global/list/undershirt_f = list() //stores only undershirt name var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name var/global/list/socks_m = list() //stores only socks name var/global/list/socks_f = list() //stores only socks name + //Alt Heads +var/global/list/alt_heads_list = list() //stores /datum/sprite_accessory/alt_heads indexed by name //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm index 44b678a8f67..ae26485208b 100644 --- a/code/_globalvars/mapping.dm +++ b/code/_globalvars/mapping.dm @@ -18,7 +18,6 @@ var/global/list/global_map = null //3 - AI satellite //5 - empty space -var/list/monkeystart = list() var/list/wizardstart = list() var/list/newplayer_start = list() var/list/latejoin = list() @@ -26,10 +25,9 @@ var/list/latejoin_gateway = list() var/list/latejoin_cryo = list() var/list/latejoin_cyborg = list() var/list/prisonwarp = list() //prisoners go to these -var/list/holdingfacility = list() //captured people go here var/list/xeno_spawn = list()//Aliens spawn at these. var/list/ertdirector = list() -// list/mazewarp = list() +var/list/emergencyresponseteamspawn = list() var/list/tdome1 = list() var/list/tdome2 = list() var/list/team_alpha = list() diff --git a/code/_globalvars/unused.dm b/code/_globalvars/unused.dm index d3945b68eab..e55794c3dc9 100644 --- a/code/_globalvars/unused.dm +++ b/code/_globalvars/unused.dm @@ -31,10 +31,4 @@ var/endicon = null var/datum/air_tunnel/air_tunnel1/SS13_airtunnel = null var/going = 1.0 var/datum/engine_eject/engine_eject_control = null -// list/traitors = list() //traitor list -// list/traitobj = list( ) -var/airtunnel_start = 68 // default -var/airtunnel_stop = 68 // default -var/airtunnel_bottom = 72 // default -// reverse_dir[dir] = reverse of dir diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index a476fbc78d5..66377ec3fcd 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -62,7 +62,7 @@ CtrlClickOn(A) return - if(stat || paralysis || stunned || weakened) + if(incapacitated(ignore_restraints = 1, ignore_grab = 1, ignore_lying = 1)) return face_atom(A) diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm index d37b7368b8f..df5cc6a4214 100644 --- a/code/_onclick/click_override.dm +++ b/code/_onclick/click_override.dm @@ -62,7 +62,7 @@ to_chat(user, "There is no cable here to power the gloves.") return user.visible_message("[user.name] fires an arc of electricity at [L]!", "You fire an arc of electricity at [L]!", "You hear the loud crackle of electricity!") - var/datum/powernet/PN = C.get_powernet() + playsound(user.loc, 'sound/effects/eleczap.ogg', 75, 1) user.Beam(L,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - electrocute_mob(L, PN, user) + electrocute_mob(L, C, user) last_shocked = world.time diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 1f60c26f885..a15176af87c 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -39,7 +39,7 @@ CtrlClickOn(A) return - if(stat || lockcharge || weakened || stunned || paralysis) + if(incapacitated()) return if(next_move >= world.time) diff --git a/code/controllers/Processes/fast_process.dm b/code/controllers/Processes/fast_process.dm index 85a688c3d12..72ed0e68fee 100644 --- a/code/controllers/Processes/fast_process.dm +++ b/code/controllers/Processes/fast_process.dm @@ -6,7 +6,7 @@ /datum/controller/process/fast_process/statProcess() ..() - stat(null, "[fast_processing.len] fast machines") + stat(null, "[fast_processing.len] fast processes") /datum/controller/process/fast_process/doWork() for(last_object in fast_processing) diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 711412608ba..2e60f8752b8 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -79,6 +79,11 @@ var/global/datum/controller/process/timer/timer_master return event.id /proc/deltimer(id) + if(id == 0) + // No event will correspond to an id of 0 - the timer does not exist + // Save us a possibly expensive iteration through the timer list + // This would probably be more efficient in general if we used an associative list instead + return 0 for(var/datum/timedevent/event in timer_master.processing_timers) if(event.id == id) qdel(event) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 26738b137fe..c7edd88803a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -141,7 +141,12 @@ proc/get_id_photo(var/mob/living/carbon/human/H) var/icon/temp temp = new /icon(icobase, "groin_[g]") preview_icon.Blend(temp, ICON_OVERLAY) - temp = new /icon(icobase, "head_[g]") + var/head = "head" + if(head_organ.alt_head && head_organ.species.bodyflags & HAS_ALT_HEADS) + var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[head_organ.alt_head] + if(alternate_head.icon_state) + head = alternate_head.icon_state + temp = new /icon(icobase, "[head]_[g]") preview_icon.Blend(temp, ICON_OVERLAY) //Tail @@ -188,6 +193,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H) hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD) else hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) + + if(hair_style.secondary_theme) + var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") + if(!hair_style.no_sec_colour) + hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD) + hair_s.Blend(hair_secondary_s, ICON_OVERLAY) + face_s.Blend(hair_s, ICON_OVERLAY) //Head Accessory @@ -205,15 +217,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H) facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD) else facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD) + + if(facial_hair_style.secondary_theme) + var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") + if(!facial_hair_style.no_sec_colour) + facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD) + facial_s.Blend(facial_secondary_s, ICON_OVERLAY) + face_s.Blend(facial_s, ICON_OVERLAY) //Markings - if(H.species.bodyflags & HAS_MARKINGS) - var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style] - if(marking_style && marking_style.species_allowed) - var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") - markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD) - face_s.Blend(markings_s, ICON_OVERLAY) + if((H.species.bodyflags & HAS_HEAD_MARKINGS) || (H.species.bodyflags & HAS_BODY_MARKINGS)) + if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings. + var/body_marking = H.m_styles["body"] + var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking] + if(body_marking_style && body_marking_style.species_allowed) + var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") + b_marking_s.Blend(H.m_colours["body"], ICON_ADD) + face_s.Blend(b_marking_s, ICON_OVERLAY) + if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings. + var/head_marking = H.m_styles["head"] + var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking] + if(head_marking_style && head_marking_style.species_allowed) + var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") + h_marking_s.Blend(H.m_colours["head"], ICON_ADD) + face_s.Blend(h_marking_s, ICON_OVERLAY) preview_icon.Blend(face_s, ICON_OVERLAY) diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 8f388c45edc..9e806b24f41 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -35,6 +35,6 @@ Bonus to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") else to_chat(M, "You can't think straight!") - M.confused = min(100, M.confused + 8) + M.AdjustConfused(8, bound_lower = 0, bound_upper = 100) return diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 6c65e330fa8..1a9bba6961e 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -33,11 +33,11 @@ Bonus if(3, 4) to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") if(5) - if(!(M.ear_deaf)) + if(!(M.disabilities & DEAF)) to_chat(M, "Your ears pop and begin ringing loudly!") - M.setEarDamage(-1,INFINITY) //Shall be enough + M.BecomeDeaf() spawn(200) if(M) to_chat(M, "The ringing in your ears fades...") - M.setEarDamage(-1,0) - return \ No newline at end of file + M.CureDeaf() + return diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index cac8b4d2e03..e117dbf51f8 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -36,6 +36,6 @@ Bonus to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]") else to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") - M.hallucination += 5 + M.AdjustHallucinate(5) return diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 150b7483aaa..4d9716e44da 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -24,18 +24,18 @@ to_chat(affected_mob, "You feel panicky.") if(prob(2)) to_chat(affected_mob, "You're overtaken with panic!") - affected_mob.confused += (rand(2,3)) + affected_mob.AdjustConfused(rand(2,3)) if(4) if(prob(10)) to_chat(affected_mob, "You feel butterflies in your stomach.") if(prob(5)) affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \ "You have a panic attack!") - affected_mob.confused += (rand(6,8)) - affected_mob.jitteriness += (rand(6,8)) + affected_mob.AdjustConfused(rand(6,8)) + affected_mob.AdjustJitter(rand(6,8)) if(prob(2)) affected_mob.visible_message("[affected_mob] coughs up butterflies!", \ "You cough up butterflies!") new /mob/living/simple_animal/butterfly(affected_mob.loc) new /mob/living/simple_animal/butterfly(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 7f04eb5fc56..e3482955865 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -106,7 +106,7 @@ if(3) if(prob(4)) to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.confused += 10 + affected_mob.AdjustConfused(10) if(4) if(prob(3)) affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) @@ -241,4 +241,4 @@ stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") stage4 = list("You're ravenous.") stage5 = list("You have become a morph.") - new_form = /mob/living/simple_animal/hostile/morph \ No newline at end of file + new_form = /mob/living/simple_animal/hostile/morph diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 11c06e386c5..4cd027a7d7d 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -44,7 +44,7 @@ affected_mob.AdjustSleeping(5) if(prob(2)) to_chat(affected_mob, "You feel your mind relax and your thoughts drift!") - affected_mob.confused = min(100, affected_mob.confused + 8) + affected_mob.AdjustConfused(8, bound_lower = 0, bound_upper = 100) if(prob(10)) affected_mob.vomit(20) if(prob(3)) @@ -55,4 +55,3 @@ to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") affected_mob.bodytemperature += 40 return - diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm index dbcc9bbb3c0..16706087673 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -20,15 +20,15 @@ if(prob(10)) affected_mob.emote(pick("cough","groan", "gasp")) - affected_mob.losebreath++ + affected_mob.AdjustLoseBreath(1) if(prob(15)) if(prob(33)) to_chat(affected_mob, "You feel sickly and weak.") - affected_mob.slowed += 3 + affected_mob.AdjustSlowed(3) affected_mob.adjustToxLoss(toxdamage) if(prob(5)) to_chat(affected_mob, "Your joints ache horribly!") affected_mob.Weaken(stuntime) - affected_mob.Stun(stuntime) \ No newline at end of file + affected_mob.Stun(stuntime) diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 6498f16c0d3..0a17435c5c0 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -61,7 +61,7 @@ else if(istype(used_atom, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = used_atom if(C.amount<4) - to_chat(user, ("There's not enough cable to finish the task.")) + to_chat(user, ("There's not enough cable to finish the task.")) return 0 else C.use(4) @@ -69,7 +69,7 @@ else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - to_chat(user, ("There's not enough material in this stack.")) + to_chat(user, ("There's not enough material in this stack.")) return 0 else S.use(5) @@ -106,30 +106,29 @@ return proc/try_consume(mob/user as mob, atom/used_atom, amount) - if(amount>0) - // STACKS - if(istype(used_atom,/obj/item/stack)) - var/obj/item/stack/stack=used_atom - if(stack.amount < amount) - to_chat(user, "\red You don't have enough [stack]! You need at least [amount].") - return 0 - stack.use(amount) + if(amount > 0) // CABLES if(istype(used_atom,/obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil=used_atom - if(coil.amount < amount) - to_chat(user, "\red You don't have enough cable! You need at least [amount] coils.") + if(!coil.use(amount)) + to_chat(user, "You don't have enough cable! You need at least [amount] coils.") return 0 - coil.use(amount) // WELDER if(istype(used_atom,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder=used_atom if(!welder.isOn()) - to_chat(user, "\blue You tap the [src] with your unlit welder. [pick("Ding","Dong")].") + to_chat(user, "You tap the [src] with your unlit welder. [pick("Ding","Dong")].") return 0 if(!welder.remove_fuel(amount,user)) - to_chat(user, "\red You don't have enough fuel!") + to_chat(user, "You don't have enough fuel!") return 0 + // STACKS + if(istype(used_atom,/obj/item/stack)) + var/obj/item/stack/stack=used_atom + if(stack.amount < amount) + to_chat(user, "You don't have enough [stack]! You need at least [amount].") + return 0 + stack.use(amount) return 1 /datum/construction/reversible diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0fc63dd0ae9..50595bb23a6 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -589,7 +589,7 @@ var/list/possible_targets = list("Free objective") for(var/datum/mind/possible_target in ticker.minds) if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) - possible_targets += possible_target.current + possible_targets += possible_target var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets if(!new_target) @@ -1523,7 +1523,7 @@ jumpsuit.color = team_color H.update_inv_w_uniform(0,0) - log_admin("[ckey(missionary.key)] has converted [ckey(current.key)] as a zealot.") + add_logs(missionary, current, "converted", addition = "for [convert_duration/600] minutes") addtimer(src, "remove_zealot", convert_duration, FALSE, jumpsuit) //deconverts after the timer expires return 1 @@ -1532,7 +1532,7 @@ if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages return ticker.mode.remove_traitor_mind(src) - log_admin("[ckey(current.key)] has deconverted and is no longer a zealot of [ckey(zealot_master.key)].") + add_logs(zealot_master, current, "lost control of", addition = "as their zealot master") zealot_master = null if(jumpsuit) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 645af5e8aea..2e953f3ec91 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -42,7 +42,7 @@ var/byproduct // example: = /obj/item/weapon/kitchen/mould // byproduct to return, such as a mould or trash -/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous +/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous . = 1 for(var/r_r in reagents) var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r) @@ -55,7 +55,7 @@ return -1 return . -/datum/recipe/proc/check_fruit(var/obj/container) +/datum/recipe/proc/check_fruit(obj/container) . = 1 if(fruit && fruit.len) var/list/checklist = list() @@ -74,7 +74,7 @@ break return . -/datum/recipe/proc/check_items(var/obj/container as obj) +/datum/recipe/proc/check_items(obj/container) . = 1 if(items && items.len) var/list/checklist = list() @@ -96,7 +96,7 @@ return . //general version -/datum/recipe/proc/make(var/obj/container as obj) +/datum/recipe/proc/make(obj/container) var/obj/result_obj = new result(container) for(var/obj/O in (container.contents-result_obj)) O.reagents.trans_to(result_obj, O.reagents.total_volume) @@ -106,7 +106,7 @@ return result_obj // food-related -/datum/recipe/proc/make_food(var/obj/container as obj) +/datum/recipe/proc/make_food(obj/container) var/obj/result_obj = new result(container) for(var/obj/O in (container.contents-result_obj)) if(O.reagents) @@ -118,7 +118,7 @@ score_meals++ return result_obj -/proc/select_recipe(var/list/datum/recipe/avaiable_recipes, var/obj/obj as obj, var/exact = 1 as num) +/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1) if(!exact) exact = -1 var/list/datum/recipe/possible_recipes = new diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm index d4d3b383f9d..fe0e02bda6d 100644 --- a/code/datums/spells/cluwne.dm +++ b/code/datums/spells/cluwne.dm @@ -16,7 +16,7 @@ adjustBrainLoss(80) nutrition = 9000 overeatduration = 9000 - confused = 30 + Confused(30) if(mind) mind.assigned_role = "Cluwne" @@ -44,8 +44,8 @@ adjustBrainLoss(-120) nutrition = NUTRITION_LEVEL_STARVING overeatduration = 0 - confused = 0 - jitteriness = 0 + SetConfused(0) + SetJitter(0) if(mind) mind.assigned_role = "Lawyer" diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 9ddac0b0920..1eed65bbed4 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -50,8 +50,8 @@ target.Paralyse(amt_paralysis) target.Stun(amt_stunned) - target.eye_blind += amt_eye_blind - target.eye_blurry += amt_eye_blurry + target.AdjustEyeBlind(amt_eye_blind) + target.AdjustEyeBlurry(amt_eye_blurry) //summoning if(summon_type) - new summon_type(target.loc, target) \ No newline at end of file + new summon_type(target.loc, target) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 9d9f171bda8..7a8f05e08fc 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -581,7 +581,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space, /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath,) + /obj/item/clothing/mask/breath) cost = 30 containertype = /obj/structure/closet/crate/secure containername = "space suit crate" @@ -607,15 +607,27 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Thermo-Electric Generator Crate" contains = list( /obj/machinery/power/generator, - /obj/machinery/atmospherics/binary/circulator, - /obj/machinery/atmospherics/binary/circulator - ) + /obj/item/pipe/circulator, + /obj/item/pipe/circulator) cost = 25 containertype = /obj/structure/closet/crate/secure containername = "thermo-electric generator crate" access = access_ce announce_beacons = list("Engineering" = list("Chief Engineer's Desk", "Atmospherics")) +/datum/supply_packs/engineering/conveyor + name = "Conveyor Assembly Crate" + contains = list(/obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_switch_construct, + /obj/item/weapon/paper/conveyor) + cost = 15 + containername = "conveyor assembly crate" + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Medical ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 5f7b5e8237a..bba4971acd9 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -483,7 +483,7 @@ var/list/uplink_items = list() desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!" reference = "AGG" item = /obj/item/weapon/storage/box/syndie_kit/atmosgasgrenades - cost = 6 + cost = 11 /datum/uplink_item/dangerous/emp name = "EMP Grenades and Implanter Kit" @@ -577,11 +577,32 @@ var/list/uplink_items = list() /datum/uplink_item/ammo/pistol name = "Magazine - 10mm" - desc = "An additional 8-round 10mm magazine for use in the syndicate pistol. These subsonic rounds are dirt cheap but are half as effective as .357 rounds." + desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds that are cheap but around half as effective as .357" reference = "10MM" item = /obj/item/ammo_box/magazine/m10mm cost = 1 +/datum/uplink_item/ammo/pistolap + name = "Magazine - 10mm Armour Piercing" + desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds that are less effective at injuring the target but penetrate protective gear." + reference = "10MMAP" + item = /obj/item/ammo_box/magazine/m10mm/ap + cost = 2 + +/datum/uplink_item/ammo/pistolfire + name = "Magazine - 10mm Incendiary" + desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with incendiary rounds which ignite the target." + reference = "10MMFIRE" + item = /obj/item/ammo_box/magazine/m10mm/fire + cost = 2 + +/datum/uplink_item/ammo/pistolhp + name = "Magazine - 10mm Hollow Point" + desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds which are more damaging but ineffective against armour." + reference = "10MMHP" + item = /obj/item/ammo_box/magazine/m10mm/hp + cost = 3 + /datum/uplink_item/ammo/revolver name = "Speed Loader - .357" desc = "A speed loader that contains seven additional .357 Magnum rounds for the syndicate revolver. For when you really need a lot of things dead." @@ -791,7 +812,7 @@ var/list/uplink_items = list() reference = "CHHUD" item = /obj/item/clothing/glasses/hud/security/chameleon cost = 2 - + /datum/uplink_item/stealthy_weapons/chameleonflag name = "Chameleon Flag" desc = "A flag that can be disguised as any other known flag. There is a heat sensitive bomb loaded into the pole that will be detonated if the flag is lit on fire." @@ -1180,6 +1201,9 @@ var/list/uplink_items = list() /datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) if(findtext(item, /obj/item/organ/internal/cyberimp)) + U.uses -= max(cost, 0) + U.used_TC += cost + feedback_add_details("traitor_uplink_items_bought", name) //this one and the line before copypasted because snowflaek code return new /obj/item/weapon/storage/box/cyber_implants(loc, item) else return ..() diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index c147bd9235c..6c9387644b0 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -60,9 +60,9 @@ Sound(message_sound) Log(message, message_title) -datum/announcement/proc/Message(message as text, message_title as text) +/datum/announcement/proc/Message(message as text, message_title as text) for(var/mob/M in player_list) - if(!istype(M,/mob/new_player) && !isdeaf(M)) + if(M.can_hear()) to_chat(M, "

[title]

") to_chat(M, "[message]") if(announcer) @@ -72,14 +72,14 @@ datum/announcement/proc/Message(message as text, message_title as text) to_chat(world, "[message_title]") to_chat(world, "[message]") -datum/announcement/priority/Message(message as text, message_title as text) +/datum/announcement/priority/Message(message as text, message_title as text) to_chat(world, "

[message_title]

") to_chat(world, "[message]") if(announcer) to_chat(world, " -[html_encode(announcer)]") to_chat(world, "
") -datum/announcement/priority/command/Message(message as text, message_title as text) +/datum/announcement/priority/command/Message(message as text, message_title as text) var/command command += "

[command_name()] Update

" if(message_title) @@ -88,10 +88,10 @@ datum/announcement/priority/command/Message(message as text, message_title as te command += "
[message]
" command += "
" for(var/mob/M in player_list) - if(!istype(M,/mob/new_player) && !isdeaf(M)) + if(M.can_hear()) to_chat(M, command) -datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text) +/datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text) var/command command += "

[from]

" if(message_title) @@ -100,14 +100,14 @@ datum/announcement/priority/enemy/Message(message as text, message_title as text command += "
[message]
" command += "
" for(var/mob/M in player_list) - if(!istype(M,/mob/new_player) && !isdeaf(M)) + if(M.can_hear()) to_chat(M, command) -datum/announcement/priority/security/Message(message as text, message_title as text) +/datum/announcement/priority/security/Message(message as text, message_title as text) to_chat(world, "[message_title]") to_chat(world, "[message]") -datum/announcement/proc/NewsCast(message as text, message_title as text) +/datum/announcement/proc/NewsCast(message as text, message_title as text) if(disable_newscasts) return if(!newscast) @@ -121,28 +121,28 @@ datum/announcement/proc/NewsCast(message as text, message_title as text) news.can_be_redacted = 0 announce_newscaster_news(news) -datum/announcement/proc/PlaySound(var/message_sound) +/datum/announcement/proc/PlaySound(var/message_sound) if(!message_sound) return for(var/mob/M in player_list) - if(!istype(M,/mob/new_player) && !isdeaf(M)) + if(M.can_hear()) M << message_sound -datum/announcement/proc/Sound(var/message_sound) +/datum/announcement/proc/Sound(var/message_sound) PlaySound(message_sound) -datum/announcement/priority/Sound(var/message_sound) +/datum/announcement/priority/Sound(var/message_sound) if(sound) world << sound -datum/announcement/priority/command/Sound(var/message_sound) +/datum/announcement/priority/command/Sound(var/message_sound) PlaySound(message_sound) -datum/announcement/proc/Log(message as text, message_title as text) +/datum/announcement/proc/Log(message as text, message_title as text) if(log) log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]") message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1) - + /proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I) // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) - return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name + return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 59ca735f843..1bcc5bad5ef 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1554,6 +1554,14 @@ var/list/ghostteleportlocs = list() name = "\improper Surgery" icon_state = "surgery" +/area/medical/surgery1 + name = "\improper Surgery 1" + icon_state = "surgery1" + +/area/medical/surgery2 + name = "\improper Surgery 2" + icon_state = "surgery2" + /area/medical/surgeryobs name = "\improper Surgery Observation" icon_state = "surgery" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0dd6c109170..7f4b0574450 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -179,7 +179,7 @@ if(has_gravity(src)) return 1 - if(pulledby) + if(pulledby && !pulledby.pulling) return 1 if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 78b889071f5..82f7ffb2e93 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -30,19 +30,27 @@ #define DNA_UI_HACC_R 11 #define DNA_UI_HACC_G 12 #define DNA_UI_HACC_B 13 -#define DNA_UI_MARK_R 14 -#define DNA_UI_MARK_G 15 -#define DNA_UI_MARK_B 16 -#define DNA_UI_EYES_R 17 -#define DNA_UI_EYES_G 18 -#define DNA_UI_EYES_B 19 -#define DNA_UI_GENDER 20 -#define DNA_UI_BEARD_STYLE 21 -#define DNA_UI_HAIR_STYLE 22 +#define DNA_UI_HEAD_MARK_R 14 +#define DNA_UI_HEAD_MARK_G 15 +#define DNA_UI_HEAD_MARK_B 16 +#define DNA_UI_BODY_MARK_R 17 +#define DNA_UI_BODY_MARK_G 18 +#define DNA_UI_BODY_MARK_B 19 +#define DNA_UI_TAIL_MARK_R 20 +#define DNA_UI_TAIL_MARK_G 21 +#define DNA_UI_TAIL_MARK_B 22 +#define DNA_UI_EYES_R 23 +#define DNA_UI_EYES_G 24 +#define DNA_UI_EYES_B 25 +#define DNA_UI_GENDER 26 +#define DNA_UI_BEARD_STYLE 27 +#define DNA_UI_HAIR_STYLE 28 /*#define DNA_UI_BACC_STYLE 23*/ -#define DNA_UI_HACC_STYLE 23 -#define DNA_UI_MARK_STYLE 24 -#define DNA_UI_LENGTH 24 // Update this when you add something, or you WILL break shit. +#define DNA_UI_HACC_STYLE 29 +#define DNA_UI_HEAD_MARK_STYLE 30 +#define DNA_UI_BODY_MARK_STYLE 31 +#define DNA_UI_TAIL_MARK_STYLE 32 +#define DNA_UI_LENGTH 32 // Update this when you add something, or you WILL break shit. #define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow. @@ -128,16 +136,18 @@ var/global/list/bad_blocks[0] var/obj/item/organ/external/head/H = character.get_organ("head") var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes) - /*// Body Accessory if(!character.body_accessory) character.body_accessory = null var/bodyacc = character.body_accessory*/ // Markings - if(!character.m_style) - character.m_style = "None" - var/marks = marking_styles_list.Find(character.m_style) + if(!character.m_styles) + character.m_styles = DEFAULT_MARKING_STYLES + + var/head_marks = marking_styles_list.Find(character.m_styles["head"]) + var/body_marks = marking_styles_list.Find(character.m_styles["body"]) + var/tail_marks = marking_styles_list.Find(character.m_styles["tail"]) head_traits_to_dna(H) eye_color_to_dna(eyes_organ) @@ -146,15 +156,25 @@ var/global/list/bad_blocks[0] SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1) SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1) - SetUIValueRange(DNA_UI_MARK_R, character.r_markings, 255, 1) - SetUIValueRange(DNA_UI_MARK_G, character.g_markings, 255, 1) - SetUIValueRange(DNA_UI_MARK_B, character.b_markings, 255, 1) + SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, 1) + SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, 1) + SetUIValueRange(DNA_UI_HEAD_MARK_B, color2B(character.m_colours["head"]), 255, 1) - SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative. + SetUIValueRange(DNA_UI_BODY_MARK_R, color2R(character.m_colours["body"]), 255, 1) + SetUIValueRange(DNA_UI_BODY_MARK_G, color2G(character.m_colours["body"]), 255, 1) + SetUIValueRange(DNA_UI_BODY_MARK_B, color2B(character.m_colours["body"]), 255, 1) - SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) + SetUIValueRange(DNA_UI_TAIL_MARK_R, color2R(character.m_colours["tail"]), 255, 1) + SetUIValueRange(DNA_UI_TAIL_MARK_G, color2G(character.m_colours["tail"]), 255, 1) + SetUIValueRange(DNA_UI_TAIL_MARK_B, color2B(character.m_colours["tail"]), 255, 1) + + SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative. + + SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) /*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/ - SetUIValueRange(DNA_UI_MARK_STYLE, marks, marking_styles_list.len, 1) + SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, marking_styles_list.len, 1) + SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, marking_styles_list.len, 1) + SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, marking_styles_list.len, 1) UpdateUI() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 137617ffd1e..2c5fdbbb5b1 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -138,9 +138,9 @@ H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255) H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255) - H.r_markings = dna.GetUIValueRange(DNA_UI_MARK_R, 255) - H.g_markings = dna.GetUIValueRange(DNA_UI_MARK_G, 255) - H.b_markings = dna.GetUIValueRange(DNA_UI_MARK_B, 255) + H.m_colours["head"] = rgb(dna.GetUIValueRange(DNA_UI_HEAD_MARK_R, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_G, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_B, 255)) + H.m_colours["body"] = rgb(dna.GetUIValueRange(DNA_UI_BODY_MARK_R, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_G, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_B, 255)) + H.m_colours["tail"] = rgb(dna.GetUIValueRange(DNA_UI_TAIL_MARK_R, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_G, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_B, 255)) H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. @@ -149,16 +149,37 @@ else H.change_gender(MALE, 0) - //Markings - var/marks = dna.GetUIValueRange(DNA_UI_MARK_STYLE,marking_styles_list.len) - if((0 < marks) && (marks <= marking_styles_list.len)) - H.m_style = marking_styles_list[marks] + var/number_head_marks = 0 + var/number_body_marks = 0 + var/number_tail_marks = 0 + for(var/m in marking_styles_list) + var/datum/sprite_accessory/body_markings/marking = marking_styles_list[m] + if(marking.marking_location == "head") + number_head_marks++ + else if(marking.marking_location == "body") + number_body_marks++ + else if(marking.marking_location == "tail") + number_tail_marks++ + + //Head Markings + var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, marking_styles_list.len) + if((head_marks > 0) && (head_marks <= number_head_marks)) + H.m_styles["head"] = marking_styles_list[head_marks] + //Body Markings + var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE, marking_styles_list.len) + if((body_marks > 0) && (body_marks <= number_body_marks)) + H.m_styles["body"] = marking_styles_list[body_marks] + //Tail Markings + var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, marking_styles_list.len) + if((tail_marks > 0) && (tail_marks <= number_tail_marks)) + H.m_styles["tail"] = marking_styles_list[tail_marks] H.force_update_limbs() H.update_eyes() H.update_hair() H.update_fhair() H.update_markings() + H.update_tail_layer() H.update_head_accessory() return 1 @@ -178,7 +199,7 @@ //Hair var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len) - if((0 < hair) && (hair <= hair_styles_list.len)) + if((hair > 0) && (hair <= hair_styles_list.len)) head_organ.h_style = hair_styles_list[hair] head_organ.r_hair = GetUIValueRange(DNA_UI_HAIR_R, 255) @@ -187,7 +208,7 @@ //Facial Hair var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len) - if((0 < beard) && (beard <= facial_hair_styles_list.len)) + if((beard > 0) && (beard <= facial_hair_styles_list.len)) head_organ.f_style = facial_hair_styles_list[beard] head_organ.r_facial = GetUIValueRange(DNA_UI_BEARD_R, 255) @@ -196,7 +217,7 @@ //Head Accessories var/headacc = GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len) - if((0 < headacc) && (headacc <= head_accessory_styles_list.len)) + if((headacc > 0) && (headacc <= head_accessory_styles_list.len)) head_organ.ha_style = head_accessory_styles_list[headacc] head_organ.r_headacc = GetUIValueRange(DNA_UI_HACC_R, 255) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 40814a72c78..63c42687b67 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -144,7 +144,7 @@ if(usr.stat != 0) return - if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return if(!ishuman(usr)) //Make sure they're a mob that has dna to_chat(usr, "Try as you might, you can not climb up into the [src].") @@ -169,7 +169,7 @@ return if(O.loc == user) //no you can't pull things out of your ass return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + if(user.incapacitated()) //are you cuffed, dying, lying, stunned or other return if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source return @@ -973,4 +973,4 @@ return 1 -/////////////////////////// DNA MACHINES \ No newline at end of file +/////////////////////////// DNA MACHINES diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index a30d160fd92..4cfa6f45750 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -24,7 +24,7 @@ /datum/dna/gene/disability/can_activate(var/mob/M,var/flags) return 1 // Always set! -/datum/dna/gene/disability/activate(var/mob/M, var/connected, var/flags) +/datum/dna/gene/disability/activate(var/mob/living/M, var/connected, var/flags) ..() if(mutation && !(mutation in M.mutations)) M.mutations.Add(mutation) @@ -35,7 +35,7 @@ else testing("[name] has no activation message.") -/datum/dna/gene/disability/deactivate(var/mob/M, var/connected, var/flags) +/datum/dna/gene/disability/deactivate(var/mob/living/M, var/connected, var/flags) ..() if(mutation && (mutation in M.mutations)) M.mutations.Remove(mutation) @@ -127,7 +127,7 @@ /datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) ..(M,connected,flags) - M.ear_deaf = 1 + M.EarDeaf(1) /datum/dna/gene/disability/nearsighted name="Nearsightedness" diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index f9e9c2678a5..1ada7c0f5ac 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -288,6 +288,10 @@ if((O in user) && is_type_in_list(O,own_blacklist)) continue if(is_type_in_list(O,types_allowed)) + if(isanimal(O)) + var/mob/living/simple_animal/SA = O + if(!SA.gold_core_spawnable) + continue possible_targets += O targets += input("Choose the target of your hunger.", "Targeting") as null|anything in possible_targets diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 992e4326317..a194ddfeed1 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -54,10 +54,14 @@ eyes_blue = eyes_organ.eye_colour[3] var/new_eyes = input("Please select eye color.", "Character Generation", rgb(eyes_red,eyes_green,eyes_blue)) as null|color if(new_eyes) - eyes_red = hex2num(copytext(new_eyes, 2, 4)) - eyes_green = hex2num(copytext(new_eyes, 4, 6)) - eyes_blue = hex2num(copytext(new_eyes, 6, 8)) - M.change_eye_color(eyes_red, eyes_green, eyes_blue) + M.change_eye_color(color2R(new_eyes), color2G(new_eyes), color2B(new_eyes)) + + //Alt heads. + if(head_organ.species.bodyflags & HAS_ALT_HEADS) + var/list/valid_alt_heads = M.generate_valid_alt_heads() + var/new_alt_head = input("Please select alternate head", "Character Generation", head_organ.alt_head) as null|anything in valid_alt_heads + if(new_alt_head) + M.change_alt_head(new_alt_head) // hair var/list/valid_hairstyles = M.generate_valid_hairstyles() @@ -65,52 +69,45 @@ // if new style selected (not cancel) if(new_style) - head_organ.h_style = new_style + M.change_hair(new_style) var/new_hair = input("Please select hair color.", "Character Generation", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as null|color if(new_hair) - head_organ.r_hair = hex2num(copytext(new_hair, 2, 4)) - head_organ.g_hair = hex2num(copytext(new_hair, 4, 6)) - head_organ.b_hair = hex2num(copytext(new_hair, 6, 8)) + M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair)) + + var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style] + if(hair_style.secondary_theme && !hair_style.no_sec_colour) + new_hair = input("Please select secondary hair color.", "Character Generation", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as null|color + if(new_hair) + M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair), 1) // facial hair var/list/valid_facial_hairstyles = M.generate_valid_facial_hairstyles() new_style = input("Please select facial style", "Character Generation", head_organ.f_style) as null|anything in valid_facial_hairstyles if(new_style) - head_organ.f_style = new_style + M.change_facial_hair(new_style) var/new_facial = input("Please select facial hair color.", "Character Generation", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as null|color if(new_facial) - head_organ.r_facial = hex2num(copytext(new_facial, 2, 4)) - head_organ.g_facial = hex2num(copytext(new_facial, 4, 6)) - head_organ.b_facial = hex2num(copytext(new_facial, 6, 8)) + M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial)) + + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style] + if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) + new_facial = input("Please select secondary facial hair color.", "Character Generation", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as null|color + if(new_facial) + M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial), 1) //Head accessory. if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY) var/list/valid_head_accessories = M.generate_valid_head_accessories() var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories if(new_head_accessory) - head_organ.ha_style = new_head_accessory + M.change_head_accessory(new_head_accessory) var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as null|color if(new_head_accessory_colour) - head_organ.r_headacc = hex2num(copytext(new_head_accessory_colour, 2, 4)) - head_organ.g_headacc = hex2num(copytext(new_head_accessory_colour, 4, 6)) - head_organ.b_headacc = hex2num(copytext(new_head_accessory_colour, 6, 8)) - - //Body markings. - if(M.species.bodyflags & HAS_MARKINGS) - var/list/valid_markings = M.generate_valid_markings() - var/new_marking = input("Please select marking style", "Character Generation", M.m_style) as null|anything in valid_markings - if(new_marking) - M.m_style = new_marking - - var/new_marking_colour = input("Please select marking colour.", "Character Generation", rgb(M.r_markings, M.g_markings, M.b_markings)) as null|color - if(new_marking_colour) - M.r_markings = hex2num(copytext(new_marking_colour, 2, 4)) - M.g_markings = hex2num(copytext(new_marking_colour, 4, 6)) - M.b_markings = hex2num(copytext(new_marking_colour, 6, 8)) + M.change_head_accessory_color(color2R(new_head_accessory_colour), color2G(new_head_accessory_colour), color2B(new_head_accessory_colour)) //Body accessory. if(M.species.tail && M.species.bodyflags & HAS_TAIL) @@ -118,18 +115,51 @@ if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items. var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories if(new_body_accessory) - M.body_accessory = body_accessory_by_name[new_body_accessory] + M.change_body_accessory(new_body_accessory) + + //Head markings. + if(M.species.bodyflags & HAS_HEAD_MARKINGS) + var/list/valid_head_markings = M.generate_valid_markings("head") + var/new_marking = input("Please select head marking style", "Character Generation", M.m_styles["head"]) as null|anything in valid_head_markings + if(new_marking) + M.change_markings(new_marking, "head") + + var/new_marking_colour = input("Please select head marking colour.", "Character Generation", M.m_colours["head"]) as null|color + if(new_marking_colour) + M.change_marking_color(new_marking_colour, "head") + //Body markings. + if(M.species.bodyflags & HAS_BODY_MARKINGS) + var/list/valid_body_markings = M.generate_valid_markings("body") + var/new_marking = input("Please select body marking style", "Character Generation", M.m_styles["body"]) as null|anything in valid_body_markings + if(new_marking) + M.change_markings(new_marking, "body") + + var/new_marking_colour = input("Please select body marking colour.", "Character Generation", M.m_colours["body"]) as null|color + if(new_marking_colour) + M.change_marking_color(new_marking_colour, "body") + //Tail markings. + if(M.species.bodyflags & HAS_TAIL_MARKINGS) + var/list/valid_tail_markings = M.generate_valid_markings("tail") + var/new_marking = input("Please select tail marking style", "Character Generation", M.m_styles["tail"]) as null|anything in valid_tail_markings + if(new_marking) + M.change_markings(new_marking, "tail") + + var/new_marking_colour = input("Please select tail marking colour.", "Character Generation", M.m_colours["tail"]) as null|color + if(new_marking_colour) + M.change_marking_color(new_marking_colour, "tail") //Skin tone. if(M.species.bodyflags & HAS_SKIN_TONE) var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", M.s_tone) as null|text if(!new_tone) new_tone = 35 - M.s_tone = 35 - max(min(round(text2num(new_tone)), 220), 1) + else + new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1) + M.change_skin_tone(new_tone) if(M.species.bodyflags & HAS_ICON_SKIN_TONE) var/prompt = "Please select skin tone: 1-[M.species.icon_skin_tones.len] (" - for(var/i = 1; i <= M.species.icon_skin_tones.len; i++) + for(var/i = 1 to M.species.icon_skin_tones.len) prompt += "[i] = [M.species.icon_skin_tones[i]]" if(i != M.species.icon_skin_tones.len) prompt += ", " @@ -138,18 +168,16 @@ var/new_tone = input(prompt, "Character Generation", M.s_tone) as null|text if(!new_tone) new_tone = 0 - M.s_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1) + else + new_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1) + M.change_skin_tone(new_tone) //Skin colour. if(M.species.bodyflags & HAS_SKIN_COLOR) var/new_body_colour = input("Please select body colour.", "Character Generation", rgb(M.r_skin, M.g_skin, M.b_skin)) as null|color if(new_body_colour) - M.r_skin = hex2num(copytext(new_body_colour, 2, 4)) - M.g_skin = hex2num(copytext(new_body_colour, 4, 6)) - M.b_skin = hex2num(copytext(new_body_colour, 6, 8)) + M.change_skin_color(color2R(new_body_colour), color2G(new_body_colour), color2B(new_body_colour)) - M.force_update_limbs() - M.regenerate_icons() M.update_dna() M.visible_message("[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm deleted file mode 100644 index 2cd9eab452f..00000000000 --- a/code/game/gamemodes/borer/borer.dm +++ /dev/null @@ -1,159 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04 -// TOTALLY NOT COPY-PASTA FROM meme.dm - -/datum/game_mode/var/list/borers = list() - -/datum/game_mode/borer - name = "corticalborers" - config_tag = "borer" - required_players = 10 - restricted_jobs = list("AI", "Cyborg", "Mobile MMI") - recommended_enemies = 2 // need at least a borer and a host - votable = 0 // temporarily disable this mode for voting - - var/var/list/datum/mind/first_hosts = list() - var/var/list/assigned_hosts = list() - - var/list/found_vents = list() - -/datum/game_mode/borer/announce() - to_chat(world, "The current game mode is - Cortical Borer!") - to_chat(world, "An unknown creature has infested the mind of a crew member. Find and destroy it by any means necessary.") - -/datum/game_mode/borer/can_start() - if(!..()) - return 0 - - // for every 10 players, get 1 borer, and for each borer, get a host - // also make sure that there's at least one borer and one host - recommended_enemies = max(src.num_players() / 20 * 2, 2) - - var/list/datum/mind/possible_borers = get_players_for_role(ROLE_BORER) - - if(possible_borers.len < 2) - log_admin("MODE FAILURE: BORER. NOT ENOUGH BORER CANDIDATES.") - return 0 // not enough candidates for borer - - for(var/obj/machinery/atmospherics/unary/vent_pump/v in world) - if(!v.welded && is_station_level(v.z)) - found_vents.Add(v) - - // for each 2 possible borers, add one borer and one host - while(possible_borers.len >= 2) - var/datum/mind/borer = pick(possible_borers) - possible_borers.Remove(borer) - - var/datum/mind/first_host = pick(possible_borers) - possible_borers.Remove(first_host) - - modePlayer += borer - modePlayer += first_host - borers += borer - first_hosts += first_host - - // so that we can later know which host belongs to which borer - assigned_hosts[borer.key] = first_host - - borer.assigned_role = "MODE" //So they aren't chosen for other jobs. - borer.special_role = SPECIAL_ROLE_BORER - - return 1 - -/datum/game_mode/borer/pre_setup() - return 1 - - -/datum/game_mode/borer/post_setup() - // create a borer and enter it - for(var/datum/mind/borer in borers) - // Pick a backup location to spawn at if we can't infest. - var/spawn_loc - if(found_vents.len) - var/vent = pick(found_vents) - found_vents.Remove(vent) - spawn_loc=get_turf(vent) - else - spawn_loc=pick(xeno_spawn) - - var/mob/living/simple_animal/borer/M = new(spawn_loc,1) // loc, by_gamemode=0 - var/mob/original = borer.current - borer.transfer_to(M) - //M.clearHUD() - - // get the host for this borer - var/datum/mind/first_host = assigned_hosts[borer.key] - // this is a redundant check, but I don't think the above works.. - // if picking hosts works with this method, remove the method above - if(!first_host) - first_host = pick(first_hosts) - first_hosts.Remove(first_host) - M.perform_infestation(first_host.current) - forge_borer_objectives(borer, first_host) - - qdel(original) - - log_admin("Created [borers.len] borers.") - - ..() - -/datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1) - if(you_are) - to_chat(borer.current, "You are a Cortical Borer!") - - var/obj_count = 1 - for(var/datum/objective/objective in borer.objectives) - to_chat(borer.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ - return - -/datum/game_mode/borer/check_finished() - var/borers_alive = 0 - for(var/datum/mind/borer in borers) - if(!istype(borer.current,/mob/living)) - continue - if(borer.current.stat==2) - continue - borers_alive++ - - if(borers_alive) - return ..() - else - return 1 - -/datum/game_mode/proc/auto_declare_completion_borer() - for(var/datum/mind/borer in borers) - var/borerwin = 1 - if((borer.current) && istype(borer.current,/mob/living/simple_animal/borer)) - to_chat(world, "The borer was [borer.current.key].") - to_chat(world, "The last host was [borer.current:host.key].") - - var/count = 1 - for(var/datum/objective/objective in borer.objectives) - if(objective.check_completion()) - to_chat(world, "Objective #[count]: [objective.explanation_text] \green Success") - feedback_add_details("borer_objective","[objective.type]|SUCCESS") - else - to_chat(world, "Objective #[count]: [objective.explanation_text] \red Failed") - feedback_add_details("borer_objective","[objective.type]|FAIL") - borerwin = 0 - count++ - - else - borerwin = 0 - - if(borerwin) - to_chat(world, "The borer was successful!") - feedback_add_details("borer_success","SUCCESS") - else - to_chat(world, "The borer has failed!") - feedback_add_details("borer_success","FAIL") - return 1 - -/datum/game_mode/proc/forge_borer_objectives(var/datum/mind/borer, var/datum/mind/first_host) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = borer - borer.objectives += survive_objective - - greet_borer(borer) - - return diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 9fb2402f889..805db2be393 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -152,7 +152,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling_mind.current.remove_changeling_powers() changeling_mind.memory = "" changeling_mind.special_role = null - if(issilicon(changeling_mind)) + if(issilicon(changeling_mind.current)) to_chat(changeling_mind.current, "You have been robotized!") to_chat(changeling_mind.current, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") else diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index 07ae44d9a9a..4adbc39e7fc 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -17,11 +17,11 @@ for(var/mob/living/carbon/human/H in range(2,user)) to_chat(H, "You are blinded by a shower of blood!") H.Stun(1) - H.eye_blurry = max(20, H.eye_blurry) + H.EyeBlurry(20) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) if(istype(E)) E.damage = max(E.damage+5, 0) - H.confused += 3 + H.AdjustConfused(3) for(var/mob/living/silicon/S in range(2,user)) to_chat(S, "Your sensors are disabled by a shower of blood!") S.Weaken(3) @@ -37,4 +37,4 @@ to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") user.gib() feedback_add_details("changeling_powers","LR") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index b6692817650..2585287528c 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -17,10 +17,14 @@ user.SetStunned(0) user.SetWeakened(0) user.radiation = 0 - user.eye_blind = 0 - user.eye_blurry = 0 - user.setEarDamage(0,0) + user.SetEyeBlind(0) + user.SetEyeBlurry(0) + user.SetEarDamage(0) + user.SetEarDeaf(0) user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) + user.CureBlind() + user.CureDeaf() + user.CureNearsighted() user.reagents.clear_reagents() user.germ_level = 0 user.next_pain_time = 0 diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 7babc2a5a62..5185b61e508 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -11,8 +11,8 @@ for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) - M.adjustEarDamage(0, 30) - M.confused += 20 + M.AdjustEarDeaf(30) + M.AdjustConfused(20) M.Jitter(50) else M << sound('sound/effects/screech.ogg') @@ -41,5 +41,3 @@ L.broken() empulse(get_turf(user), 2, 4, 1) return 1 - - diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index f4aa6f3d8f2..0df371009a8 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -153,7 +153,7 @@ obj/effect/proc_holder/changeling/sting/mute /obj/effect/proc_holder/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target) add_logs(user, target, "stung", object="mute sting") - target.silent += 30 + target.AdjustSilence(30) feedback_add_details("changeling_powers","MS") return 1 @@ -165,12 +165,12 @@ obj/effect/proc_holder/changeling/sting/blind chemical_cost = 25 dna_cost = 1 -/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target) +/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/living/user, var/mob/living/target) add_logs(user, target, "stung", object="blind sting") to_chat(target, "Your eyes burn horrifically!") - target.disabilities |= NEARSIGHTED - target.eye_blind = 20 - target.eye_blurry = 40 + target.BecomeNearsighted() + target.EyeBlind(20) + target.EyeBlurry(40) feedback_add_details("changeling_powers","BS") return 1 @@ -186,7 +186,7 @@ obj/effect/proc_holder/changeling/sting/LSD add_logs(user, target, "stung", object="LSD sting") spawn(rand(300,600)) if(target) - target.hallucination = max(400, target.hallucination) + target.Hallucinate(400) feedback_add_details("changeling_powers","HS") return 1 diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index ca96b4f869f..20133d972c8 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -840,7 +840,7 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.adjustEarDamage(0,50) + C.AdjustEarDeaf(50) C.show_message("\red The world around you suddenly becomes quiet.", 3) affected++ if(prob(1)) @@ -859,7 +859,7 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.adjustEarDamage(0,30) + C.AdjustEarDeaf(30) //talismans is weaker. C.show_message("\red The world around you suddenly becomes quiet.", 3) affected++ @@ -880,12 +880,12 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.eye_blurry += 50 - C.eye_blind += 20 + C.AdjustEyeBlurry(50) + C.AdjustEyeBlind(20) if(prob(5)) - C.disabilities |= NEARSIGHTED + C.BecomeNearsighted() if(prob(10)) - C.disabilities |= BLIND + C.BecomeBlind() C.show_message("\red Suddenly you see red flash that blinds you.", 3) affected++ if(affected) @@ -902,8 +902,8 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.eye_blurry += 30 - C.eye_blind += 10 + C.AdjustEyeBlurry(30) + C.AdjustEyeBlind(10) //talismans is weaker. affected++ C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) @@ -1016,7 +1016,7 @@ var/list/sacrificed = list() var/mob/living/carbon/C = T C.flash_eyes() if(!(HULK in C.mutations)) - C.silent += 15 + C.AdjustSilence(15) C.Weaken(10) C.Stun(10) return diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm deleted file mode 100644 index d1fd034e312..00000000000 --- a/code/game/gamemodes/events.dm +++ /dev/null @@ -1,59 +0,0 @@ -/proc/alien_infestation(var/spawncount = 1) // -- TLE - //command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - if(temp_vent.parent.other_atmosmch.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology - vents += temp_vent - - spawn() - var/list/candidates = pollCandidates("Do you want to play as an alien?", ROLE_ALIEN, 1) - - if(prob(40)) spawncount++ //sometimes, have two larvae spawn instead of one - while((spawncount >= 1) && vents.len && candidates.len) - - var/obj/vent = pick(vents) - var/mob/candidate = pick(candidates) - var/client/C = candidate.client - if(C) - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = C - respawnable_list -= C - candidates -= C - vents -= vent - spawncount-- - - spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes. - command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') - for(var/mob/M in player_list) - M << sound('sound/AI/aliens.ogg') - -/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights - if(isEvent) - command_announcement.Announce("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert") - - if(lightsoutAmount) - var/list/epicentreList = list() - - for(var/i=1,i<=lightsoutAmount,i++) - var/list/possibleEpicentres = list() - for(var/obj/effect/landmark/newEpicentre in landmarks_list) - if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList)) - possibleEpicentres += newEpicentre - if(possibleEpicentres.len) - epicentreList += pick(possibleEpicentres) - else - break - - if(!epicentreList.len) - return - - for(var/obj/effect/landmark/epicentre in epicentreList) - for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange)) - apc.overload_lighting() - - else - for(var/obj/machinery/power/apc/apc in apcs) - apc.overload_lighting() - - return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 06f071366e1..6058b1a2d76 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -35,6 +35,7 @@ var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/list/player_draft_log = list() + var/list/datum/mind/xenos = list() /datum/game_mode/proc/announce() //to be calles when round starts to_chat(world, "Notice: [src] did not define announce()") diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 3e969af60c2..32e4b081e94 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -119,6 +119,7 @@ equip_common(H,team_number) equip_agent(H,team_number) greet_agent(agent,team_number) + update_abductor_icons_added(agent) scientist = scientists[team_number] H = scientist.current @@ -132,6 +133,8 @@ equip_common(H,team_number) equip_scientist(H,team_number) greet_scientist(scientist,team_number) + update_abductor_icons_added(scientist) + return ..() //Used for create antag buttons @@ -165,7 +168,7 @@ equip_common(H,team_number) equip_agent(H,team_number) greet_agent(agent,team_number) - + update_abductor_icons_added(agent) scientist = scientists[team_number] H = scientist.current @@ -179,6 +182,7 @@ equip_common(H,team_number) equip_scientist(H,team_number) greet_scientist(scientist,team_number) + update_abductor_icons_added(scientist) /datum/abductor //stores abductor's team and whether they're a scientist or agent; since species datums are global, we have to use this, instead. @@ -337,6 +341,17 @@ else return 0 return 0 + +/datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind) + if(abductor_mind in abductors) + ticker.mode.abductors -= abductor_mind + abductor_mind.special_role = null + abductor_mind.current.attack_log += "\[[time_stamp()]\] No longer abductor" + if(issilicon(abductor_mind.current)) + to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.") + else + to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.") + ticker.mode.update_abductor_icons_added(abductor_mind) /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 4d98876ccd6..29f217b44bc 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -466,7 +466,7 @@ Congratulations! You are now trained for xenobiology research!"} L.Sleeping(60) add_logs(user, L, "put to sleep") else - L.drowsyness += 1 + L.AdjustDrowsy(1) to_chat(user, "Sleep inducement works fully only on stunned specimens! ") L.visible_message("[user] tried to induce sleep in [L] with [src]!", \ "You suddenly feel drowsy!") diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 8a3fbd8ff60..b59f1fd8454 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -98,7 +98,7 @@ if(H == owner) continue to_chat(H, "You hear a buzz in your head.") - H.confused += 20 + H.AdjustConfused(20) /obj/item/organ/internal/gland/pop origin_tech = "materials=4;biotech=6;abductor=3" diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 6de3308f75e..69d87a37b7f 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -195,7 +195,7 @@ to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") to_chat(src, "Your guardian has been successfully reset.") message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") - G.ghostize(0) + G.ghostize() G.key = new_stand.key else to_chat(src, "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index 26fb00b42a8..0f9173c31ea 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -253,7 +253,7 @@ to_chat(human, "You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")].") human.adjustStaminaLoss(stamdamage) human.adjustToxLoss(toxdamage) - human.confused = min(human.confused+confusion, maxconfusion) + human.AdjustConfused(confusion, bound_lower = 0, bound_upper = maxconfusion) new/obj/effect/overlay/temp/revenant(human.loc) if(!istype(T, /turf/simulated/shuttle) && !istype(T, /turf/simulated/wall/rust) && !istype(T, /turf/simulated/wall/r_wall) && istype(T, /turf/simulated/wall) && prob(15)) new/obj/effect/overlay/temp/revenant(T) @@ -317,4 +317,4 @@ playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) new/obj/effect/overlay/temp/revenant(S.loc) S.spark_system.start() - S.emp_act(1) \ No newline at end of file + S.emp_act(1) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 1a607bea3ca..5d9a880e12e 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -57,7 +57,19 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/pre_setup() return 1 - +/datum/game_mode/proc/remove_operative(datum/mind/operative_mind) + if(operative_mind in syndicates) + ticker.mode.syndicates -= operative_mind + operative_mind.special_role = null + for(var/datum/objective/nuclear/O in operative_mind.objectives) + operative_mind.objectives -= O + operative_mind.current.attack_log += "\[[time_stamp()]\] No longer nuclear operative" + if(issilicon(operative_mind.current)) + to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative.") + else + to_chat(operative_mind.current, "You have been brainwashed! You are no longer a Syndicate operative.") + ticker.mode.update_synd_icons_removed(operative_mind) + //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -132,36 +144,28 @@ proc/issyndicate(mob/living/M as mob) var/mob/living/carbon/human/M = synd_mind.current var/obj/item/organ/external/head/head_organ = M.get_organ("head") + M.mutations = list() + M.disabilities = 0 + M.overeatduration = 0 M.set_species("Human",1) M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black - var/hair_style = "Bald" - var/facial_hair_style = "Shaved" - if(M.gender == MALE) - hair_style = pick(hair_styles_male_list) - facial_hair_style = pick(facial_hair_styles_list) - else - hair_style = pick(hair_styles_female_list) - if(prob(5)) - facial_hair_style = pick(facial_hair_styles_list) - - head_organ.r_facial = hex2num(copytext(hair_c, 2, 4)) - head_organ.g_facial = hex2num(copytext(hair_c, 4, 6)) - head_organ.b_facial = hex2num(copytext(hair_c, 6, 8)) - head_organ.r_hair = hex2num(copytext(hair_c, 2, 4)) - head_organ.g_hair = hex2num(copytext(hair_c, 4, 6)) - head_organ.b_hair = hex2num(copytext(hair_c, 6, 8)) - var/eyes_red = hex2num(copytext(eye_c, 2, 4)) - var/eyes_green = hex2num(copytext(eye_c, 4, 6)) - var/eyes_blue = hex2num(copytext(eye_c, 6, 8)) - M.change_eye_color(eyes_red, eyes_green, eyes_blue) + head_organ.r_facial = color2R(hair_c) + head_organ.g_facial = color2G(hair_c) + head_organ.b_facial = color2B(hair_c) + head_organ.r_hair = color2R(hair_c) + head_organ.g_hair = color2G(hair_c) + head_organ.b_hair = color2B(hair_c) + M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c)) M.s_tone = skin_tone - head_organ.h_style = hair_style - head_organ.f_style = facial_hair_style + head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) + head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) M.body_accessory = null + M.regenerate_icons() + M.update_body() /datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code) var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") @@ -296,10 +300,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/declare_completion() var/disk_rescued = 1 for(var/obj/item/weapon/disk/nuclear/D in world) - var/disk_area = get_area(D) - if(!is_type_in_list(disk_area, centcom_areas)) - if(disk_area == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this - break + if(!D.onCentcom()) disk_rescued = 0 break var/crew_evacuated = (shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 07836c824d7..fd6f07960e1 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -35,6 +35,8 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \ return TARGET_INVALID_NOT_HUMAN if(!possible_target.current.stat == DEAD) return TARGET_INVALID_DEAD + if(!possible_target.key) + return TARGET_INVALID_NOCKEY /datum/objective/proc/find_target() var/list/possible_targets = list() @@ -115,7 +117,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \ var/turf/T = get_turf(target.current) if(is_admin_level(T.z)) return 0 - return 0 + return 1 return 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 83846818091..461fe0e4ca7 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -241,7 +241,7 @@ revolutionaries += rev_mind if(iscarbon(rev_mind.current)) var/mob/living/carbon/carbon_mob = rev_mind.current - carbon_mob.silent = max(carbon_mob.silent, 5) + carbon_mob.Silence(5) carbon_mob.flash_eyes(1, 1) rev_mind.current.Stun(5) to_chat(rev_mind.current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 70471a91aff..b9525ee282e 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -46,7 +46,7 @@ else //Only alludes to the shadowling if the target is close by to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") target.Stun(10) - M.silent += 10 + M.AdjustSilence(10) /obj/effect/proc_holder/spell/targeted/lesser_glare @@ -79,7 +79,7 @@ else to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty...") target.Stun(3) //Roughly 30% as long as the normal one - M.silent += 3 + M.AdjustSilence(3) /obj/effect/proc_holder/spell/aoe_turf/veil @@ -519,7 +519,7 @@ /datum/reagent/shadowling_blindness_smoke/on_mob_life(mob/living/M) if(!is_shadow_or_thrall(M)) to_chat(M, "You breathe in the black smoke, and your eyes burn horribly!") - M.eye_blind = 5 + M.EyeBlind(5) if(prob(25)) M.visible_message("[M] claws at their eyes!") M.Stun(3) @@ -556,8 +556,8 @@ if(iscarbon(target)) var/mob/living/carbon/M = target to_chat(M, "A spike of pain drives into your head and scrambles your thoughts!") - M.confused += 10 - M.setEarDamage(M.ear_damage + 3) + M.AdjustConfused(10) + M.AdjustEarDamage(3) else if(issilicon(target)) var/mob/living/silicon/S = target to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 9474526655e..60a90b70638 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -63,6 +63,7 @@ /datum/game_mode/traitor/post_setup() for(var/datum/mind/traitor in traitors) forge_traitor_objectives(traitor) + update_traitor_icons_added(traitor) spawn(rand(10,100)) finalize_traitor(traitor) greet_traitor(traitor) @@ -345,9 +346,19 @@ to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") +/datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind) + if(traitor_mind in traitors) + ticker.mode.traitors -= traitor_mind + traitor_mind.special_role = null + traitor_mind.current.attack_log += "\[[time_stamp()]\] De-traitored" + if(issilicon(traitor_mind.current)) + to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor.") + else + to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor.") + ticker.mode.update_traitor_icons_removed(traitor_mind) + /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] - //var/ref = "\ref[traitor_mind]" tatorhud.join_hud(traitor_mind.current) set_antag_hud(traitor_mind.current, "hudsyndicate") @@ -358,23 +369,27 @@ /datum/game_mode/proc/remove_traitor_mind(datum/mind/traitor_mind, datum/mind/head) - //var/list/removal - var/ref = "\ref[head]" - if(ref in implanter) - implanter[ref] -= traitor_mind - implanted -= traitor_mind - traitors -= traitor_mind - if(traitor_mind.som) - var/datum/mindslaves/slaved = traitor_mind.som - slaved.serv -= traitor_mind - traitor_mind.special_role = null - traitor_mind.som = null - slaved.leave_serv_hud(traitor_mind) - for(var/datum/objective/protect/mindslave/MS in traitor_mind.objectives) - traitor_mind.objectives -= MS + if(traitor_mind in implanted) + //var/list/removal + var/ref = "\ref[head]" + if(ref in implanter) + implanter[ref] -= traitor_mind + implanted -= traitor_mind + traitors -= traitor_mind + if(traitor_mind.som) + var/datum/mindslaves/slaved = traitor_mind.som + slaved.serv -= traitor_mind + traitor_mind.special_role = null + traitor_mind.som = null + slaved.leave_serv_hud(traitor_mind) + for(var/datum/objective/protect/mindslave/MS in traitor_mind.objectives) + traitor_mind.objectives -= MS - update_traitor_icons_removed(traitor_mind) - to_chat(traitor_mind.current, "You are no longer a mindslave; you have complete and free control of your own faculties, once more!") + update_traitor_icons_removed(traitor_mind) + if(issilicon(traitor_mind.current)) + to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a mindslave.") + else + to_chat(traitor_mind.current, "You are no longer a mindslave: you have complete and free control of your own faculties, once more!") /datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner) //set faction diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 5a78826ab0c..dd40a6817b6 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -325,6 +325,22 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else if(istype(p, /datum/vampire_passive)) var/datum/vampire_passive/power = p to_chat(owner, "[power.gain_desc]") + + +/datum/game_mode/proc/remove_vampire(datum/mind/vampire_mind) + if(vampire_mind in vampires) + ticker.mode.vampires -= vampire_mind + vampire_mind.special_role = null + vampire_mind.current.attack_log += "\[[time_stamp()]\] De-vampired" + if(vampire_mind.vampire) + vampire_mind.vampire.remove_vampire_powers() + qdel(vampire_mind.vampire) + vampire_mind.vampire = null + if(issilicon(vampire_mind.current)) + to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") + else + to_chat(vampire_mind.current, "You have been brainwashed! You are no longer a vampire.") + ticker.mode.update_vampire_icons_removed(vampire_mind) //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index f8e1575efc1..92a1a3dfa19 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -259,8 +259,8 @@ continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") C.Weaken(4) - C.adjustEarDamage(0,20) - C.stuttering = 20 + C.AdjustEarDeaf(20) + C.Stuttering(20) C.Stun(4) C.Jitter(150) for(var/obj/structure/window/W in view(4)) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 34886dde2e0..689fb350b0d 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -782,7 +782,7 @@ var/global/list/multiverse = list() else if(istype(I,/obj/item/weapon/bikehorn)) to_chat(target, "HONK") target << 'sound/items/AirHorn.ogg' - target.adjustEarDamage(0,3) + target.AdjustEarDeaf(3) GiveHint(target) cooldown = world.time +cooldown_time return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 08a580923f4..4c06f84d7cd 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -747,7 +747,7 @@ /obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob) ..() to_chat(user, "You go blind!") - user.eye_blind = 10 + user.EyeBlind(10) /obj/item/weapon/spellbook/oneuse/mindswap spell = /obj/effect/proc_holder/spell/targeted/mind_transfer diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b98d97d790e..a38e7dc5541 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -54,7 +54,20 @@ update_wiz_icons_added(wizard) ..() - + +/datum/game_mode/proc/remove_wizard(datum/mind/wizard_mind) + if(wizard_mind in wizards) + ticker.mode.wizards -= wizard_mind + wizard_mind.special_role = null + wizard_mind.current.attack_log += "\[[time_stamp()]\] De-wizarded" + wizard_mind.current.spellremove(wizard_mind.current) + wizard_mind.current.faction = list("Station") + if(issilicon(wizard_mind.current)) + to_chat(wizard_mind.current, "You have been turned into a robot! You can feel your magical powers fading away...") + else + to_chat(wizard_mind.current, "You have been brainwashed! You are no longer a wizard.") + ticker.mode.update_wiz_icons_removed(wizard_mind) + /datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] wizhud.join_hud(wiz_mind.current) diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm deleted file mode 100644 index c4659993e45..00000000000 --- a/code/game/gamemodes/xenos/xenos.dm +++ /dev/null @@ -1,185 +0,0 @@ -/datum/game_mode - var/list/datum/mind/xenos = list() - - -/datum/game_mode/xenos - name = "xenos" - config_tag = "xenos" - required_players = 30 - required_enemies = 3 - var/result = 0 - var/checkwin_counter = 0 - var/xenos_list = list() - var/gammacalled = 0 - - var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? - -/datum/game_mode/xenos/announce() - to_chat(world, "The current game mode is - Xenos!") - to_chat(world, "There is an Xenomorph attack on the station.
Aliens - Kill or infect the crew. Protect the Queen.
Crew - Protect the station. Exterminate all aliens.
") - -/datum/game_mode/xenos/can_start() - if(!..()) - return 0 - - var/list/candidates = get_players_for_role(ROLE_ALIEN) - var/playersready = 0 - var/xenos_num = required_enemies - for(var/mob/new_player/player in player_list) - if((player.client)&&(player.ready)) - playersready += 1 - - //Check that we have enough alien candidates - if(candidates.len < required_enemies) - return 0 - - //Grab candidates randomly until we have enough. - while(xenos_num > 0) - var/datum/mind/new_xenos = pick(candidates) - xenos += new_xenos - candidates -= new_xenos - xenos_num-- - - for(var/datum/mind/xeno in xenos) - xeno.assigned_role = "MODE" - xeno.special_role = SPECIAL_ROLE_XENOMORPH - set_antag_hud(xeno, "hudalien")//like this is needed... - return 1 - -/datum/game_mode/xenos/pre_setup() - return 1 - -/datum/game_mode/xenos/post_setup() - - var/list/turf/xenos_spawn = list() - - for(var/obj/effect/landmark/A in landmarks_list) - if(A.name == "Xenos-Spawn") - xenos_spawn += get_turf(A) - qdel(A) - continue - - var/xenoqueen_selected = 0 - var/spawnpos = 1 - - for(var/datum/mind/xeno_mind in xenos) - if(spawnpos > xenos_spawn.len) - spawnpos = 1 - //XenoQueen Selection - if(!xenoqueen_selected) - var/mob/living/carbon/alien/humanoid/queen/O = new(xenos_spawn[spawnpos]) - if(xeno_mind.current) - xeno_mind.transfer_to(O) - else - O.key = xeno_mind.current.key - xeno_mind.name = O.name - //qdel(xeno_mind) - xenoqueen_selected = 1 - spawnpos++ - continue - //Additional larvas if playercount > 20 - else - var/mob/living/carbon/alien/larva/O = new(xenos_spawn[spawnpos]) - if(xeno_mind.current) - xeno_mind.transfer_to(O) - else - O.key = xeno_mind.current.key - xeno_mind.name = O.name - //qdel(xeno_mind) - spawnpos++ - - return ..() - -/datum/game_mode/xenos/process() - checkwin_counter++ - if(checkwin_counter >= 5) - if(!result) - ticker.mode.check_win() - checkwin_counter = 0 - return 0 - - -/datum/game_mode/xenos/check_win() - var/xenosalive = xenos_alive() - var/playersalive = players_alive() - var/playeralienratio = 0 - if(playersalive) - playeralienratio = xenosalive / playersalive - if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) - return ..() - if(!xenosalive) - result = 1 - return 1 - else if(!playersalive) - result = 2 - return 1 - else if(station_was_nuked) - result = 3 - return 1 - else - if(playeralienratio >= gammaratio && !gammacalled) - gammacalled = 1 - command_announcement.Announce("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert") - set_security_level("gamma") - var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world - if(V && is_station_level(V.z)) - V.locked = 0 - V.update_icon() - return ..() - -/datum/game_mode/xenos/check_finished() - return result != 0 - -/datum/game_mode/xenos/proc/xenos_alive() - var/list/livingxenos = list() - for(var/datum/mind/xeno in xenos) - if((xeno) && (xeno.current) && (xeno.current.stat != 2) && (xeno.current.client)) - if(istype(xeno.current,/mob/living/carbon/alien)) - livingxenos += xeno - return livingxenos.len - -/datum/game_mode/xenos/proc/players_alive() - var/list/livingplayers = list() - for(var/mob/M in player_list) - var/turf/T = get_turf(M) - if((M) && (M.stat != DEAD) && M.client && T && (is_station_level(T.z) || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE && is_secure_level(T.z))) - if(ishuman(M)) - livingplayers += 1 - return livingplayers.len - -/datum/game_mode/xenos/declare_completion() - if(station_was_nuked) - feedback_set_details("round_end_result","win - xenos nuked") - to_chat(world, "Crew Victory") - to_chat(world, "The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!") - else if(result == 1) - feedback_set_details("round_end_result","win - xenos killed") - to_chat(world, "Crew Victory") - to_chat(world, "The aliens did not succeed and were exterminated by the crew!") - else if(result == 2) - feedback_set_details("round_end_result","win - crew killed") - to_chat(world, "Alien Victory") - to_chat(world, "The aliens were successful and slaughtered the crew!") - else - feedback_set_details("round_end_result","win - crew escaped") - to_chat(world, "Draw") - to_chat(world, "The crew has escaped from the aliens but did not exterminate them, allowing them to overrun the station.") - - var/text = "
There were [xenos.len] aliens." - text += "
The aliens were:" - for(var/datum/mind/xeno in xenos) - text += "
[xeno.key] was [xeno.name] (" - if(xeno.current) - if(xeno.current.stat == DEAD) - text += "died" - else if(!xeno.current.client) - text += "SSD" - else - text += "survived" - else - text += "body destroyed" - text += ")" - to_chat(world, text) - - ..() - return 1 diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 8c139dabdbd..58d041b9442 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -129,7 +129,6 @@ var/const/access_trade_sol = 160 return 0 - /obj/item/proc/GetAccess() return list() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 60e650691e5..d5179a9c19b 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -454,8 +454,10 @@ set name = "Eject Sleeper" set category = "Object" set src in oview(1) - if(usr.stat != 0) + + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return + src.icon_state = "[base_icon]-open" src.go_out() add_fingerprint(usr) @@ -465,8 +467,10 @@ set name = "Remove Beaker" set category = "Object" set src in oview(1) - if(usr.stat != 0) + + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return + if(beaker) filtering = 0 beaker.forceMove(usr.loc) @@ -546,7 +550,7 @@ if(panel_open) to_chat(usr, "Close the maintenance panel first.") return - if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) @@ -590,4 +594,4 @@ component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() -#undef ADDICTION_SPEEDUP_TIME \ No newline at end of file +#undef ADDICTION_SPEEDUP_TIME diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index bde30cd92d4..6344dec7bbf 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -97,16 +97,17 @@ else if(processing) to_chat(user, "The biogenerator is currently processing.") else if(istype(O, /obj/item/weapon/storage/bag/plants)) + var/obj/item/weapon/storage/bag/plants/PB = O var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) to_chat(user, "The biogenerator is already full! Activate it.") else - for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) + for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents) if(i >= max_items) break - G.forceMove(src) + PB.remove_from_storage(G, src) i++ if(i < max_items) to_chat(user, "You empty the plant bag into the biogenerator.") diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a46c02edb2c..f07cd94438d 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -14,7 +14,7 @@ icon = 'icons/obj/cloning.dmi' icon_state = "pod_0" req_access = list(access_genetics) //For premature unlocking. - var/mob/living/occupant + var/mob/living/carbon/human/occupant var/heal_level = 90 //The clone is released once its health reaches this level. var/locked = 0 var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine. @@ -25,19 +25,34 @@ var/speed_coeff var/efficiency + var/datum/mind/clonemind + var/grab_ghost_when = CLONER_MATURE_CLONE + + var/obj/item/device/radio/Radio + var/radio_announce = 0 + + var/obj/effect/countdown/clonepod/countdown + light_color = LIGHT_COLOR_PURE_GREEN - power_change() - ..() - if(!(stat & (BROKEN|NOPOWER))) - set_light(2) - else - set_light(0) + +/obj/machinery/clonepod/power_change() + ..() + if(!(stat & (BROKEN|NOPOWER))) + set_light(2) + else + set_light(0) /obj/machinery/clonepod/biomass biomass = CLONE_BIOMASS /obj/machinery/clonepod/New() ..() + countdown = new(src) + + Radio = new /obj/item/device/radio(src) + Radio.listening = 0 + Radio.config(list("Medical" = 0)) + component_parts = list() component_parts += new /obj/item/weapon/circuitboard/clonepod(null) component_parts += new /obj/item/weapon/stock_parts/scanning_module(null) @@ -67,6 +82,12 @@ /obj/machinery/clonepod/Destroy() if(connected) connected.pods -= src + if(Radio) + qdel(Radio) + Radio = null + if(countdown) + qdel(countdown) + countdown = null return ..() /obj/machinery/clonepod/RefreshParts() @@ -97,49 +118,29 @@ name = "data disk - 'God Emperor of Mankind'" read_only = 1 - New() - Initialize() - buf.types=DNA2_BUF_UE|DNA2_BUF_UI - //data = "066000033000000000AF00330660FF4DB002690" - //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff - buf.dna.real_name="God Emperor of Mankind" - buf.dna.unique_enzymes = md5(buf.dna.real_name) - buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000) - //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff - buf.dna.UpdateUI() +/obj/item/weapon/disk/data/demo/New() + Initialize() + buf.types=DNA2_BUF_UE|DNA2_BUF_UI + //data = "066000033000000000AF00330660FF4DB002690" + //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff + buf.dna.real_name="God Emperor of Mankind" + buf.dna.unique_enzymes = md5(buf.dna.real_name) + buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000) + //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff + buf.dna.UpdateUI() /obj/item/weapon/disk/data/monkey name = "data disk - 'Mr. Muggles'" read_only = 1 - New() - Initialize() - buf.types=DNA2_BUF_SE - var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) - for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++) - new_SE += rand(1,1024) - buf.dna.SE=new_SE - buf.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - - -//Find a dead mob with a brain and client. -/proc/find_dead_player(var/find_key) - if(isnull(find_key)) - return - - var/mob/selected = null - for(var/mob/M in player_list) - //Dead people only thanks! - if((M.stat != 2) || (!M.client)) - continue - //They need a brain! - if(istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain)) - continue - - if(M.ckey == find_key) - selected = M - break - return selected +/obj/item/weapon/disk/data/monkey/New() + Initialize() + buf.types=DNA2_BUF_SE + var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) + for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++) + new_SE += rand(1,1024) + buf.dna.SE=new_SE + buf.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) //Disk stuff. /obj/item/weapon/disk/data/New() @@ -173,44 +174,47 @@ healthstring = "ERROR" return healthstring -/obj/machinery/clonepod/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/clonepod/attack_hand(mob/user as mob) - if((isnull(occupant)) || (stat & NOPOWER)) - if(mess) - go_out() - return - if((!isnull(occupant)) && (occupant.stat != 2)) - var/completion = (100 * ((occupant.health + 100) / (heal_level + 100))) - to_chat(user, "Current clone cycle is [round(completion)]% complete.") - return - //Clonepod +/obj/machinery/clonepod/examine(mob/user) + ..() + if(mess) + to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") + if(!occupant || stat & (NOPOWER|BROKEN)) + return + if(occupant && occupant.stat != DEAD) + to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") + +/obj/machinery/clonepod/proc/get_completion() + . = (100 * ((occupant.health + 100) / (heal_level + 100))) + +/obj/machinery/clonepod/attack_ai(mob/user) + return examine(user) + +//Radio Announcement + +/obj/machinery/clonepod/proc/announce_radio_message(message) + if(radio_announce) + Radio.autosay(message, name, "Medical", list(z)) + + //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R) +/obj/machinery/clonepod/proc/growclone(datum/dna2/record/R) if(mess || attempting || panel_open || stat & (NOPOWER|BROKEN)) return 0 - var/datum/mind/clonemind = locate(R.mind) + clonemind = locate(R.mind) if(!istype(clonemind)) //not a mind return 0 if( clonemind.current && clonemind.current.stat != DEAD ) //mind is associated with a non-dead body return 0 if(clonemind.active) //somebody is using that mind - if( ckey(clonemind.key)!=R.ckey ) + if(ckey(clonemind.key) != R.ckey) return 0 else - for(var/mob/M in player_list) - if(M.ckey == R.ckey) - if(istype(M, /mob/dead/observer)) - var/mob/dead/observer/G = M - if(G.can_reenter_corpse) - break - if(istype(M, /mob/living/simple_animal)) - if(M in respawnable_list) - break - return 0 + // get_ghost() will fail if they're unable to reenter their body + var/mob/dead/observer/G = clonemind.get_ghost() + if(!G) + return 0 if(biomass >= CLONE_BIOMASS) biomass -= CLONE_BIOMASS @@ -219,6 +223,7 @@ attempting = 1 //One at a time!! locked = 1 + countdown.start() eject_wait = 1 spawn(30) @@ -239,8 +244,16 @@ //Here let's calculate their health so the pod doesn't immediately eject them!!! H.updatehealth() - clonemind.transfer_to(H) - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + if(grab_ghost_when == CLONER_FRESH_CLONE) + clonemind.transfer_to(H) + H.ckey = R.ckey + to_chat(H, {"Consciousness slowly creeps over you + as your body regenerates.
So this is what cloning + feels like?
"}) + else if(grab_ghost_when == CLONER_MATURE_CLONE) + to_chat(clonemind.current, {"Your body is + beginning to regenerate in a cloning pod. You will + become conscious when it is complete."}) // -- Mode/mind specific stuff goes here callHook("clone", list(H)) @@ -299,20 +312,20 @@ biomass += BIOMASS_MEAT_AMOUNT show_message = 1 if(show_message) - visible_message("\The [src] sucks in and processes the nearby biomass.") + visible_message("[src] sucks in and processes the nearby biomass.") if(stat & NOPOWER) //Autoeject if power is lost if(occupant) locked = 0 go_out() - return + connected_message("Clone Ejected: Loss of power.") - if((occupant) && (occupant.loc == src)) - if((occupant.stat == DEAD) || (occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes. + else if((occupant) && (occupant.loc == src)) + if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes. locked = 0 + announce_radio_message("The cloning of [occupant] has been aborted due to unrecoverable tissue failure.") go_out() connected_message("Clone Rejected: Deceased.") - return else if(occupant.cloneloss > (100 - heal_level)) occupant.Paralyse(4) @@ -331,48 +344,40 @@ occupant.adjustOxyLoss(-4) use_power(7500) //This might need tweaking. - return else if((occupant.cloneloss <= (100 - heal_level)) && (!eject_wait)) connected_message("Cloning Process Complete.") + announce_radio_message("The cloning cycle of [occupant] is complete.") locked = 0 go_out() - return else if((!occupant) || (occupant.loc != src)) occupant = null if(locked) locked = 0 - //use_power(200) - return - - return + update_icon() + use_power(200) //Let's unlock this early I guess. Might be too early, needs tweaking. -/obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/screwdriver)) - if(occupant || mess || locked) - to_chat(user, "The maintenance panel is locked.") +/obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params) + if(!(occupant || mess || locked)) + if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W)) return - default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W) - return if(exchange_parts(user, W)) return - if(istype(W, /obj/item/weapon/crowbar)) - if(panel_open) - default_deconstruction_crowbar(W) + if(default_deconstruction_crowbar(W)) return - if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if(W.GetID()) if(!check_access(W)) - to_chat(user, "\red Access Denied.") + to_chat(user, "Access Denied.") return - if((!locked) || (isnull(occupant))) + if (!locked || !occupant) return - if((occupant.health < -20) && (occupant.stat != 2)) - to_chat(user, "\red Access Refused.") + if(occupant.health < -20 && occupant.stat != DEAD) + to_chat(user, "Access Refused. Patient status still unstable.") return else locked = 0 @@ -408,16 +413,15 @@ else ..() -/obj/machinery/clonepod/emag_act(user as mob) +/obj/machinery/clonepod/emag_act(user) if(isnull(occupant)) return to_chat(user, "You force an emergency ejection.") locked = 0 go_out() - return //Put messages in the connected computer's temp var for display. -/obj/machinery/clonepod/proc/connected_message(var/message) +/obj/machinery/clonepod/proc/connected_message(message) if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) return 0 if(!message) @@ -434,49 +438,56 @@ if(!usr) return - if(usr.stat != 0) + if(usr.incapacitated()) return - go_out(usr) + go_out() add_fingerprint(usr) - return -/obj/machinery/clonepod/proc/go_out(user) +/obj/machinery/clonepod/proc/go_out() + if(locked) + return + countdown.stop() + if(mess) //Clean that mess and dump those gibs! - if(occupant) - return mess = 0 gibs(loc) playsound(loc, 'sound/effects/splat.ogg', 50, 1) update_icon() return - if(!(occupant)) - to_chat(user, "The cloning pod is empty!") + if(!occupant) return - if(locked) - to_chat(user, "The cloning pod is locked!") - return + if(grab_ghost_when == CLONER_MATURE_CLONE) + clonemind.transfer_to(occupant) + occupant.grab_ghost() + to_chat(occupant, "There is a bright flash!
\ + You feel like a new being.
") + occupant.flash_eyes(visual = 1) - if(occupant.client) - occupant.client.eye = occupant.client.mob - occupant.client.perspective = MOB_PERSPECTIVE occupant.forceMove(get_turf(src)) eject_wait = 0 //If it's still set somehow. domutcheck(occupant) //Waiting until they're out before possible notransform. + occupant.shock_stage = 0 //Reset Shock occupant = null update_icon() - return /obj/machinery/clonepod/proc/malfunction() if(occupant) connected_message("Critical Error!") + announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.") mess = 1 - occupant.ghostize() - qdel(occupant) - occupant = null update_icon() - return + if(occupant.mind != clonemind) + clonemind.transfer_to(occupant) + occupant.grab_ghost() // We really just want to make you suffer. + to_chat(occupant, {"Agony blazes across your + consciousness as your body is torn apart.
+ Is this what dying is like? Yes it is.
"}) + playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0) + occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + spawn(40) + qdel(occupant) /obj/machinery/clonepod/update_icon() ..() @@ -486,11 +497,9 @@ else if(mess && !panel_open) icon_state = "pod_g" -/obj/machinery/clonepod/relaymove(mob/user as mob) - if(user.stat) - return - go_out() - return +/obj/machinery/clonepod/relaymove(mob/user) + if(user.stat == CONSCIOUS) + go_out() /obj/machinery/clonepod/emp_act(severity) if(prob(100/(severity*efficiency))) malfunction() diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index eafdbe893ab..aa834941d78 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -553,8 +553,8 @@ to_chat(user, "The device is a solid button, there's nothing you can do with it!") /obj/machinery/readybutton/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) - to_chat(user, "This device is not powered.") + if(user.stat || stat & (BROKEN)) + to_chat(user, "This device is not functioning.") return currentarea = get_area(src.loc) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 65a1730bacd..603c0483129 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -448,7 +448,7 @@ if(ORION_TRAIL_RAIDERS) if(prob(50)) to_chat(usr, "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?") - M.hallucination += 30 + M.AdjustHallucinate(30) else to_chat(usr, "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...") M.take_organ_damage(30) @@ -930,7 +930,8 @@ if(specific && specific != dont_remove) safe2remove = list(specific) else - removed = pick(safe2remove) + if(safe2remove.len >= 1) //need to make sure we even have anyone to remove + removed = pick(safe2remove) if(removed) if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index b17a9a37aab..0c09bc5f2c5 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -287,7 +287,7 @@ /obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I,/obj/item/device/multitool)) - var/catastasis = src.contraband_enabled + var/catastasis = contraband_enabled var/opposite_catastasis if(catastasis) opposite_catastasis = "STANDARD" @@ -297,9 +297,9 @@ catastasis = "STANDARD" switch( alert("Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface","Switch to [opposite_catastasis]","Cancel") ) - //switch( alert("Current receiver spectrum is set to: " {(src.contraband_enabled) ? ("BROAD") : ("STANDARD")} , "Multitool-Circuitboard interface" , "Switch to " {(src.contraband_enabled) ? ("STANDARD") : ("BROAD")}, "Cancel") ) + //switch( alert("Current receiver spectrum is set to: " {(contraband_enabled) ? ("BROAD") : ("STANDARD")} , "Multitool-Circuitboard interface" , "Switch to " {(contraband_enabled) ? ("STANDARD") : ("BROAD")}, "Cancel") ) if("Switch to STANDARD","Switch to BROAD") - src.contraband_enabled = !src.contraband_enabled + contraband_enabled = !contraband_enabled if("Cancel") return @@ -345,97 +345,110 @@ switch(state) if(0) if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - to_chat(user, "\blue You wrench the frame into place.") - src.anchored = 1 - src.state = 1 + to_chat(user, "You wrench the frame into place.") + anchored = 1 + state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - to_chat(user, "The welding tool must be on to complete this task.") + to_chat(user, "The welding tool must be on to complete this task.") return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return - to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/metal( src.loc, 5 ) + to_chat(user, "You deconstruct the frame.") + new /obj/item/stack/sheet/metal(loc, 5) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - to_chat(user, "\blue You unfasten the frame.") - src.anchored = 0 - src.state = 0 + to_chat(user, "You unfasten the frame.") + anchored = 0 + state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "computer") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "\blue You place the circuit board inside the frame.") - src.icon_state = "1" - src.circuit = P + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You place the circuit board inside the frame.") + icon_state = "1" + circuit = P user.drop_item() P.loc = src else - to_chat(user, "\red This frame does not accept circuit boards of this type!") + to_chat(user, "This frame does not accept circuit boards of this type!") if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You screw the circuit board into place.") - src.state = 2 - src.icon_state = "2" + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You screw the circuit board into place.") + state = 2 + icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "\blue You remove the circuit board.") - src.state = 1 - src.icon_state = "0" - circuit.loc = src.loc - src.circuit = null + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You remove the circuit board.") + state = 1 + icon_state = "0" + circuit.loc = loc + circuit = null if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You unfasten the circuit board.") - src.state = 1 - src.icon_state = "1" + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You unfasten the circuit board.") + state = 1 + icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + var/obj/item/stack/cable_coil/C = P + if(C.amount >= 5) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You start to add cables to the frame.") if(do_after(user, 20, target = src)) - if(P) - P:amount -= 5 - if(!P:amount) qdel(P) - to_chat(user, "\blue You add cables to the frame.") - src.state = 3 - src.icon_state = "3" + if(state == 2 && C.amount >= 5 && C.use(5)) + to_chat(user, "You add cables to the frame.") + state = 3 + icon_state = "3" + else + to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") + return + else + to_chat(user, "You need five lengths of cable to wire the frame.") + return if(3) if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - to_chat(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 ) + playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) + to_chat(user, "You remove the cables.") + state = 2 + icon_state = "2" + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) A.amount = 5 if(istype(P, /obj/item/stack/sheet/glass)) - if(P:amount >= 2) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + var/obj/item/stack/sheet/glass/G = P + if(G.amount >= 2) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You start to add the glass panel to the frame.") if(do_after(user, 20, target = src)) - if(P) - P:use(2) - to_chat(user, "\blue You put in the glass panel.") - src.state = 4 - src.icon_state = "4" + if(state == 3 && G.amount >= 2 && G.use(2)) + to_chat(user, "You put in the glass panel.") + state = 4 + icon_state = "4" + else + to_chat(user, "At some point during construction you lost some glass. Make sure you have two sheets before trying again.") + return + else + to_chat(user, "You need two sheets of glass for this.") + return if(4) if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "\blue You remove the glass panel.") - src.state = 3 - src.icon_state = "3" - new /obj/item/stack/sheet/glass( src.loc, 2 ) + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You remove the glass panel.") + state = 3 + icon_state = "3" + new /obj/item/stack/sheet/glass(loc, 2) if(istype(P, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You connect the monitor.") - var/B = new src.circuit.build_path ( src.loc ) + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You connect the monitor.") + var/B = new circuit.build_path (loc) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id if(circuit.records) B:records = circuit.records @@ -456,97 +469,110 @@ switch(state) if(0) if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - to_chat(user, "\blue You wrench the frame into place.") - src.anchored = 1 - src.state = 1 + to_chat(user, "You wrench the frame into place.") + anchored = 1 + state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - to_chat(user, "The welding tool must be on to complete this task.") + to_chat(user, "The welding tool must be on to complete this task.") return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return - to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/mineral/bananium( src.loc, 5 ) + to_chat(user, "You deconstruct the frame.") + new /obj/item/stack/sheet/mineral/bananium(loc, 5) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - to_chat(user, "\blue You unfasten the frame.") - src.anchored = 0 - src.state = 0 + to_chat(user, "You unfasten the frame.") + anchored = 0 + state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "honkcomputer") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "\blue You place the circuit board inside the frame.") - src.icon_state = "1" - src.circuit = P + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You place the circuit board inside the frame.") + icon_state = "1" + circuit = P user.drop_item() P.loc = src else - to_chat(user, "\red This frame does not accept circuit boards of this type!") + to_chat(user, "This frame does not accept circuit boards of this type!") if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You screw the circuit board into place.") - src.state = 2 - src.icon_state = "2" + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You screw the circuit board into place.") + state = 2 + icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "\blue You remove the circuit board.") - src.state = 1 - src.icon_state = "0" - circuit.loc = src.loc - src.circuit = null + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You remove the circuit board.") + state = 1 + icon_state = "0" + circuit.loc = loc + circuit = null if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You unfasten the circuit board.") - src.state = 1 - src.icon_state = "1" + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You unfasten the circuit board.") + state = 1 + icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + var/obj/item/stack/cable_coil/C = P + if(C.amount >= 5) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You start to add cables to the frame.") if(do_after(user, 20, target = src)) - if(P) - P:amount -= 5 - if(!P:amount) qdel(P) - to_chat(user, "\blue You add cables to the frame.") - src.state = 3 - src.icon_state = "3" + if(state == 2 && C.amount >= 5 && C.use(5)) + to_chat(user, "You add cables to the frame.") + state = 3 + icon_state = "3" + else + to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") + return + else + to_chat(user, "You need five lengths of cable to wire the frame.") + return if(3) if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - to_chat(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 ) + playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) + to_chat(user, "You remove the cables.") + state = 2 + icon_state = "2" + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) A.amount = 5 if(istype(P, /obj/item/stack/sheet/glass)) - if(P:amount >= 2) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + var/obj/item/stack/sheet/glass/G = P + if(G.amount >= 2) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You start to add the glass panel to the frame.") if(do_after(user, 20, target = src)) - if(P) - P:use(2) - to_chat(user, "\blue You put in the glass panel.") - src.state = 4 - src.icon_state = "4" + if(state == 3 && G.amount >= 2 && G.use(2)) + to_chat(user, "You put in the glass panel.") + state = 4 + icon_state = "4" + else + to_chat(user, "At some point during construction you lost some glass. Make sure you have two sheets before trying again.") + return + else + to_chat(user, "You need two sheets of glass for this.") + return if(4) if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "\blue You remove the glass panel.") - src.state = 3 - src.icon_state = "3" - new /obj/item/stack/sheet/glass( src.loc, 2 ) + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You remove the glass panel.") + state = 3 + icon_state = "3" + new /obj/item/stack/sheet/glass(loc, 2) if(istype(P, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - to_chat(user, "\blue You connect the monitor.") - var/B = new src.circuit.build_path ( src.loc ) + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + to_chat(user, "You connect the monitor.") + var/B = new circuit.build_path (loc) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id if(circuit.records) B:records = circuit.records diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 0a84ee81821..ea3ba02ea1f 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -20,7 +20,7 @@ jump_action.Grant(user) /obj/machinery/computer/camera_advanced/check_eye(mob/user) - if((stat & (NOPOWER|BROKEN)) || !Adjacent(user) || user.eye_blind || user.incapacitated()) + if((stat & (NOPOWER|BROKEN)) || !Adjacent(user) || !user.has_vision() || user.incapacitated()) user.unset_machine() return 0 return 1 @@ -167,4 +167,4 @@ var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T var/obj/machinery/camera/final = T[camera] if(final) - remote_eye.setLoc(get_turf(final)) \ No newline at end of file + remote_eye.setLoc(get_turf(final)) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 6f4a373580c..4afe9ba3cff 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -323,19 +323,7 @@ qdel(C) menu = 1 else - var/mob/selected = find_dead_player("[C.ckey]") - if(!selected) - return - selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable - - var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") - if(answer != "No" && pod.growclone(C)) - temp = "Initiating cloning cycle..." - records.Remove(C) - qdel(C) - menu = 1 - else - temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted." + temp = "[C.name] => Initialisation failure." else temp = "Error: Data corruption." diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 7c77ca6099f..01608efedcb 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -1,9 +1,12 @@ - #define COMM_SCREEN_MAIN 1 #define COMM_SCREEN_STAT 2 #define COMM_SCREEN_MESSAGES 3 #define COMM_SCREEN_SECLEVEL 4 +#define COMM_AUTHENTICATION_NONE 0 +#define COMM_AUTHENTICATION_MIN 1 +#define COMM_AUTHENTICATION_MAX 2 + // The communications computer /obj/machinery/computer/communications name = "communications console" @@ -13,7 +16,7 @@ req_access = list(access_heads) circuit = /obj/item/weapon/circuitboard/communications var/prints_intercept = 1 - var/authenticated = 0 + var/authenticated = COMM_AUTHENTICATION_NONE var/list/messagetitle = list() var/list/messagetext = list() var/currmsg = 0 @@ -39,16 +42,16 @@ crew_announcement.newscast = 1 /obj/machinery/computer/communications/proc/is_authenticated(var/mob/user, var/message = 1) - if(authenticated == 2) - return 2 + if(authenticated == COMM_AUTHENTICATION_MAX) + return COMM_AUTHENTICATION_MAX else if(user.can_admin_interact()) - return 2 + return COMM_AUTHENTICATION_MAX else if(authenticated) - return 1 + return COMM_AUTHENTICATION_MIN else if(message) to_chat(user, "Access denied.") - return 0 + return COMM_AUTHENTICATION_NONE /obj/machinery/computer/communications/Topic(href, href_list) if(..(href, href_list)) @@ -62,23 +65,23 @@ if(!ishuman(usr)) to_chat(usr, "Access denied.") return - var/mob/living/carbon/human/M = usr - var/obj/item/card = M.get_active_hand() - var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if(I && istype(I)) - if(src.check_access(I)) - authenticated = 1 - if(access_captain in I.access) - authenticated = 2 - crew_announcement.announcer = GetNameAndAssignmentFromId(I) + + var/list/access = usr.get_access() + if(allowed(usr)) + authenticated = COMM_AUTHENTICATION_MIN + + if(access_captain in access) + authenticated = COMM_AUTHENTICATION_MAX + var/mob/living/carbon/human/H = usr + var/obj/item/weapon/card/id = H.get_idcard(TRUE) + if(istype(id)) + crew_announcement.announcer = GetNameAndAssignmentFromId(id) + nanomanager.update_uis(src) return if(href_list["logout"]) - authenticated = 0 + authenticated = COMM_AUTHENTICATION_NONE crew_announcement.announcer = "" setMenuState(usr,COMM_SCREEN_MAIN) nanomanager.update_uis(src) @@ -131,13 +134,13 @@ to_chat(usr, "You need to swipe your ID.") if("announce") - if(is_authenticated(usr) == 2) + if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX) if(message_cooldown) to_chat(usr, "Please allow at least one minute to pass between announcements.") nanomanager.update_uis(src) return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") - if(!input || message_cooldown || ..() || !(is_authenticated(usr) == 2)) + if(!input || message_cooldown || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) nanomanager.update_uis(src) return crew_announcement.Announce(input) @@ -213,13 +216,13 @@ setMenuState(usr,COMM_SCREEN_STAT) if("nukerequest") - if(is_authenticated(usr) == 2) + if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null - if(!input || ..() || !(is_authenticated(usr) == 2)) + if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) nanomanager.update_uis(src) return Nuke_request(input, usr) @@ -232,13 +235,13 @@ setMenuState(usr,COMM_SCREEN_MAIN) if("MessageCentcomm") - if(is_authenticated(usr) == 2) + if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null - if(!input || ..() || !(is_authenticated(usr) == 2)) + if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) nanomanager.update_uis(src) return Centcomm_announce(input, usr) @@ -251,13 +254,13 @@ // OMG SYNDICATE ...LETTERHEAD if("MessageSyndicate") - if((is_authenticated(usr) == 2) && (src.emagged)) + if((is_authenticated(usr) == COMM_AUTHENTICATION_MAX) && (src.emagged)) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null - if(!input || ..() || !(is_authenticated(usr) == 2)) + if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) nanomanager.update_uis(src) return Syndicate_announce(input, usr) @@ -518,7 +521,7 @@ return ..() shuttle_master.emergency.request(null, 0.3, null, "All communication consoles, boards, and AI's have been destroyed.") - log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") - message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) + log_game("All the AI's, communication consoles and boards are destroyed. Shuttle called.") + message_admins("All the AI's, communication consoles and boards are destroyed. Shuttle called.", 1) return ..() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 58ae88dba27..160fbeb9827 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -27,7 +27,6 @@ if(mode.kickoff) to_chat(user, "You have been locked out from this console!") - /obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob) if(isobserver(user) && check_rights(R_ADMIN, 0, user)) return 1 @@ -116,8 +115,7 @@ message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [key_name_admin(target)]!") log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [key_name(target)]!") - target.canmove = !target.canmove - target.lockcharge = !target.lockcharge + target.SetLockdown(!target.lockcharge) to_chat(target, "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") if(target.connected_ai) to_chat(target.connected_ai, "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]
") diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 2c6740ffbb3..d7384290164 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -69,21 +69,23 @@ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to add cables to the frame.") if(do_after(user, 20, target = src)) - if(C.amount >= 5 && state == 1) - C.use(5) + if(state == 1 && C.amount >= 5 && C.use(5)) to_chat(user, "You add cables to the frame.") state = 2 icon_state = "box_1" + else + to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") + return else - to_chat(user, "You need five length of cable to wire the frame.") + to_chat(user, "You need five lengths of cable to wire the frame.") return else if(istype(P, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = P - if(G.amount<5) - to_chat(user, "\red You do not have enough glass to build a display case.") + if(G.amount < 5) + to_chat(user, "You do not have enough glass to build a display case.") return G.use(5) - to_chat(user, "\blue You add the glass to the frame.") + to_chat(user, "You add the glass to the frame.") playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) new /obj/structure/displaycase_frame(src.loc) qdel(src) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 94bc3f5b90b..33b1d79cb19 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -80,10 +80,10 @@ beaker = null return ..() -/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) +/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob) if(O.loc == user) //no you can't pull things out of your ass return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + if(user.incapacitated()) //are you cuffed, dying, lying, stunned or other return if(get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source return @@ -134,7 +134,6 @@ if(air_contents) temperature_archived = air_contents.temperature heat_gas_contents() - expel_gas() if(occupant) process_occupant() @@ -372,7 +371,7 @@ occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise if(occupant.bodytemperature < T0C) - occupant.sleeping = max(5/efficiency, (1/occupant.bodytemperature)*2000/efficiency) + occupant.Sleeping(max(5/efficiency, (1/occupant.bodytemperature)*2000/efficiency)) occupant.Paralyse(max(5/efficiency, (1/occupant.bodytemperature)*3000/efficiency)) if(air_contents.oxygen > 2) if(occupant.getOxyLoss()) occupant.adjustOxyLoss(-1) @@ -401,16 +400,6 @@ var/combined_energy = T20C*current_heat_capacity + air_heat_capacity*air_contents.temperature air_contents.temperature = combined_energy/combined_heat_capacity -/obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas() - if(air_contents.total_moles() < 1) - return - var/datum/gas_mixture/expel_gas = new - var/remove_amount = air_contents.total_moles()/100 - expel_gas = air_contents.remove(remove_amount) - expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed - loc.assume_air(expel_gas) - air_update_turf() - /obj/machinery/atmospherics/unary/cryo_cell/proc/go_out() if(!occupant) return @@ -457,16 +446,17 @@ set name = "Eject occupant" set category = "Object" set src in oview(1) + if(usr == occupant)//If the user is inside the tube... - if(usr.stat == 2)//and he's not dead.... + if(usr.stat == DEAD) return - to_chat(usr, "\blue Release sequence activated. This will take two minutes.") + to_chat(usr, "Release sequence activated. This will take two minutes.") sleep(600) if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already return go_out()//and release him from the eternal prison. else - if(usr.stat != 0) + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return go_out() add_fingerprint(usr) @@ -476,14 +466,18 @@ set name = "Move Inside" set category = "Object" set src in oview(1) + for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) to_chat(usr, "You're too busy getting your life sucked out of you.") return - if(usr.stat != 0 || stat & (NOPOWER|BROKEN)) + + if(stat & (NOPOWER|BROKEN)) return - if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other + + if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return + put_mob(usr) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 9ffec3cb02c..4c462b5a05c 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -485,7 +485,7 @@ if(O.loc == user) //no you can't pull things out of your ass return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + if(user.incapacitated()) //are you cuffed, dying, lying, stunned or other return if(get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 30e5cac609f..acad5a5a563 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -4,7 +4,7 @@ name = "airlock electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" - w_class = 2 //It should be tiny! -Agouri + w_class = 2 materials = list(MAT_METAL=50, MAT_GLASS=50) req_access = list(access_engine) @@ -12,101 +12,96 @@ var/list/conf_access = null var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access var/last_configurator = null - var/locked = 1 + var/locked = TRUE + var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics - attack_self(mob/user as mob) - if(!ishuman(user) && !istype(user,/mob/living/silicon/robot)) - return ..(user) +/obj/item/weapon/airlock_electronics/attack_self(mob/user) + if(!ishuman(user) && !isrobot(user)) + return ..() + if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.getBrainLoss() >= 60) + if(H.getBrainLoss() >= max_brain_damage) + to_chat(user, "You forget how to use \the [src].") return - var/t1 = text("Access control
\n") + var/t1 = text("Access control
\n") + if(last_configurator) + t1 += "Operator: [last_configurator]
" - if(last_configurator) - t1 += "Operator: [last_configurator]
" + if(locked) + t1 += "Swipe ID
" + else + t1 += "Block
" - if(locked) - t1 += "Swipe ID
" + t1 += "Access requirement is set to " + t1 += one_access ? "ONE
" : "ALL
" + + t1 += conf_access == null ? "All
" : "All
" + + t1 += "
" + + var/list/accesses = get_all_accesses() + for(var/acc in accesses) + var/aname = get_access_desc(acc) + + if(!conf_access || !conf_access.len || !(acc in conf_access)) + t1 += "[aname]
" + else if(one_access) + t1 += "[aname]
" + else + t1 += "[aname]
" + + t1 += "

Close

\n" + + var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400) + popup.set_content(t1) + popup.open(0) + onclose(user, "airlock") + +/obj/item/weapon/airlock_electronics/Topic(href, href_list) + ..() + + if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr))) + return 1 + + if(href_list["close"]) + usr << browse(null, "window=airlock") + return + + if(href_list["login"]) + if(allowed(usr)) + locked = FALSE + last_configurator = usr.name + + if(locked) + return + + if(href_list["logout"]) + locked = TRUE + + if(href_list["one_access"]) + one_access = !one_access + + if(href_list["access"]) + toggle_access(href_list["access"]) + + attack_self(usr) + +/obj/item/weapon/airlock_electronics/proc/toggle_access(var/access) + if(access == "all") + conf_access = null + else + var/req = text2num(access) + + if(conf_access == null) + conf_access = list() + + if(!(req in conf_access)) + conf_access += req else - t1 += "Block
" - - t1 += "Access requirement is set to " - t1 += one_access ? "ONE
" : "ALL
" - - t1 += conf_access == null ? "All
" : "All
" - - t1 += "
" - - var/list/accesses = get_all_accesses() - for(var/acc in accesses) - var/aname = get_access_desc(acc) - - if(!conf_access || !conf_access.len || !(acc in conf_access)) - t1 += "[aname]
" - else if(one_access) - t1 += "[aname]
" - else - t1 += "[aname]
" - - t1 += "

Close

\n" - - var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400) - popup.set_content(t1) - popup.open(0) - onclose(user, "airlock") - - Topic(href, href_list) - ..() - if(usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon))) - return - if(href_list["close"]) - usr << browse(null, "window=airlock") - return - - if(href_list["login"]) - if(istype(usr,/mob/living/silicon)) - src.locked = 0 - src.last_configurator = usr.name - else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if(I && src.check_access(I)) - src.locked = 0 - src.last_configurator = I:registered_name - - if(locked) - return - - if(href_list["logout"]) - locked = 1 - - if(href_list["one_access"]) - one_access = !one_access - - if(href_list["access"]) - toggle_access(href_list["access"]) - - attack_self(usr) - - proc - toggle_access(var/acc) - if(acc == "all") + conf_access -= req + if(!conf_access.len) conf_access = null - else - var/req = text2num(acc) - - if(conf_access == null) - conf_access = list() - - if(!(req in conf_access)) - conf_access += req - else - conf_access -= req - if(!conf_access.len) - conf_access = null diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index 151478ddee6..73e590361a7 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -111,21 +111,21 @@ if(do_after(user, 50, target = H)) switch(what_to_dye) if("hair") - var/r_hair = hex2num(copytext(dye_color, 2, 4)) - var/g_hair = hex2num(copytext(dye_color, 4, 6)) - var/b_hair = hex2num(copytext(dye_color, 6, 8)) + var/r_hair = color2R(dye_color) + var/g_hair = color2G(dye_color) + var/b_hair = color2B(dye_color) if(H.change_hair_color(r_hair, g_hair, b_hair)) H.update_dna() if("facial hair") - var/r_facial = hex2num(copytext(dye_color, 2, 4)) - var/g_facial = hex2num(copytext(dye_color, 4, 6)) - var/b_facial = hex2num(copytext(dye_color, 6, 8)) + var/r_facial = color2R(dye_color) + var/g_facial = color2G(dye_color) + var/b_facial = color2B(dye_color) if(H.change_facial_hair_color(r_facial, g_facial, b_facial)) H.update_dna() if("body") - var/r_skin = hex2num(copytext(dye_color, 2, 4)) - var/g_skin = hex2num(copytext(dye_color, 4, 6)) - var/b_skin = hex2num(copytext(dye_color, 6, 8)) + var/r_skin = color2R(dye_color) + var/g_skin = color2G(dye_color) + var/b_skin = color2B(dye_color) if(H.change_skin_color(r_skin, g_skin, b_skin)) H.update_dna() user.visible_message("[user] finishes dying [M]'s [what_to_dye]!", "You finish dying [M]'s [what_to_dye]!") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 8120bae4216..41952adf355 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -90,12 +90,15 @@ var/const/HOLOPAD_MODE = 0 user.eyeobj.setLoc(get_turf(src)) else if(!hologram)//If there is no hologram, possibly make one. activate_holo(user) - else if(master==user)//If there is a hologram, remove it. But only if the user is the master. Otherwise do nothing. + else if(master == user)//If there is a hologram, remove it. But only if the user is the master. Otherwise do nothing. clear_holo() return /obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user) if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it. + if(user.holo) + var/obj/machinery/hologram/holopad/current = user.holo + current.clear_holo() if(!hologram)//If there is not already a hologram. create_holo(user)//Create one. src.visible_message("A holographic image of [user] flicks to life right before your eyes!") diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index b003d9ef1d6..519a7177d7a 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -127,13 +127,15 @@ Class Procs: /obj/machinery/proc/addAtProcessing() if(use_power) myArea = get_area_master(src) - - machines += src if(!speed_process) machine_processing += src else fast_processing += src +/obj/machinery/New() //new + machines += src + ..() + /obj/machinery/Destroy() if(myArea) myArea = null diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index f7e78ffad2e..1d8d9a1e22e 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -981,7 +981,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa /obj/machinery/newscaster/proc/newsAlert(var/news_call) //This isn't Agouri's work, for it is ugly and vile. if(news_call) - atom_say("Breaking news from [news_call]!") + atom_say("[news_call]!") src.alert = 1 src.update_icon() spawn(300) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index afe79ca48e3..bf2eedeaf23 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -37,6 +37,7 @@ #define PIPE_DP_VENT 36 #define PIPE_PASV_VENT 37 #define PIPE_DTVALVE 38 +#define PIPE_CIRCULATOR 39 /obj/item/pipe name = "pipe" @@ -150,10 +151,16 @@ src.pipe_type = PIPE_OMNI_MIXER else if(istype(make_from, /obj/machinery/atmospherics/omni/filter)) src.pipe_type = PIPE_OMNI_FILTER + else if(istype(make_from, /obj/machinery/atmospherics/binary/circulator)) + src.pipe_type = PIPE_CIRCULATOR var/obj/machinery/atmospherics/trinary/triP = make_from if(istype(triP) && triP.flipped) src.flipped = 1 + + var/obj/machinery/atmospherics/binary/circulator/circP = make_from + if(istype(circP) && circP.side == circP.CIRC_RIGHT) + src.flipped = 1 else src.pipe_type = pipe_type @@ -214,6 +221,7 @@ "dual-port vent", \ "passive vent", \ "digital t-valve", \ + "circulator/heat exchanger", \ ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -256,11 +264,15 @@ "dual-port vent", \ "passive vent", \ "dtvalve", \ + "circ", \ ) icon_state = islist[pipe_type + 1] var/obj/machinery/atmospherics/trinary/triP = make_from if(istype(triP) && triP.flipped) icon_state = "m_[icon_state]" + var/obj/machinery/atmospherics/binary/circulator/circP = make_from + if(istype(circP) && circP.side == circP.CIRC_RIGHT) + icon_state = "m_[icon_state]" // called by turf to know if should treat as bent or not on placement /obj/item/pipe/proc/is_bent_pipe() @@ -280,6 +292,10 @@ if( usr.stat || usr.restrained() ) return + + if(pipe_type == PIPE_CIRCULATOR) + flip() + return src.dir = turn(src.dir, -90) @@ -295,7 +311,7 @@ if(usr.stat || usr.restrained()) return - if(pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE)) + if(pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE, PIPE_CIRCULATOR)) if(flipped) icon_state = copytext(icon_state,3) else @@ -529,6 +545,14 @@ if(pipename) P.name = pipename P.construction(unflip(dir), pipe_dir, color) + + if(PIPE_CIRCULATOR) //circulator + var/obj/machinery/atmospherics/binary/circulator/C = new(src.loc) + if(flipped) + C.side = C.CIRC_RIGHT + if(pipename) + C.name = pipename + C.construction(C.dir, C.initialize_directions, color) if(PIPE_SCRUBBER) //scrubber var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc) @@ -682,3 +706,4 @@ #undef PIPE_DP_VENT #undef PIPE_PASV_VENT #undef PIPE_DTVALVE +#undef PIPE_CIRCULATOR diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index d8f23599f74..452408ccdaa 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -104,11 +104,11 @@ return if(drownee.stat) //Mob is in critical. - drownee.losebreath -= 3 //You're gonna die here. + drownee.AdjustLoseBreath(3, bound_lower = 0, bound_upper = 20) add_logs(src, drownee, "drowned", null, null, 0) //log it to their VV, but don't spam the admins' chats with the logs drownee.visible_message("\The [drownee] appears to be drowning!","You're quickly drowning!") //inform them that they are fucked. else - drownee.losebreath -= 2 //For every time you drown, you miss 2 breath attempts. Hope you catch on quick! + drownee.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 20) //For every time you drown, you miss 2 breath attempts. Hope you catch on quick! add_logs(src, drownee, "drowned", null, null, 0) //log it to their VV, but don't spam the admins' chats with the logs if(prob(35)) //35% chance to tell them what is going on. They should probably figure it out before then. drownee.visible_message("\The [drownee] flails, almost like they are drowning!","You're lacking air!") //*gasp* *gasp* *gasp* *gasp* *gasp* diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm index 4cd09d6f8a4..3bed121322b 100644 --- a/code/game/machinery/programmable_unloader.dm +++ b/code/game/machinery/programmable_unloader.dm @@ -254,6 +254,7 @@ src.overrides = null P.emag_overrides = src.emag_overrides src.emag_overrides = null + default_deconstruction_crowbar(I, 1) return else ..(I,user) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 23271355206..d95570cf88f 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -481,7 +481,7 @@ return 0 occupant_message("Analyzing reagents...") for(var/datum/reagent/R in A.reagents.reagent_list) - if(R.reagent_state == 2 && add_known_reagent(R.id,R.name)) + if(R.can_synth && add_known_reagent(R.id, R.name)) occupant_message("Reagent analyzed, identified as [R.name] and added to database.") send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form()) occupant_message("Analyzis complete.") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 68b2c83059e..fedb792c37d 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -164,9 +164,9 @@ if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) continue to_chat(M, "HONK") - M.sleeping = 0 - M.stuttering = 20 - M.adjustEarDamage(0,30) + M.SetSleeping(0) + M.Stuttering(20) + M.AdjustEarDeaf(30) M.Weaken(3) if(prob(30)) M.Stun(10) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 7ebf1e233c3..c8f93bc74ce 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -563,7 +563,9 @@ dam_coeff = B.damage_coeff break - if(prob(deflect_chance & deflection) && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + if(prob(deflect_chance * deflection) && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + visible_message("[src]'s armour deflects [Proj]!") + else visible_message("[src] is hit by [Proj].") take_damage(Proj.damage * dam_coeff, Proj.flag) check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT)) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 47b6c1bf57b..90e4c47b276 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -583,7 +583,7 @@ steam.start() -- spawns the effect // if(M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later else M.drop_item() - M:sleeping += 5 + M.AdjustSleeping(5) if(M.coughedtime != 1) M.coughedtime = 1 M.emote("cough") @@ -600,7 +600,7 @@ steam.start() -- spawns the effect return else M.drop_item() - M:sleeping += 5 + M.AdjustSleeping(5) if(M.coughedtime != 1) M.coughedtime = 1 M.emote("cough") diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index ecb8590c103..43fd8ad3dc7 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -12,22 +12,6 @@ invisibility = 101 switch(name) //some of these are probably obsolete - if("shuttle") - log_runtime(EXCEPTION("Obsolete landmark '[name]' at ([x],[y],[z])"), src) - qdel(src) - - if("airtunnel_stop") - airtunnel_stop = x - - if("airtunnel_start") - airtunnel_start = x - - if("airtunnel_bottom") - airtunnel_bottom = y - - if("monkey") - monkeystart += loc - qdel(src) if("start") newplayer_start += loc qdel(src) @@ -52,29 +36,28 @@ latejoin_cyborg += loc qdel(src) - //prisoners if("prisonwarp") prisonwarp += loc qdel(src) - // if("mazewarp") - // mazewarp += loc - if("Holding Facility") - holdingfacility += loc - if("tdome1") - tdome1 += loc - if("tdome2") - tdome2 += loc - if("tdomeadmin") - tdomeadmin += loc - if("tdomeobserve") - tdomeobserve += loc - if("aroomwarp") - aroomwarp += loc - - //not prisoners + if("prisonsecuritywarp") prisonsecuritywarp += loc qdel(src) + + if("tdome1") + tdome1 += loc + + if("tdome2") + tdome2 += loc + + if("tdomeadmin") + tdomeadmin += loc + + if("tdomeobserve") + tdomeobserve += loc + + if("aroomwarp") + aroomwarp += loc if("blobstart") blobstart += loc @@ -96,6 +79,11 @@ if("ERT Director") ertdirector += loc + qdel(src) + + if("Response Team") + emergencyresponseteamspawn += loc + qdel(src) landmarks_list += src return 1 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index a635d2fdad9..328555fc39b 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -55,13 +55,6 @@ anchored = 1.0 unacidable = 1 -/obj/effect/stop - var/victim = null - icon_state = "empty" - name = "Geas" - desc = "You can't resist." - // name = "" - /obj/effect/projection name = "Projection" desc = "This looks like a projection of something." diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 79b09f48835..9d1fb75d25e 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -215,6 +215,7 @@ desc = "Green squishy mess." icon = 'icons/effects/effects.dmi' icon_state = "greenshatter" + anchored = 1 /obj/effect/spider/cocoon name = "cocoon" diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 32bf9a2fea5..9e36faae088 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -57,10 +57,11 @@ var/close = range(world.view+round(devastation_range,1), epicenter) // to all distanced mobs play a different sound - for(var/mob/M in world) if(M.z == epicenter.z) if(!(M in close)) - // check if the mob can hear - if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space)) - M << 'sound/effects/explosionfar.ogg' + for(var/mob/M in world) + if(M.z == epicenter.z && !(M in close)) + // check if the mob can hear + if(M.can_hear() && !istype(M.loc,/turf/space)) + M << 'sound/effects/explosionfar.ogg' if(heavy_impact_range > 1) var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6ea2906c072..b34cc09ca89 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -474,10 +474,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly to_chat(M, "Your eyes start to bleed profusely!") if(prob(50)) - if(M.stat != 2) + if(M.stat != DEAD) to_chat(M, "You drop what you're holding and clutch at your eyes!") M.drop_item() - M.eye_blurry += 10 + M.AdjustEyeBlurry(10) M.Paralyse(1) M.Weaken(2) if(eyes.damage >= eyes.min_broken_damage) @@ -488,7 +488,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d H.UpdateDamageIcon() else M.take_organ_damage(7) - M.eye_blurry += rand(3,4) + M.AdjustEyeBlurry(rand(3,4)) return /obj/item/clean_blood() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index a91c4e2ebe3..065392a9222 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -236,10 +236,10 @@ var/mob/living/carbon/human/C = target user.visible_message(" [user] sprays [src] into the face of [target]!") if(C.client) - C.eye_blurry = max(C.eye_blurry, 3) - C.eye_blind = max(C.eye_blind, 1) + C.EyeBlurry(3) + C.EyeBlind(1) if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. - C.confused = max(C.confused, 3) + C.Confused(3) C.Weaken(3) C.lip_style = "spray_face" C.lip_color = colour @@ -251,4 +251,4 @@ overlays.Cut() var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]") I.color = colour - overlays += I \ No newline at end of file + overlays += I diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 7f2afb179e4..b0e04a5ae77 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -55,7 +55,7 @@ interact(user) /obj/item/device/camera_bug/check_eye(var/mob/user as mob) - if(user.stat || loc != user || !user.canmove || user.eye_blind || !current) + if(user.stat || loc != user || !user.canmove || !user.has_vision() || !current) user.reset_view(null) user.unset_machine() return null diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index cec1c106e48..52a9a343e6b 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -81,7 +81,7 @@ if(M.weakeyes) M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash if(M.flash_eyes(1, 1)) - M.confused += power + M.AdjustConfused(power) terrible_conversion_proc(M, user) M.Stun(1) visible_message("[user] blinds [M] with the flash!") @@ -96,7 +96,7 @@ to_chat(M, "[user] fails to blind you with the flash!") else if(M.flash_eyes()) - M.confused += power + M.AdjustConfused(power) /obj/item/device/flash/attack(mob/living/M, mob/user) if(!try_use_flash(user)) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 4b3a656c02e..9a9edbb62ad 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -381,9 +381,7 @@ REAGENT SCANNER /obj/item/device/mass_spectrometer/New() ..() - var/datum/reagents/R = new/datum/reagents(5) - reagents = R - R.my_atom = src + create_reagents(5) /obj/item/device/mass_spectrometer/on_reagent_change() if(reagents.total_volume) diff --git a/code/game/objects/items/mountable_frames/lights.dm b/code/game/objects/items/mountable_frames/lights.dm index 3655070ce2f..b108240b332 100644 --- a/code/game/objects/items/mountable_frames/lights.dm +++ b/code/game/objects/items/mountable_frames/lights.dm @@ -11,7 +11,7 @@ playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1) var/constrdir = user.dir var/constrloc = get_turf(user) - if(!do_after(user, 30, target = src)) + if(!do_after(user, 30, target = on_wall)) return var/obj/machinery/light_construct/newlight switch(fixture_type) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 295a1538a65..01891d4c77a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -38,9 +38,7 @@ item_state = "balloon-empty" /obj/item/toy/balloon/New() - var/datum/reagents/R = new/datum/reagents(10) - reagents = R - R.my_atom = src + create_reagents(10) /obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index a0dcdaec042..8eb92562b7f 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -207,9 +207,9 @@ RCD var/obj/machinery/door/airlock/T = new door_type(A) T.autoclose = 1 if(one_access) - T.req_one_access = door_accesses + T.req_one_access = door_accesses.Copy() else - T.req_access = door_accesses + T.req_access = door_accesses.Copy() return 1 return 0 return 0 diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 448054deb1a..eda6d74b296 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -292,7 +292,8 @@ defib.on = 0 loc = defib defib.update_icon() - return unwield() + update_icon() + return unwield(user) /obj/item/weapon/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O) if(!mainunit || !istype(mainunit, /obj/item/weapon/defibrillator)) //To avoid weird issues from admin spawns @@ -407,8 +408,9 @@ H.adjustBruteLoss(tobehealed) user.visible_message("[defib] pings: Resuscitation successful.") playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.stat = 1 - H.update_revive() + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) H.emote("gasp") if(tplus > tloss) H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) @@ -526,8 +528,9 @@ H.adjustBruteLoss(tobehealed) user.visible_message("[user] pings: Resuscitation successful.") playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.stat = UNCONSCIOUS - H.update_revive() + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) H.emote("gasp") if(tplus > tloss) H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 6399a11c291..5714f5e4310 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -147,6 +147,7 @@ triggered = 1 visible_message("You hear a quiet click.") spawn(40) + var/cap = 0 if(result > MAX_EX_LIGHT_RANGE && result != 20) cap = 1 @@ -156,6 +157,13 @@ var/turf/epicenter = get_turf(src) explosion(epicenter, round(result*0.25), round(result*0.5), round(result), round(result*1.5), 1, cap) + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + bombers += "E20 detonated at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with a roll of [result]. Triggered by: [key_name(user)]" + message_admins("E20 detonated at [A.name] (JMP) with a roll of [result]. Triggered by: [key_name_admin(user)]") + log_game("E20 detonated at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with a roll of [result]. Triggered by: [key_name(user)]") + + /obj/item/weapon/dice/update_icon() overlays.Cut() overlays += "[src.icon_state][src.result]" diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 69a4d78643e..45aabc2c073 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -72,6 +72,7 @@ spawn(0) //Some mutations have sleeps in them, like monkey if(!(NOCLONE in M.mutations) && !(H && (H.species.flags & NO_DNA))) // prevents drained people from having their DNA changed var/prev_ue = M.dna.unique_enzymes + var/mutflags = 0 // UI in syringe. if(buf.types & DNA2_BUF_UI) if(!block) //isolated block? @@ -88,12 +89,13 @@ M.dna.SetUIValue(block,src.GetValue()) M.UpdateAppearance() if(buf.types & DNA2_BUF_SE) + mutflags = MUTCHK_FORCED if(!block) //isolated block? M.dna.SE = buf.dna.SE.Copy() M.dna.UpdateSE() else M.dna.SetSEValue(block,src.GetValue()) - domutcheck(M, null, 0) + domutcheck(M, null, mutflags) M.update_mutations() if(H) H.sync_organ_dna(assimilate = 0, old_ue = prev_ue) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index e6b0ff92c32..22b589c7517 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -91,7 +91,7 @@ G.state = GRAB_NECK G.hud.icon_state = "kill" G.hud.name = "kill" - M.silent += 1 + M.AdjustSilence(1) garrote_time = world.time + 10 processing_objects.Add(src) @@ -152,11 +152,11 @@ return - strangling.silent = max(strangling.silent, 3) // Non-improvised effects + strangling.Silence(3) // Non-improvised effects strangling.apply_damage(4, OXY, "head") /obj/item/weapon/twohanded/garrote/suicide_act(mob/user) user.visible_message("[user] is wrapping the [src] around \his neck and pulling the handles! It looks like \he's trying to commit suicide.") playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1) - return (OXYLOSS) \ No newline at end of file + return (OXYLOSS) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 9562f9442c7..4241c9c5c0c 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -51,12 +51,13 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) + M.EarDeaf(15) + M.AdjustEarDamage(rand(0, 5)) if(M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) + if(prob(M.ear_damage - 5)) to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF + M.BecomeDeaf() else if(M.ear_damage >= 5) to_chat(M, "Your ears start to ring!") diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 600ff934a8f..be74349f8ca 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -285,7 +285,7 @@ /obj/item/weapon/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity) if(!proximity) return - if(istype(AM, /mob/living/carbon/human)) + if(ishuman(AM)) var/mob/living/carbon/human/H = AM if(is_shadow(H)) var/phrase = pick("Die monster! You don't belong in this world!!!", "You steal men's souls and make them your slaves!!!", "Your words are as empty as your soul!!!", "Mankind ill needs a savior such as you!!!") @@ -399,7 +399,7 @@ /obj/item/weapon/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) + if(!iscarbon(M)) return ..() if(!user.mind || user.mind.assigned_role != "Chaplain") @@ -414,7 +414,7 @@ praying = 1 if(do_after(user, 150, target = M)) - if(istype(M, /mob/living/carbon/human)) // This probably should not work on vulps. They're unholy abominations. + if(ishuman(M)) // This probably should not work on vulps. They're unholy abominations. var/mob/living/carbon/human/target = M if(target.mind) @@ -443,15 +443,15 @@ praying = 0 /obj/item/weapon/nullrod/rosary/process() - if(istype(loc, /mob/living/carbon/human)) + if(ishuman(loc)) var/mob/living/carbon/human/holder = loc if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will - for(var/mob/living/carbon/human/M in range(5)) - if(M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full)) - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + for(var/mob/living/carbon/human/H in range(5)) + if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) + H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2) if(prob(10)) - to_chat(M, "Being in the presence of [holder]'s [src] is interfering with your powers!") + to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!") /obj/item/weapon/nullrod/missionary_staff name = "holy staff" @@ -503,7 +503,7 @@ return 0 /obj/item/weapon/nullrod/missionary_staff/afterattack(mob/living/carbon/human/target, mob/living/carbon/human/missionary, flag, params) - if(!istype(target) || !istype(missionary)) //ishuman checks effectively + if(!ishuman(target) || !ishuman(missionary)) //ishuman checks return if(target == missionary) //you can't convert yourself, that would raise too many questions about your own dedication to the cause return @@ -533,7 +533,7 @@ /obj/item/weapon/nullrod/missionary_staff/proc/do_convert(mob/living/carbon/human/target, mob/living/carbon/human/missionary) var/convert_duration = 6000 //10 min - if(!target || !istype(target) || !missionary || !istype(missionary)) + if(!target || !ishuman(target) || !missionary || !ishuman(missionary)) return if(ismindslave(target) || target.mind.zealot_master) //mindslaves and zealots override the staff because the staff is just a temporary mindslave to_chat(missionary, "Your faith is strong, but their mind is already slaved to someone else's ideals. Perhaps an inquisition would reveal more...") diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index 05a50200e7d..e966f5500e5 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -115,7 +115,7 @@ if(do_after(user, 50, target = H)) playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1) user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top. - H.losebreath += 10 //30 Oxy damage over time + H.AdjustLoseBreath(10) //30 Oxy damage over time H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors") var/turf/location = get_turf(H) if(istype(location, /turf/simulated)) diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index 81ba661115a..470c273bd69 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -138,8 +138,8 @@ affected_mob.setStaminaLoss(0) var/status = CANSTUN | CANWEAKEN | CANPARALYSE affected_mob.status_flags &= ~status - affected_mob.dizziness = max(0, affected_mob.dizziness-10) - affected_mob.drowsyness = max(0, affected_mob.drowsyness-10) + affected_mob.AdjustDizzy(-10) + affected_mob.AdjustDrowsy(-10) affected_mob.SetSleeping(0) stage = 1 switch(progenitor.hunger) @@ -181,4 +181,4 @@ affected_mob.adjustBruteLoss(5) if(ismob(progenitor.loc)) - progenitor.hunger++ \ No newline at end of file + progenitor.hunger++ diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 937cc3214a3..ef0cdfc329b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -116,7 +116,7 @@ if(H.get_item_by_slot(slot_head) == src) if(H.internal) return - H.losebreath += 1 + H.AdjustLoseBreath(1) else storage_slots = 7 processing_objects.Remove(src) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 7cc71918905..448395df3e4 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -16,41 +16,41 @@ var/icon_closed = "lockbox" var/icon_broken = "lockbox+b" - - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/card/id)) - if(src.broken) - to_chat(user, "It appears to be broken.") - return - if(src.allowed(user)) - src.locked = !( src.locked ) - if(src.locked) - src.icon_state = src.icon_locked - to_chat(user, "You lock the [src.name]!") - return - else - src.icon_state = src.icon_closed - to_chat(user, "You unlock the [src.name]!") - origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. - return - else - to_chat(user, "Access Denied") - else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken) - emag_act(user) +/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) + if(broken) + to_chat(user, "It appears to be broken.") return - if(!locked) - ..() + if(check_access(W)) + locked = !locked + if(locked) + icon_state = icon_locked + to_chat(user, "You lock \the [src]!") + return + else + icon_state = icon_closed + to_chat(user, "You unlock \the [src]!") + origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. + return else - to_chat(user, "It's locked!") + to_chat(user, "Access denied.") + return + else if((istype(W, /obj/item/weapon/card/emag) || (istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)) + emag_act(user) return + if(!locked) + ..() + else + to_chat(user, "It's locked!") + return - show_to(mob/user as mob) - if(locked) - to_chat(user, "It's locked!") - else - ..() - return +/obj/item/weapon/storage/lockbox/show_to(mob/user as mob) + if(locked) + to_chat(user, "It's locked!") + else + ..() + return /obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!locked) @@ -64,7 +64,7 @@ broken = 1 locked = 0 desc = "It appears to be broken." - icon_state = src.icon_broken + icon_state = icon_broken to_chat(user, "You unlock \the [src].") origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return @@ -84,23 +84,21 @@ name = "Lockbox (Mindshield Implants)" req_access = list(access_security) - New() - ..() - new /obj/item/weapon/implantcase/loyalty(src) - new /obj/item/weapon/implantcase/loyalty(src) - new /obj/item/weapon/implantcase/loyalty(src) - new /obj/item/weapon/implanter/loyalty(src) - +/obj/item/weapon/storage/lockbox/loyalty/New() + ..() + new /obj/item/weapon/implantcase/loyalty(src) + new /obj/item/weapon/implantcase/loyalty(src) + new /obj/item/weapon/implantcase/loyalty(src) + new /obj/item/weapon/implanter/loyalty(src) /obj/item/weapon/storage/lockbox/clusterbang name = "lockbox (clusterbang)" desc = "You have a bad feeling about opening this." req_access = list(access_security) - New() - ..() - new /obj/item/weapon/grenade/clusterbuster(src) - +/obj/item/weapon/storage/lockbox/clusterbang/New() + ..() + new /obj/item/weapon/grenade/clusterbuster(src) /obj/item/weapon/storage/lockbox/medal name = "medal box" @@ -116,14 +114,14 @@ icon_closed = "medalbox" icon_broken = "medalbox+b" - New() - ..() - new /obj/item/clothing/accessory/medal/gold/heroism(src) - new /obj/item/clothing/accessory/medal/silver/security(src) - new /obj/item/clothing/accessory/medal/silver/valor(src) - new /obj/item/clothing/accessory/medal/nobel_science(src) - new /obj/item/clothing/accessory/medal/bronze_heart(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/gold/captain(src) +/obj/item/weapon/storage/lockbox/medal/New() + ..() + new /obj/item/clothing/accessory/medal/gold/heroism(src) + new /obj/item/clothing/accessory/medal/silver/security(src) + new /obj/item/clothing/accessory/medal/silver/valor(src) + new /obj/item/clothing/accessory/medal/nobel_science(src) + new /obj/item/clothing/accessory/medal/bronze_heart(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/gold/captain(src) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 460498a874b..e848eec1aca 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -27,131 +27,132 @@ max_w_class = 2 max_combined_w_class = 14 - examine(mob/user) - if(..(user, 1)) - to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) +/obj/item/weapon/storage/secure/examine(mob/user) + if(..(user, 1)) + to_chat(user, text("The service panel is [open ? "open" : "closed"].")) - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(locked) - if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged)) - emag_act(user, W) +/obj/item/weapon/storage/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(locked) + if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!emagged)) + emag_act(user, W) - if(istype(W, /obj/item/weapon/screwdriver)) - if(do_after(user, 20, target = src)) - src.open =! src.open - user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close"))) - return - if((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1) - src.l_hacking = 1 - if(do_after(usr, 100, target = src)) - if(prob(40)) - src.l_setshort = 1 - src.l_set = 0 - user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1) - sleep(80) - src.l_setshort = 0 - src.l_hacking = 0 - else - user.show_message(text("\red Unable to reset internal memory."), 1) - src.l_hacking = 0 - else src.l_hacking = 0 - return - //At this point you have exhausted all the special things to do when locked - // ... but it's still locked. + if(istype(W, /obj/item/weapon/screwdriver)) + if(do_after(user, 20, target = src)) + open = !open + user.show_message("You [open ? "open" : "close"] the service panel.", 1) return - // -> storage/attackby() what with handle insertion, etc - ..() - - emag_act(user as mob, weapon as obj) - if(!emagged) - emagged = 1 - src.overlays += image('icons/obj/storage.dmi', icon_sparking) - sleep(6) - src.overlays = null - overlays += image('icons/obj/storage.dmi', icon_locking) - locked = 0 - if(istype(weapon, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) - to_chat(user, "You slice through the lock on [src].") - else - to_chat(user, "You short out the lock on [src].") - return - - - MouseDrop(over_object, src_location, over_location) - if(locked) - src.add_fingerprint(usr) - return - ..() - - - attack_self(mob/user as mob) - user.set_machine(src) - var/dat = text("[]
\n\nLock Status: []",src, (src.locked ? "LOCKED" : "UNLOCKED")) - var/message = "Code" - if((src.l_set == 0) && (!src.emagged) && (!src.l_setshort)) - dat += text("

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
") - if(src.emagged) - dat += text("

\nLOCKING SYSTEM ERROR - 1701") - if(src.l_setshort) - dat += text("

\nALERT: MEMORY SYSTEM ERROR - 6040 201") - message = text("[]", src.code) - if(!src.locked) - message = "*****" - dat += {"


\n>[message]
\n - 1- - 2- - 3
\n - 4- - 5- - 6
\n - 7- - 8- - 9
\n - R- - 0- - E
\n
"} - user << browse(dat, "window=caselock;size=300x280") - - Topic(href, href_list) - ..() - if((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1)) - return - if(href_list["type"]) - if(href_list["type"] == "E") - if((src.l_set == 0) && (length(src.code) == 5) && (!src.l_setshort) && (src.code != "ERROR")) - src.l_code = src.code - src.l_set = 1 - else if((src.code == src.l_code) && (src.emagged == 0) && (src.l_set == 1)) - src.locked = 0 - src.overlays = null - overlays += image('icons/obj/storage.dmi', icon_opened) - src.code = null + if((istype(W, /obj/item/device/multitool)) && (open == 1) && (!l_hacking)) + user.show_message("Now attempting to reset internal memory, please hold.", 1) + l_hacking = 1 + if(do_after(usr, 100, target = src)) + if(prob(40)) + l_setshort = 1 + l_set = 0 + user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) + sleep(80) + l_setshort = 0 + l_hacking = 0 else - src.code = "ERROR" - else - if((href_list["type"] == "R") && (src.emagged == 0) && (!src.l_setshort)) - src.locked = 1 - src.overlays = null - src.code = null - src.close(usr) - else - src.code += text("[]", href_list["type"]) - if(length(src.code) > 5) - src.code = "ERROR" - src.add_fingerprint(usr) - for(var/mob/M in viewers(1, src.loc)) - if((M.client && M.machine == src)) - src.attack_self(M) - return + user.show_message("Unable to reset internal memory.", 1) + l_hacking = 0 + else + l_hacking = 0 + return + //At this point you have exhausted all the special things to do when locked + // ... but it's still locked. return + return ..() + +/obj/item/weapon/storage/secure/emag_act(user as mob, weapon as obj) + if(!emagged) + emagged = 1 + overlays += image('icons/obj/storage.dmi', icon_sparking) + sleep(6) + overlays = null + overlays += image('icons/obj/storage.dmi', icon_locking) + locked = 0 + if(istype(weapon, /obj/item/weapon/melee/energy/blade)) + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(loc, "sparks", 50, 1) + to_chat(user, "You slice through the lock on [src].") + else + to_chat(user, "You short out the lock on [src].") + return + + +/obj/item/weapon/storage/secure/MouseDrop(over_object, src_location, over_location) + if(locked) + add_fingerprint(usr) + to_chat(usr, "It's locked!") + return 0 + ..() + +/obj/item/weapon/storage/secure/attack_self(mob/user as mob) + user.set_machine(src) + var/dat = text("[]
\n\nLock Status: []", src, (locked ? "LOCKED" : "UNLOCKED")) + var/message = "Code" + if((l_set == 0) && (!emagged) && (!l_setshort)) + dat += text("

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
") + if(emagged) + dat += text("

\nLOCKING SYSTEM ERROR - 1701") + if(l_setshort) + dat += text("

\nALERT: MEMORY SYSTEM ERROR - 6040 201") + message = text("[]", code) + if(!locked) + message = "*****" + dat += {"


\n>[message]
\n + 1- + 2- + 3
\n + 4- + 5- + 6
\n + 7- + 8- + 9
\n + R- + 0- + E
\n
"} + user << browse(dat, "window=caselock;size=300x280") + +/obj/item/weapon/storage/secure/Topic(href, href_list) + ..() + if(usr.incapacitated() || (get_dist(src, usr) > 1)) + return + if(href_list["type"]) + if(href_list["type"] == "E") + if((l_set == 0) && (length(code) == 5) && (!l_setshort) && (code != "ERROR")) + l_code = code + l_set = 1 + else if((code == l_code) && (emagged == 0) && (l_set == 1)) + locked = 0 + overlays = null + overlays += image('icons/obj/storage.dmi', icon_opened) + code = null + else + code = "ERROR" + else + if((href_list["type"] == "R") && (emagged == 0) && (!l_setshort)) + locked = 1 + overlays = null + code = null + close(usr) + else + code += text("[]", href_list["type"]) + if(length(code) > 5) + code = "ERROR" + add_fingerprint(usr) + for(var/mob/M in viewers(1, loc)) + if((M.client && M.machine == src)) + attack_self(M) + return + return + /obj/item/weapon/storage/secure/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!locked) return ..() @@ -160,8 +161,10 @@ return 0 /obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg) + return /obj/item/weapon/storage/secure/hear_message(mob/living/M as mob, msg) + return // ----------------------------- // Secure Briefcase @@ -174,7 +177,7 @@ item_state = "sec-case" flags = CONDUCT hitsound = "swing_hit" - force = 8.0 + force = 8 throw_speed = 2 throw_range = 4 w_class = 4 @@ -182,36 +185,36 @@ max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - New() - ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/pen(src) +/obj/item/weapon/storage/secure/briefcase/New() + ..() + handle_item_insertion(new /obj/item/weapon/paper, 1) + handle_item_insertion(new /obj/item/weapon/pen, 1) - attack_hand(mob/user as mob) - if((src.loc == user) && (src.locked == 1)) - to_chat(usr, "\red [src] is locked and cannot be opened!") - else if((src.loc == user) && (!src.locked)) - playsound(src.loc, "rustle", 50, 1, -5) - if(user.s_active) - user.s_active.close(user) //Close and re-open - src.show_to(user) - else - ..() - for(var/mob/M in range(1)) - if(M.s_active == src) - src.close(M) - src.orient2hud(user) - src.add_fingerprint(user) - return +/obj/item/weapon/storage/secure/briefcase/attack_hand(mob/user as mob) + if((loc == user) && (locked == 1)) + to_chat(usr, "[src] is locked and cannot be opened!") + else if((loc == user) && !locked) + playsound(loc, "rustle", 50, 1, -5) + if(user.s_active) + user.s_active.close(user) //Close and re-open + show_to(user) + else + ..() + for(var/mob/M in range(1)) + if(M.s_active == src) + close(M) + orient2hud(user) + add_fingerprint(user) + return //Syndie variant of Secure Briefcase. Contains space cash, slightly more robust. /obj/item/weapon/storage/secure/briefcase/syndie - force = 15.0 + force = 15 /obj/item/weapon/storage/secure/briefcase/syndie/New() + ..() for(var/i = 0, i < storage_slots - 2, i++) - new /obj/item/weapon/spacecash/c1000(src) - return ..() + handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1) // ----------------------------- // Secure Safe @@ -224,30 +227,17 @@ icon_opened = "safe0" icon_locking = "safeb" icon_sparking = "safespark" - force = 8.0 + force = 8 w_class = 5 max_w_class = 8 - anchored = 1.0 + anchored = 1 density = 0 cant_hold = list("/obj/item/weapon/storage/secure/briefcase") - New() - ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/pen(src) - - attack_hand(mob/user as mob) - return attack_self(user) - -// Clown planet WMD storage -/obj/item/weapon/storage/secure/safe/clown - name="WMD Storage" - -/obj/item/weapon/storage/secure/safe/clown/New() - for(var/i=0;i<10;i++) - new /obj/item/weapon/reagent_containers/food/snacks/pie(src) - - -/obj/item/weapon/storage/secure/safe/HoS/New() +/obj/item/weapon/storage/secure/safe/New() ..() - //new /obj/item/weapon/storage/lockbox/clusterbang(src) This item is currently broken... and probably shouldnt exist to begin with (even though it's cool) \ No newline at end of file + handle_item_insertion(new /obj/item/weapon/paper, 1) + handle_item_insertion(new /obj/item/weapon/pen, 1) + +/obj/item/weapon/storage/secure/safe/attack_hand(mob/user as mob) + return attack_self(user) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index af2c59c4759..c9c9497cb71 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -143,7 +143,7 @@ air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/weapon/tank/jetpack/carbondioxide/examine(mob/user) - if(!..(0)) + if(!..(user, 0)) return if(air_contents.carbon_dioxide < 10) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index d498109b2dd..ae28bd61d17 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -78,9 +78,13 @@ /obj/item/weapon/tank/examine(mob/user) + if(!..(user, 0)) + return + var/obj/icon = src if(istype(loc, /obj/item/assembly)) icon = loc + if(!in_range(src, user)) if(icon == src) to_chat(user, "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.") @@ -102,7 +106,7 @@ else descriptive = "furiously hot" - to_chat(user, "\blue \The [bicon(icon)][src] feels [descriptive]") + to_chat(user, "\The [bicon(icon)][src] feels [descriptive]") return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 640539e745b..fce3cd376e2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -47,7 +47,6 @@ New() ..() - new /obj/item/weapon/book/manual/faxes(src) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/head/hopcap(src) new /obj/item/weapon/cartridge/hop(src) @@ -103,7 +102,6 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/weapon/book/manual/faxes(src) new /obj/item/weapon/cartridge/hos(src) new /obj/item/device/radio/headset/heads/hos/alt(src) new /obj/item/clothing/under/rank/head_of_security(src) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index f1eca747755..cc09bfb1f8a 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -18,20 +18,37 @@ return switch(choice) if("Underwear") - var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_list - if(new_undies) - H.underwear = new_undies + var/list/valid_underwear = list() + for(var/underwear in underwear_list) + var/datum/sprite_accessory/S = underwear_list[underwear] + if(!(H.species.name in S.species_allowed)) + continue + valid_underwear[underwear] = underwear_list[underwear] + var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear + if(new_underwear) + H.underwear = new_underwear if("Undershirt") - var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in undershirt_list + var/list/valid_undershirts = list() + for(var/undershirt in undershirt_list) + var/datum/sprite_accessory/S = undershirt_list[undershirt] + if(!(H.species.name in S.species_allowed)) + continue + valid_undershirts[undershirt] = undershirt_list[undershirt] + var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts if(new_undershirt) H.undershirt = new_undershirt if("Socks") - var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list + var/list/valid_sockstyles = list() + for(var/sockstyle in socks_list) + var/datum/sprite_accessory/S = socks_list[sockstyle] + if(!(H.species.name in S.species_allowed)) + continue + valid_sockstyles[sockstyle] = socks_list[sockstyle] + var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles if(new_socks) - H.socks= new_socks - + H.socks = new_socks add_fingerprint(H) H.update_body() \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 9bca4dc0a75..643728dd6cb 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -231,7 +231,6 @@ icon_state= "cultgirder" anchored = 1 density = 1 - layer = 2 var/health = 250 /obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 68589112080..49175dfa9e3 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -8,9 +8,7 @@ var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite /obj/structure/mopbucket/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) janitorial_equipment += src /obj/structure/mopbucket/full/New() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index cf5c97ed593..90122f2280b 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -12,7 +12,7 @@ /obj/structure/morgue name = "morgue" - desc = "Used to keep bodies in untill someone fetches them." + desc = "Used to keep bodies in until someone fetches them." icon = 'icons/obj/stationobjs.dmi' icon_state = "morgue1" density = 1 diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b27d3f6e4f8..bbbecf6695d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -420,8 +420,7 @@ H.lip_style = null //Washes off lipstick H.lip_color = initial(H.lip_color) H.regenerate_icons() - user.drowsyness -= rand(2,3) //Washing your face wakes you up if you're falling asleep - user.drowsyness = Clamp(user.drowsyness, 0, INFINITY) + user.AdjustDrowsy(-rand(2,3)) //Washing your face wakes you up if you're falling asleep else user.clean_blood() @@ -459,4 +458,3 @@ icon_state = "puddle-splash" ..() icon_state = "puddle" - diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 81e800a2b00..a4ca220e5dd 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -73,7 +73,6 @@ var/ert_request_answered = 0 return 0 /mob/dead/observer/proc/JoinResponseTeam() - if(!send_emergency_team) to_chat(src, "No emergency response team is currently being sent.") return 0 @@ -82,35 +81,23 @@ var/ert_request_answered = 0 to_chat(src, "You are jobbanned from the emergency reponse team!") return 0 - var/player_age_check = check_client_age(src.client, responseteam_age) + var/player_age_check = check_client_age(client, responseteam_age) if(player_age_check && config.use_age_restriction_for_antags) to_chat(src, "This role is not yet available to you. You need to wait another [player_age_check] days.") return 0 - if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + if(has_enabled_antagHUD == 1 && config.antag_hud_restricted) to_chat(src, "Upon using the antagHUD you forfeited the ability to join the round.") return 0 if(response_team_members.len > 6) to_chat(src, "The emergency response team is already full!") return 0 - - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "Response Team") - L.name = null - if(!src.client) - return - spawn(-1) - var/client/C = src.client - var/mob/living/carbon/human/new_commando = C.create_response_team(L.loc) - qdel(L) - new_commando.mind.key = src.key - new_commando.key = src.key - new_commando.update_icons() - return 1 + + return 1 /proc/trigger_armed_response_team(var/datum/response_team/response_team_type) - + response_team_members = list() active_team = response_team_type send_emergency_team = 1 @@ -118,24 +105,41 @@ var/ert_request_answered = 0 if(!ert_candidates.len) active_team.cannot_send_team() send_emergency_team = 0 - return - var/teamsize = 0 + return 0 + // Respawnable players get first dibs - for(var/mob/dead/observer/M in (ert_candidates & respawnable_list)) - teamsize += M.JoinResponseTeam() + for(var/mob/dead/observer/M in ert_candidates) + if((M in respawnable_list) && M.JoinResponseTeam()) + response_team_members |= M // If there's still open slots, non-respawnable players can fill them for(var/mob/dead/observer/M in (ert_candidates - respawnable_list)) - teamsize += M.JoinResponseTeam() - send_emergency_team = 0 - if (!teamsize) + if(M.JoinResponseTeam()) + response_team_members |= M + + if(!response_team_members.len) active_team.cannot_send_team() - return - active_team.announce_team() + send_emergency_team = 0 + return 0 -/client/proc/create_response_team(obj/spawn_location) + var/index = 1 + for(var/mob/M in response_team_members) + if(index > emergencyresponseteamspawn.len) + index = 1 + + var/client/C = M.client + var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) + new_commando.mind.key = M.key + new_commando.key = M.key + new_commando.update_icons() + index++ + + send_emergency_team = 0 + active_team.announce_team() + return 1 + +/client/proc/create_response_team(var/turf/spawn_location) var/mob/living/carbon/human/M = new(null) var/obj/item/organ/external/head/head_organ = M.get_organ("head") - response_team_members |= M var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female") @@ -157,33 +161,23 @@ var/ert_request_answered = 0 var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black - var/hair_style = "Bald" - var/facial_hair_style = "Shaved" - if(M.gender == MALE) - hair_style = pick(hair_styles_male_list) - facial_hair_style = pick(facial_hair_styles_list) - else - hair_style = pick(hair_styles_female_list) - if(prob(5)) - facial_hair_style = pick(facial_hair_styles_list) - head_organ.r_facial = hex2num(copytext(hair_c, 2, 4)) - head_organ.g_facial = hex2num(copytext(hair_c, 4, 6)) - head_organ.b_facial = hex2num(copytext(hair_c, 6, 8)) - head_organ.r_hair = hex2num(copytext(hair_c, 2, 4)) - head_organ.g_hair = hex2num(copytext(hair_c, 4, 6)) - head_organ.b_hair = hex2num(copytext(hair_c, 6, 8)) - var/eyes_red = hex2num(copytext(eye_c, 2, 4)) - var/eyes_green = hex2num(copytext(eye_c, 4, 6)) - var/eyes_blue = hex2num(copytext(eye_c, 6, 8)) - M.change_eye_color(eyes_red, eyes_green, eyes_blue) + head_organ.r_facial = color2R(hair_c) + head_organ.g_facial = color2G(hair_c) + head_organ.b_facial = color2B(hair_c) + head_organ.r_hair = color2R(hair_c) + head_organ.g_hair = color2G(hair_c) + head_organ.b_hair = color2B(hair_c) + M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c)) M.s_tone = skin_tone - head_organ.h_style = hair_style - head_organ.f_style = facial_hair_style + head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) + head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]" M.name = M.real_name M.age = rand(23,35) + M.regenerate_icons() + M.update_body() //Creates mind stuff. M.mind = new @@ -193,7 +187,7 @@ var/ert_request_answered = 0 M.mind.special_role = SPECIAL_ROLE_ERT if(!(M.mind in ticker.minds)) ticker.minds += M.mind //Adds them to regular mind list. - M.loc = spawn_location + M.forceMove(spawn_location) active_team.equip_officer(class, M) diff --git a/code/game/sound.dm b/code/game/sound.dm index fe5e361f16a..ed5f0d15b4c 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -40,7 +40,7 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, S) /mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, is_global, sound/S) - if(!src.client || ear_deaf > 0) + if(!src.client || !can_hear()) return if(!S) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index dcc05e5acfe..761e05f60c3 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -220,8 +220,13 @@ icon_state="catwalk[dirs]" /turf/simulated/floor/plating/airless/catwalk/attackby(obj/item/C, mob/user, params) + if(istype(C, /obj/item/stack/rods)) + return 1 + else if(istype(C, /obj/item/stack/tile)) + return 1 + if(..()) - return + return 1 if(!broken && isscrewdriver(C)) to_chat(user, "You unscrew the catwalk's rods.") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 45f0e42a2aa..d1fb0326466 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -3,7 +3,6 @@ desc = "A huge chunk of metal used to seperate rooms." icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" - var/mineral = "metal" var/rotting = 0 var/damage = 0 @@ -22,9 +21,11 @@ thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall - var/walltype = "metal" var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through. var/engraving, engraving_quality //engraving on the wall + + var/sheet_type = /obj/item/stack/sheet/metal + var/obj/item/stack/sheet/builtin_sheet = null canSmoothWith = list( /turf/simulated/wall, @@ -36,6 +37,10 @@ /turf/simulated/wall/r_wall/coated) smooth = SMOOTH_TRUE +/turf/simulated/wall/New() + ..() + builtin_sheet = new sheet_type + /turf/simulated/wall/BeforeChange() for(var/obj/effect/E in src) // such quality code @@ -43,8 +48,8 @@ qdel(E) . = ..() + //Appearance - /turf/simulated/wall/examine(mob/user) . = ..(user) @@ -117,46 +122,14 @@ if(radiated_temperature > max_temperature) take_damage(rand(10, 20) * (radiated_temperature / max_temperature)) -/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0) - if(istype(src,/turf/simulated/wall/r_wall)) - if(!devastated) - playsound(src, '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, 'sound/items/Welder.ogg', 100, 1) - new /obj/effect/decal/cleanable/blood(src) - new /obj/structure/cultgirder(src) - else - new /obj/effect/decal/cleanable/blood(src) - new /obj/effect/decal/remains/human(src) - +/turf/simulated/wall/proc/dismantle_wall(devastated = 0, explode = 0) + if(devastated) + devastate_wall() else - if(!devastated) - playsound(src, 'sound/items/Welder.ogg', 100, 1) - new /obj/structure/girder(src) - if(mineral == "metal") - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - else - var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]") - new M( src ) - new M( src ) - else - if(mineral == "metal") - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - else - var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]") - new M( src ) - new M( src ) - new /obj/item/stack/sheet/metal( src ) + playsound(src, 'sound/items/Welder.ogg', 100, 1) + var/newgirder = break_wall() + if(newgirder) //maybe we don't /want/ a girder! + transfer_fingerprints_to(newgirder) for(var/obj/O in src.contents) //Eject contents! if(istype(O,/obj/structure/sign/poster)) @@ -166,6 +139,16 @@ O.loc = src ChangeTurf(/turf/simulated/floor/plating) + +/turf/simulated/wall/proc/break_wall() + builtin_sheet.amount = 2 + builtin_sheet.loc = src + return (new /obj/structure/girder(src)) + +/turf/simulated/wall/proc/devastate_wall() + builtin_sheet.amount = 2 + builtin_sheet.loc = src + new /obj/item/stack/sheet/metal(src) /turf/simulated/wall/ex_act(severity) switch(severity) @@ -176,7 +159,7 @@ if(prob(50)) take_damage(rand(150, 250)) else - dismantle_wall(1,1) + dismantle_wall(1, 1) if(3.0) take_damage(rand(0, 250)) else @@ -216,8 +199,9 @@ O.mouse_opacity = 0 /turf/simulated/wall/proc/thermitemelt(mob/user as mob) - if(mineral == "diamond") + if(istype(sheet_type, /obj/item/stack/sheet/mineral/diamond)) return + var/obj/effect/overlay/O = new/obj/effect/overlay( src ) O.name = "Thermite" O.desc = "Looks hot." @@ -236,7 +220,6 @@ spawn(100) if(O) qdel(O) -// F.sd_LumReset() //TODO: ~Carn return //Interactions @@ -292,7 +275,8 @@ return //get the user's location - if(!istype(user.loc, /turf)) return //can't do this stuff whilst inside objects and such + if(!istype(user.loc, /turf)) + return //can't do this stuff whilst inside objects and such if(rotting) if(istype(W, /obj/item/weapon/weldingtool) ) @@ -370,7 +354,7 @@ to_chat(user, "You begin slicing through the outer plating.") playsound(src, 'sound/items/Welder.ogg', 100, 1) - if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) + if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src)) to_chat(user, "You remove the outer plating.") dismantle_wall() visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart.") @@ -380,7 +364,7 @@ to_chat(user, "You begin to drill though the wall.") - if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) + if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src)) to_chat(user, "Your drill tears though the last of the reinforced plating.") dismantle_wall() visible_message("[user] drills through \the [src]!","You hear the grinding of metal.") @@ -389,7 +373,7 @@ to_chat(user, "You begin to disintegrates the wall.") - if(do_after(user, mineral == "diamond" ? 60 : 30, target = src)) + if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 60 : 30, target = src)) to_chat(user, "Your jackhammer disintegrate the reinforced plating.") dismantle_wall() visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.") @@ -401,7 +385,7 @@ to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart.") playsound(src, "sparks", 50, 1) - if(do_after(user, mineral == "diamond" ? 140 : 70, target = src)) + if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 : 70, target = src)) EB.spark_system.start() playsound(src, "sparks", 50, 1) playsound(src, 'sound/weapons/blade1.ogg', 50, 1) diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index f0d5b52843f..914cb8973c8 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -12,10 +12,7 @@ desc = "A wall with gold plating. Swag!" icon = 'icons/turf/walls/gold_wall.dmi' icon_state = "gold" - walltype = "gold" - mineral = "gold" - //var/electro = 1 - //var/shocked = null + sheet_type = /obj/item/stack/sheet/mineral/gold explosion_block = 0 //gold is a soft metal you dingus. canSmoothWith = list(/turf/simulated/wall/mineral/gold, /obj/structure/falsewall/gold) @@ -24,10 +21,7 @@ desc = "A wall with silver plating. Shiny!" icon = 'icons/turf/walls/silver_wall.dmi' icon_state = "silver" - walltype = "silver" - mineral = "silver" - //var/electro = 0.75 - //var/shocked = null + sheet_type = /obj/item/stack/sheet/mineral/silver canSmoothWith = list(/turf/simulated/wall/mineral/silver, /obj/structure/falsewall/silver) /turf/simulated/wall/mineral/diamond @@ -35,8 +29,7 @@ desc = "A wall with diamond plating. You monster." icon = 'icons/turf/walls/diamond_wall.dmi' icon_state = "diamond" - walltype = "diamond" - mineral = "diamond" + sheet_type = /obj/item/stack/sheet/mineral/diamond explosion_block = 3 canSmoothWith = list(/turf/simulated/wall/mineral/diamond, /obj/structure/falsewall/diamond) @@ -45,8 +38,7 @@ desc = "A wall with bananium plating. Honk!" icon = 'icons/turf/walls/bananium_wall.dmi' icon_state = "bananium" - walltype = "bananium" - mineral = "bananium" + sheet_type = /obj/item/stack/sheet/mineral/bananium canSmoothWith = list(/turf/simulated/wall/mineral/bananium, /obj/structure/falsewall/bananium) /turf/simulated/wall/mineral/sandstone @@ -54,8 +46,7 @@ desc = "A wall with sandstone plating." icon = 'icons/turf/walls/sandstone_wall.dmi' icon_state = "sandstone" - walltype = "sandstone" - mineral = "sandstone" + sheet_type = /obj/item/stack/sheet/mineral/sandstone explosion_block = 0 canSmoothWith = list(/turf/simulated/wall/mineral/sandstone, /obj/structure/falsewall/sandstone) @@ -64,8 +55,7 @@ desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium" - walltype = "uranium" - mineral = "uranium" + sheet_type = /obj/item/stack/sheet/mineral/uranium canSmoothWith = list(/turf/simulated/wall/mineral/uranium, /obj/structure/falsewall/uranium) /turf/simulated/wall/mineral/uranium/proc/radiate() @@ -98,15 +88,14 @@ desc = "A wall with plasma plating. This is definately a bad idea." icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" - walltype = "plasma" - mineral = "plasma" + sheet_type = /obj/item/stack/sheet/mineral/plasma thermal_conductivity = 0.04 canSmoothWith = list(/turf/simulated/wall/mineral/plasma, /obj/structure/falsewall/plasma) /turf/simulated/wall/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob) if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) + log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])") ignite(is_hot(W)) return ..() @@ -132,29 +121,12 @@ PlasmaBurn(500) ..() -/* -/turf/simulated/wall/mineral/proc/shock() - if(electrocute_mob(user, C, src)) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return 1 - else - return 0 - -/turf/simulated/wall/mineral/proc/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if((mineral == "gold") || (mineral == "silver")) - if(shocked) - shock() -*/ - /turf/simulated/wall/mineral/alien name = "alien wall" desc = "A strange-looking alien wall." icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" - walltype = "alien" - mineral = "alien" + sheet_type = null canSmoothWith = list(/turf/simulated/wall/mineral/alien, /obj/structure/falsewall/alien) /turf/simulated/wall/mineral/wood @@ -162,8 +134,7 @@ desc = "A wall with wooden plating. Stiff." icon = 'icons/turf/walls/wood_wall.dmi' icon_state = "wood" - walltype = "wood" - mineral = "wood" + sheet_type = /obj/item/stack/sheet/wood hardness = 70 explosion_block = 0 canSmoothWith = list(/turf/simulated/wall/mineral/wood, /obj/structure/falsewall/wood) @@ -173,8 +144,7 @@ desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' icon_state = "iron" - walltype = "iron" - mineral = "rods" + sheet_type = /obj/item/stack/rods canSmoothWith = list(/turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron) /turf/simulated/wall/mineral/abductor @@ -182,7 +152,6 @@ desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' icon_state = "abductor" - walltype = "abductor" - mineral = "abductor" + sheet_type = /obj/item/stack/sheet/mineral/abductor explosion_block = 3 canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor) \ No newline at end of file diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 576ac6f993e..def35564327 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -3,25 +3,31 @@ desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick" icon = 'icons/turf/walls/cult_wall.dmi' icon_state = "cult" - walltype = "cult" + builtin_sheet = null canSmoothWith = null /turf/simulated/wall/cult/narsie_act() return + +/turf/simulated/wall/cult/break_wall() + new /obj/effect/decal/cleanable/blood(src) + return (new /obj/structure/cultgirder(src)) + +/turf/simulated/wall/cult/devastate_wall() + new /obj/effect/decal/cleanable/blood(src) + new /obj/effect/decal/remains/human(src) /turf/simulated/wall/rust name = "rusted wall" desc = "A rusted metal wall." icon = 'icons/turf/walls/rusty_wall.dmi' icon_state = "arust" - walltype = "arust" /turf/simulated/wall/r_wall/rust name = "rusted reinforced wall" desc = "A huge chunk of rusted reinforced metal." icon = 'icons/turf/walls/rusty_reinforced_wall.dmi' icon_state = "rrust" - walltype = "rrust" /turf/simulated/wall/r_wall/coated //Coated for heat resistance name = "coated reinforced wall" diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 7c6c750c70e..1dbda894c52 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -9,7 +9,7 @@ damage_cap = 200 max_temperature = 6000 hardness = 10 - walltype = "rwall" + sheet_type = /obj/item/stack/sheet/plasteel var/d_state = 0 var/can_be_reinforced = 1 diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 2c896f3dbdf..f209e652b38 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -32,7 +32,7 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return - if(handle_spam_prevention(msg, MUTE_OOC)) + if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) to_chat(src, "Advertising other servers is not allowed.") @@ -168,7 +168,7 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use LOOC (muted).") return - if(handle_spam_prevention(msg,MUTE_OOC)) + if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) to_chat(src, "Advertising other servers is not allowed.") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 41ffbcb232e..fd4a26e242f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,6 +1,5 @@ var/global/BSACooldown = 0 -var/global/floorIsLava = 0 var/global/nologevent = 0 //////////////////////////////// diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 0413d67bf58..1a6d8b505a2 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1597,11 +1597,11 @@ to_chat(usr, "This can only be used on instances of type /mob/living") return - if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") + if(alert(owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") return if(BSACooldown) - to_chat(src.owner, "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!") + to_chat(owner, "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!") return BSACooldown = 1 @@ -1609,28 +1609,23 @@ BSACooldown = 0 to_chat(M, "You've been hit by bluespace artillery!") - log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [key_name(src.owner)]") - message_admins("[key_name_admin(M)] has been hit by Bluespace Artillery fired by [key_name_admin(src.owner)]") - - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - spawn(20) - qdel(S) + log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [key_name(owner)]") + message_admins("[key_name_admin(M)] has been hit by Bluespace Artillery fired by [key_name_admin(owner)]") var/turf/simulated/floor/T = get_turf(M) if(istype(T)) - if(prob(80)) T.break_tile_to_plating() - else T.break_tile() + if(prob(80)) + T.break_tile_to_plating() + else + T.break_tile() - if(M.health == 1) + if(M.health <= 1) M.gib() else - M.adjustBruteLoss( min( 99 , (M.health - 1) ) ) + M.adjustBruteLoss(min(99,(M.health - 1))) M.Stun(20) M.Weaken(20) - M.stuttering = 20 + M.Stuttering(20) else if(href_list["CentcommReply"]) if(!check_rights(R_ADMIN)) @@ -2500,18 +2495,20 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","LO") message_admins("[key_name_admin(usr)] has broke a lot of lights", 1) - lightsout(1,2) + var/datum/event/electrical_storm/E = new /datum/event/electrical_storm + E.lightsoutAmount = 2 if("blackout") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","BO") message_admins("[key_name_admin(usr)] broke all lights", 1) - lightsout(0,0) + for(var/obj/machinery/light/L in machines) + L.broken() if("whiteout") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","WO") - for(var/obj/machinery/light/L in world) - L.fix() message_admins("[key_name_admin(usr)] fixed all lights", 1) + for(var/obj/machinery/light/L in machines) + L.fix() if("floorlava") feedback_inc("admin_secrets_fun_used", 1) feedback_add_details("admin_secrets_fun_used", "LF") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index d78ef5dcde3..c17671995ff 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -24,7 +24,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(!msg) return - if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN)) return msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index d711a3f5910..63241ce43c5 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -99,7 +99,7 @@ adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return - if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN)) return //clean the message if it's not sent by a high-rank admin diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 227188b2209..862eed1b986 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -92,7 +92,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") + to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/callproc_datum(var/A as null|area|mob|obj|turf) @@ -122,7 +122,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that spawn() var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") + to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -934,11 +934,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/obj/item/briefcase_item in sec_briefcase) qdel(briefcase_item) for(var/i=3, i>0, i--) - sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 - sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow - sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_box/a357 - sec_briefcase.contents += new /obj/item/weapon/grenade/plastic/c4 + sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1) + sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1) // briefcase must be unlocked by setting the code. M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M) diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index fb93cd3512d..920b24297ad 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -36,7 +36,7 @@ var/global/list/frozen_mob_list = list() anchored = 1 frozen = AO admin_prev_sleeping = sleeping - sleeping += 20000 + AdjustSleeping(20000) if(!(src in frozen_mob_list)) frozen_mob_list += src @@ -49,7 +49,7 @@ var/global/list/frozen_mob_list = list() anchored = 0 overlays -= frozen frozen = null - sleeping = admin_prev_sleeping + SetSleeping(admin_prev_sleeping) admin_prev_sleeping = null if(src in frozen_mob_list) frozen_mob_list -= src diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index b8ab9c23853..e9648119f42 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -269,8 +269,12 @@ client/proc/one_click_antag() return 1 /datum/admins/proc/makeAliens() - alien_infestation(3) - return 1 + var/datum/event/alien_infestation/E = new /datum/event/alien_infestation + E.spawncount = 3 + // TODO The fact we have to do this rather than just have events start + // when we ask them to, is bad. + E.processing = TRUE + return TRUE /* /datum/admins/proc/makeSpaceNinja() diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 03365b38385..486b95f5a1b 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -9,7 +9,7 @@ if(usr.client.prefs.muted & MUTE_PRAY) to_chat(usr, "\red You cannot pray (muted).") return - if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) + if(client.handle_spam_prevention(msg, MUTE_PRAY, OOC_COOLDOWN)) return var/image/cross = image('icons/obj/storage.dmi',"bible") diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index d886fa3f4be..3c68c7142f4 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -16,9 +16,10 @@ /obj/machinery/arcade/New() ..() - var/choice = pick(subtypesof(/obj/machinery/arcade)) - new choice(loc) - qdel(src) + if(type == /obj/machinery/arcade) //if you spawn the base-type, it will replace itself with a random subtype for randomness + var/choice = pick(subtypesof(/obj/machinery/arcade)) + new choice(loc) + qdel(src) /obj/machinery/arcade/examine(mob/user) ..(user) @@ -76,7 +77,7 @@ if(pay_with_cash(C, user)) tokens += 1 return - if(panel_open&& component_parts && istype(O, /obj/item/weapon/crowbar)) + if(panel_open && component_parts && istype(O, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(O) /obj/machinery/arcade/update_icon() diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index c1cbd07daee..8f2adef5a1b 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -4,8 +4,9 @@ //////////////// var/datum/admins/holder = null - var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. - var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent. + var/last_message = "" //contains the last message sent by this client - used to protect against copy-paste spamming. + var/last_message_count = 0 //contains a number of how many times a message identical to last_message was sent. + var/last_message_time = 0 //holds the last time (based on world.time) a message was sent ///////// //OTHER// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 7a668e375fc..17c454bb7e2 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -233,19 +233,25 @@ return 0 return 1 -/client/proc/handle_spam_prevention(var/message, var/mute_type) - if(config.automute_on && !holder && src.last_message == message) - src.last_message_count++ - if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) - to_chat(src, "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") - cmd_admin_mute(src.mob, mute_type, 1) +/client/proc/handle_spam_prevention(var/message, var/mute_type, var/throttle = 0) + if(throttle) + if((last_message_time + throttle > world.time) && !check_rights(R_ADMIN, 0)) + var/wait_time = round(((last_message_time + throttle) - world.time) / 10, 1) + to_chat(src, "You are sending messages to quickly. Please wait [wait_time] [wait_time == 1 ? "second" : "seconds"] before sending another message.") + return 1 + last_message_time = world.time + if(config.automute_on && !check_rights(R_ADMIN, 0) && last_message == message) + last_message_count++ + if(last_message_count >= SPAM_TRIGGER_AUTOMUTE) + to_chat(src, "You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") + cmd_admin_mute(mob, mute_type, 1) return 1 - if(src.last_message_count >= SPAM_TRIGGER_WARNING) - to_chat(src, "\red You are nearing the spam filter limit for identical messages.") + if(last_message_count >= SPAM_TRIGGER_WARNING) + to_chat(src, "You are nearing the spam filter limit for identical messages.") return 0 else last_message = message - src.last_message_count = 0 + last_message_count = 0 return 0 //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index c07c73057c7..81cb8ffe59f 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -109,18 +109,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/r_headacc = 0 //Head accessory colour var/g_headacc = 0 //Head accessory colour var/b_headacc = 0 //Head accessory colour - var/m_style = "None" //Marking style - var/r_markings = 0 //Marking colour - var/g_markings = 0 //Marking colour - var/b_markings = 0 //Marking colour + var/list/m_styles = list( + "head" = "None", + "body" = "None", + "tail" = "None" + ) //Marking styles. + var/list/m_colours = list( + "head" = "#000000", + "body" = "#000000", + "tail" = "#000000" + ) //Marking colours. var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color var/b_hair = 0 //Hair color - var/f_style = "Shaved" //Face hair type - var/r_facial = 0 //Face hair color - var/g_facial = 0 //Face hair color - var/b_facial = 0 //Face hair color + var/r_hair_sec = 0 //Secondary hair color + var/g_hair_sec = 0 //Secondary hair color + var/b_hair_sec = 0 //Secondary hair color + var/f_style = "Shaved" //Facial hair type + var/r_facial = 0 //Facial hair color + var/g_facial = 0 //Facial hair color + var/b_facial = 0 //Facial hair color + var/r_facial_sec = 0 //Secondary facial hair color + var/g_facial_sec = 0 //Secondary facial hair color + var/b_facial_sec = 0 //Secondary facial hair color var/s_tone = 0 //Skin tone var/r_skin = 0 //Skin color var/g_skin = 0 //Skin color @@ -128,6 +140,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color + var/alt_head = "None" //Alt head style. var/species = "Human" var/language = "None" //Secondary language @@ -285,18 +298,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "[ha_style] " dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
" - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings. + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + dat += "Head Markings: " + dat += "[m_styles["head"]]" + dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]
" + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos. dat += "Body Markings: " - dat += "[m_style]" - dat += "Color [color_square(r_markings, g_markings, b_markings)]
" + dat += "[m_styles["body"]]" + dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]
" + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + dat += "Tail Markings: " + dat += "[m_styles["tail"]]" + dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]
" dat += "Hair: " dat += "[h_style]" - dat += "Color [color_square(r_hair, g_hair, b_hair)]
" + dat += "Color [color_square(r_hair, g_hair, b_hair)]" + var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style] + if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour) + dat += " Color #2 [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]" + dat += "
" dat += "Facial Hair: " dat += "[f_style ? "[f_style]" : "Shaved"]" - dat += "Color [color_square(r_facial, g_facial, b_facial)]
" + dat += "Color [color_square(r_facial, g_facial, b_facial)]" + var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style] + if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour) + dat += " Color #2 [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]" + dat += "
" + if(species != "Machine") dat += "Eyes: " @@ -319,6 +349,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Character Records
" dat += "

Limbs

" + if(species in list("Unathi")) //Species with alt heads. + dat += "Alternate Head: " + dat += "[alt_head]
" dat += "Limbs and Parts: Adjust
" if(species != "Slime People" && species != "Machine") dat += "Internal Organs: Adjust
" @@ -1102,6 +1135,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts switch(href_list["task"]) if("random") + var/datum/robolimb/robohead + if(species == "Machine") + var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" + robohead = all_robolimbs[head_model] switch(href_list["preference"]) if("name") real_name = random_name(gender,species) @@ -1112,23 +1149,59 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts r_hair = rand(0,255) g_hair = rand(0,255) b_hair = rand(0,255) + if("secondary_hair") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + r_hair_sec = rand(0,255) + g_hair_sec = rand(0,255) + b_hair_sec = rand(0,255) if("h_style") - h_style = random_hair_style(gender, species) + h_style = random_hair_style(gender, species, robohead) if("facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) r_facial = rand(0,255) g_facial = rand(0,255) b_facial = rand(0,255) + if("secondary_facial") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + r_facial_sec = rand(0,255) + g_facial_sec = rand(0,255) + b_facial_sec = rand(0,255) if("f_style") - f_style = random_facial_hair_style(gender, species) + f_style = random_facial_hair_style(gender, species, robohead) + if("headaccessory") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + r_headacc = rand(0,255) + g_headacc = rand(0,255) + b_headacc = rand(0,255) + if("ha_style") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + ha_style = random_head_accessory(species) + if("m_style_head") + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) + if("m_head_colour") + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255)) + if("m_style_body") + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings. + m_styles["body"] = random_marking_style("body", species) + if("m_body_colour") + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings. + m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255)) + if("m_style_tail") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) + if("m_tail_colour") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255)) if("underwear") - underwear = random_underwear(gender) + underwear = random_underwear(gender, species) ShowChoices(user) if("undershirt") - undershirt = random_undershirt(gender) + undershirt = random_undershirt(gender, species) ShowChoices(user) if("socks") - socks = random_socks(gender) + socks = random_socks(gender, species) ShowChoices(user) if("eyes") r_eyes = rand(0,255) @@ -1153,7 +1226,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("name") var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null if(!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = reject_bad_name(raw_name) + var/new_name = reject_bad_name(raw_name, 1) if(new_name) real_name = new_name else @@ -1164,7 +1237,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(new_age) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") var/prev_species = species // var/whitelisted = 0 @@ -1182,43 +1254,41 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts species = input("Please select a species", "Character Generation", null) in new_species if(prev_species != species) + var/datum/robolimb/robohead + if(species == "Machine") + var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" + robohead = all_robolimbs[head_model] //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue - - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) - else - //this shouldn't happen - h_style = hair_styles_list["Bald"] + h_style = random_hair_style(gender, species, robohead) //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue + f_style = random_facial_hair_style(gender, species, robohead) - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + ha_style = random_head_accessory(species) else - //this shouldn't happen - f_style = facial_hair_styles_list["Shaved"] + ha_style = "None" // No Vulp ears on Unathi + r_headacc = 0 + g_headacc = 0 + b_headacc = 0 + + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) + else + m_styles["head"] = "None" + m_colours["head"] = "#000000" + + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos. + m_styles["body"] = random_marking_style("body", species) + else + m_styles["body"] = "None" + m_colours["body"] = "#000000" + + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) + else + m_styles["tail"] = "None" + m_colours["tail"] = "#000000" // Don't wear another species' underwear! var/datum/sprite_accessory/S = underwear_list[underwear] @@ -1233,20 +1303,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(!S || !(species in S.species_allowed)) socks = random_socks(gender, species) - //reset hair colour and skin colour - r_hair = 0//hex2num(copytext(new_hair, 2, 4)) - g_hair = 0//hex2num(copytext(new_hair, 4, 6)) - b_hair = 0//hex2num(copytext(new_hair, 6, 8)) - - s_tone = 0 + //reset skin tone and colour + if(species in list("Human", "Drask", "Vox")) + random_skin_tone(species) + else + s_tone = 0 if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine"))) r_skin = 0 g_skin = 0 b_skin = 0 - ha_style = "None" // No Vulp ears on Unathi - m_style = "None" // No Unathi markings on Tajara + alt_head = "None" //No alt heads on species that don't have them. body_accessory = null //no vulptail on humans damnit @@ -1293,39 +1361,44 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/input = "Choose your character's hair colour:" var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) + r_hair = color2R(new_hair) + g_hair = color2G(new_hair) + b_hair = color2B(new_hair) + + if("secondary_hair") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style.secondary_theme && !hair_style.no_sec_colour) + var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null + if(new_hair) + r_hair_sec = color2R(new_hair) + g_hair_sec = color2G(new_hair) + b_hair_sec = color2B(new_hair) if("h_style") var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() - if(S.name == "Bald") - valid_hairstyles[hairstyle] = S - if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" - else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(species in S.species_allowed) - if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head - //and said head is in the hair style's allowed models list... - valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle. - continue - else - if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles). - continue - else if(!robohead.is_monitor && ("Human" in S.species_allowed)) - valid_hairstyles[hairstyle] = S - continue - else - if(!(species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = S + if(hairstyle == "Bald") //Just in case. + valid_hairstyles += hairstyle + continue + if(species == "Machine") //Species that can use prosthetic heads. + var/head_model + if(!rlimb_data["head"]) //Handle situations where the head is default. + head_model = "Morpheus Cyberkinetics" + else + head_model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[head_model] + if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_hairstyles += hairstyle //Give them their hairstyles if they do. + else + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */ + valid_hairstyles += hairstyle + else //If the user is not a species who can have robotic heads, use the default handling. + if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. + valid_hairstyles += hairstyle var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles if(new_h_style) @@ -1336,9 +1409,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/input = "Choose the colour of your your character's head accessory:" var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null if(new_head_accessory) - r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) - g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) - b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) + r_headacc = color2R(new_head_accessory) + g_headacc = color2G(new_head_accessory) + b_headacc = color2B(new_head_accessory) if("ha_style") if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories. @@ -1348,47 +1421,130 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(!(species in H.species_allowed)) continue - valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] + valid_head_accessory_styles += head_accessory_style var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles if(new_head_accessory_style) ha_style = new_head_accessory_style - if("markings") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. - var/input = "Choose the colour of your your character's markings:" - var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null - if(new_markings) - r_markings = hex2num(copytext(new_markings, 2, 4)) - g_markings = hex2num(copytext(new_markings, 4, 6)) - b_markings = hex2num(copytext(new_markings, 6, 8)) - - if("m_style") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. - var/list/valid_markings = list() - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if(!(species in M.species_allowed)) + if("alt_head") + if(organ_data["head"] == "cyborg") + return + if(species in list("Unathi")) //Species with alt heads. + var/list/valid_alt_heads = list() + valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option + for(var/alternate_head in alt_heads_list) + var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head] + if(!(species in head.species_allowed)) continue + valid_alt_heads += alternate_head + + var/new_alt_head = input(user, "Choose your character's alternate head style:", "Character Preference") as null|anything in valid_alt_heads + if(new_alt_head) + alt_head = new_alt_head + if(m_styles["head"]) + var/head_marking = m_styles["head"] + var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking] + if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(alt_head in head_marking_style.heads_allowed))) + m_styles["head"] = "None" + + if("m_style_head") + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[markingstyle] + if(!(species in M.species_allowed)) + continue + if(M.marking_location != "head") + continue + if(alt_head && alt_head != "None") + if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed)) + continue + else + if(M.heads_allowed && !("All" in M.heads_allowed)) + continue + if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() + var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" + head_model = "Morpheus Cyberkinetics" else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] + head_model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[head_model] if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings. continue else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip. if(!(robohead.company in M.models_allowed)) continue - valid_markings[markingstyle] = marking_styles_list[markingstyle] + valid_markings += markingstyle - var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings + var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", m_styles["head"]) as null|anything in valid_markings if(new_marking_style) - m_style = new_marking_style + m_styles["head"] = new_marking_style + + if("m_head_colour") + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings. + var/input = "Choose the colour of your your character's head markings:" + var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null + if(new_markings) + m_colours["head"] = new_markings + + if("m_style_body") + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if(!(species in M.species_allowed)) + continue + if(M.marking_location != "body") + continue + + valid_markings += markingstyle + + var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", m_styles["body"]) as null|anything in valid_markings + if(new_marking_style) + m_styles["body"] = new_marking_style + + if("m_body_colour") + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos. + var/input = "Choose the colour of your your character's body markings:" + var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null + if(new_markings) + m_colours["body"] = new_markings + + if("m_style_tail") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle] + if(M.marking_location != "tail") + continue + if(!(species in M.species_allowed)) + continue + if(!body_accessory) + if(M.tails_allowed) + continue + else + if(!M.tails_allowed || !(body_accessory in M.tails_allowed)) + continue + + valid_markings += markingstyle + + var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", m_styles["tail"]) as null|anything in valid_markings + if(new_marking_style) + m_styles["tail"] = new_marking_style + + if("m_tail_colour") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + var/input = "Choose the colour of your your character's tail markings:" + var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null + if(new_markings) + m_colours["tail"] = new_markings if("body_accessory") var/list/possible_body_accessories = list() @@ -1405,74 +1561,90 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories if(new_body_accessory) + m_styles["tail"] = "None" body_accessory = (new_body_accessory == "None") ? null : new_body_accessory if("facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) + r_facial = color2R(new_facial) + g_facial = color2G(new_facial) + b_facial = color2B(new_facial) + + if("secondary_facial") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) + var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null + if(new_facial) + r_facial_sec = color2R(new_facial) + g_facial_sec = color2G(new_facial) + b_facial_sec = color2B(new_facial) if("f_style") - var/list/valid_facialhairstyles = list() + var/list/valid_facial_hairstyles = list() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(S.name == "Shaved") - valid_facialhairstyles[facialhairstyle] = S + + if(facialhairstyle == "Shaved") //Just in case. + valid_facial_hairstyles += facialhairstyle + continue if(gender == MALE && S.gender == FEMALE) continue if(gender == FEMALE && S.gender == MALE) continue if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() + var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" + head_model = "Morpheus Cyberkinetics" else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(species in S.species_allowed) - if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it. - valid_facialhairstyles[facialhairstyle] = S - continue + head_model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[head_model] + if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do. else - if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles). - continue - else if(!robohead.is_monitor && ("Human" in S.species_allowed)) - valid_facialhairstyles[facialhairstyle] = S - continue - else - if(!(species in S.species_allowed)) - continue + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */ + valid_facial_hairstyles += facialhairstyle + else //If the user is not a species who can have robotic heads, use the default handling. + if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. + valid_facial_hairstyles += facialhairstyle - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles if(new_f_style) f_style = new_f_style if("underwear") - var/list/underwear_options - if(gender == MALE) - underwear_options = underwear_m - else - underwear_options = underwear_f - - var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options + var/list/valid_underwear = list() + for(var/underwear in underwear_list) + var/datum/sprite_accessory/S = underwear_list[underwear] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + valid_underwear[underwear] = underwear_list[underwear] + var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear + ShowChoices(user) if(new_underwear) underwear = new_underwear - ShowChoices(user) - if("undershirt") - var/new_undershirt - if(gender == MALE) - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m - else - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + var/list/valid_undershirts = list() + for(var/undershirt in undershirt_list) + var/datum/sprite_accessory/S = undershirt_list[undershirt] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + valid_undershirts[undershirt] = undershirt_list[undershirt] + var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts + ShowChoices(user) if(new_undershirt) undershirt = new_undershirt - ShowChoices(user) if("socks") var/list/valid_sockstyles = list() @@ -1493,9 +1665,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) + r_eyes = color2R(new_eyes) + g_eyes = color2G(new_eyes) + b_eyes = color2B(new_eyes) if("s_tone") if(species == "Human" || species == "Drask") @@ -1511,9 +1683,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null if(new_skin) - r_skin = hex2num(copytext(new_skin, 2, 4)) - g_skin = hex2num(copytext(new_skin, 4, 6)) - b_skin = hex2num(copytext(new_skin, 6, 8)) + r_skin = color2R(new_skin) + g_skin = color2G(new_skin) + b_skin = color2B(new_skin) if("ooccolor") @@ -1599,8 +1771,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts switch(new_state) if("Normal") if(limb == "head") - m_style = "None" - h_style = random_hair_style(gender, species) + m_styles["head"] = "None" + h_style = hair_styles_list["Bald"] f_style = facial_hair_styles_list["Shaved"] organ_data[limb] = null rlimb_data[limb] = null @@ -1645,11 +1817,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models if(subchoice) choice = subchoice - if(limb == "head") - ha_style = "None" - h_style = hair_styles_list["Bald"] - f_style = facial_hair_styles_list["Shaved"] - m_style = "None" + if(limb in list("head", "chest", "groin")) + if(species != "Machine") + return + if(limb == "head") + ha_style = "None" + alt_head = null + h_style = hair_styles_list["Bald"] + f_style = facial_hair_styles_list["Shaved"] + m_styles["head"] = "None" rlimb_data[limb] = choice organ_data[limb] = "cyborg" if(second_limb) @@ -1660,7 +1836,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else rlimb_data[second_limb] = choice organ_data[second_limb] = "cyborg" - if("organs") var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") if(!organ_name) return @@ -1852,16 +2027,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //Head-specific var/obj/item/organ/external/head/H = character.get_organ("head") + H.r_hair = r_hair H.g_hair = g_hair H.b_hair = b_hair + H.r_hair_sec = r_hair_sec + H.g_hair_sec = g_hair_sec + H.b_hair_sec = b_hair_sec + H.r_facial = r_facial H.g_facial = g_facial H.b_facial = b_facial + H.r_facial_sec = r_facial_sec + H.g_facial_sec = g_facial_sec + H.b_facial_sec = b_facial_sec + H.h_style = h_style H.f_style = f_style + + H.alt_head = alt_head //End of head-specific. character.r_skin = r_skin @@ -1951,10 +2137,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts H.b_headacc = b_headacc H.ha_style = ha_style if(character.species.bodyflags & HAS_MARKINGS) - character.r_markings = r_markings - character.g_markings = g_markings - character.b_markings = b_markings - character.m_style = m_style + character.m_colours = m_colours + character.m_styles = m_styles if(body_accessory) character.body_accessory = body_accessory_by_name["[body_accessory]"] diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 826f908c928..581daf222d3 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -113,23 +113,28 @@ hair_red, hair_green, hair_blue, + secondary_hair_red, + secondary_hair_green, + secondary_hair_blue, facial_red, facial_green, facial_blue, + secondary_facial_red, + secondary_facial_green, + secondary_facial_blue, skin_tone, skin_red, skin_green, skin_blue, - markings_red, - markings_green, - markings_blue, + marking_colours, head_accessory_red, head_accessory_green, head_accessory_blue, hair_style_name, facial_style_name, - marking_style_name, + marking_styles, head_accessory_style_name, + alt_head_name, eyes_red, eyes_green, eyes_blue, @@ -184,52 +189,57 @@ r_hair = text2num(query.item[8]) g_hair = text2num(query.item[9]) b_hair = text2num(query.item[10]) - r_facial = text2num(query.item[11]) - g_facial = text2num(query.item[12]) - b_facial = text2num(query.item[13]) - s_tone = text2num(query.item[14]) - r_skin = text2num(query.item[15]) - g_skin = text2num(query.item[16]) - b_skin = text2num(query.item[17]) - r_markings = text2num(query.item[18]) - g_markings = text2num(query.item[19]) - b_markings = text2num(query.item[20]) - r_headacc = text2num(query.item[21]) - g_headacc = text2num(query.item[22]) - b_headacc = text2num(query.item[23]) - h_style = query.item[24] - f_style = query.item[25] - m_style = query.item[26] - ha_style = query.item[27] - r_eyes = text2num(query.item[28]) - g_eyes = text2num(query.item[29]) - b_eyes = text2num(query.item[30]) - underwear = query.item[31] - undershirt = query.item[32] - backbag = text2num(query.item[33]) - b_type = query.item[34] + r_hair_sec = text2num(query.item[11]) + g_hair_sec = text2num(query.item[12]) + b_hair_sec = text2num(query.item[13]) + r_facial = text2num(query.item[14]) + g_facial = text2num(query.item[15]) + b_facial = text2num(query.item[16]) + r_facial_sec = text2num(query.item[17]) + g_facial_sec = text2num(query.item[18]) + b_facial_sec = text2num(query.item[19]) + s_tone = text2num(query.item[20]) + r_skin = text2num(query.item[21]) + g_skin = text2num(query.item[22]) + b_skin = text2num(query.item[23]) + m_colours = params2list(query.item[24]) + r_headacc = text2num(query.item[25]) + g_headacc = text2num(query.item[26]) + b_headacc = text2num(query.item[27]) + h_style = query.item[28] + f_style = query.item[29] + m_styles = params2list(query.item[30]) + ha_style = query.item[31] + alt_head = query.item[32] + r_eyes = text2num(query.item[33]) + g_eyes = text2num(query.item[34]) + b_eyes = text2num(query.item[35]) + underwear = query.item[36] + undershirt = query.item[37] + backbag = text2num(query.item[38]) + b_type = query.item[39] //Jobs - alternate_option = text2num(query.item[35]) - job_support_high = text2num(query.item[36]) - job_support_med = text2num(query.item[37]) - job_support_low = text2num(query.item[38]) - job_medsci_high = text2num(query.item[39]) - job_medsci_med = text2num(query.item[40]) - job_medsci_low = text2num(query.item[41]) - job_engsec_high = text2num(query.item[42]) - job_engsec_med = text2num(query.item[43]) - job_engsec_low = text2num(query.item[44]) - job_karma_high = text2num(query.item[45]) - job_karma_med = text2num(query.item[46]) - job_karma_low = text2num(query.item[47]) + alternate_option = text2num(query.item[40]) + job_support_high = text2num(query.item[41]) + job_support_med = text2num(query.item[42]) + job_support_low = text2num(query.item[43]) + job_medsci_high = text2num(query.item[44]) + job_medsci_med = text2num(query.item[45]) + job_medsci_low = text2num(query.item[46]) + job_engsec_high = text2num(query.item[47]) + job_engsec_med = text2num(query.item[48]) + job_engsec_low = text2num(query.item[49]) + job_karma_high = text2num(query.item[50]) + job_karma_med = text2num(query.item[51]) + job_karma_low = text2num(query.item[52]) //Miscellaneous - flavor_text = query.item[48] - med_record = query.item[49] - sec_record = query.item[50] - gen_record = query.item[51] + flavor_text = query.item[53] + med_record = query.item[54] + sec_record = query.item[55] + gen_record = query.item[56] // Apparently, the preceding vars weren't always encoded properly... if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags! flavor_text = html_encode(flavor_text) @@ -239,17 +249,17 @@ sec_record = html_encode(sec_record) if(findtext(gen_record, "<")) gen_record = html_encode(gen_record) - disabilities = text2num(query.item[52]) - player_alt_titles = params2list(query.item[53]) - organ_data = params2list(query.item[54]) - rlimb_data = params2list(query.item[55]) - nanotrasen_relation = query.item[56] - speciesprefs = text2num(query.item[57]) + disabilities = text2num(query.item[57]) + player_alt_titles = params2list(query.item[58]) + organ_data = params2list(query.item[59]) + rlimb_data = params2list(query.item[60]) + nanotrasen_relation = query.item[61] + speciesprefs = text2num(query.item[62]) //socks - socks = query.item[58] - body_accessory = query.item[59] - gear = params2list(query.item[60]) + socks = query.item[63] + body_accessory = query.item[64] + gear = params2list(query.item[65]) //Sanitize metadata = sanitize_text(metadata, initial(metadata)) @@ -265,23 +275,30 @@ r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) + r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec)) + g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec)) + b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec)) r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) + r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec)) + g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec)) + b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec)) s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) - g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) - b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) + for(var/marking_location in m_colours) + m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location]) r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc)) g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc)) b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc)) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) - m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) + for(var/marking_location in m_styles) + m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location]) ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style)) + alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head)) r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) @@ -321,6 +338,9 @@ var/rlimblist var/playertitlelist var/gearlist + + var/markingcolourslist = list2params(m_colours) + var/markingstyleslist = list2params(m_styles) if(!isemptylist(organ_data)) organlist = list2params(organ_data) if(!isemptylist(rlimb_data)) @@ -344,23 +364,28 @@ hair_red='[r_hair]', hair_green='[g_hair]', hair_blue='[b_hair]', + secondary_hair_red='[r_hair_sec]', + secondary_hair_green='[g_hair_sec]', + secondary_hair_blue='[b_hair_sec]', facial_red='[r_facial]', facial_green='[g_facial]', facial_blue='[b_facial]', + secondary_facial_red='[r_facial_sec]', + secondary_facial_green='[g_facial_sec]', + secondary_facial_blue='[b_facial_sec]', skin_tone='[s_tone]', skin_red='[r_skin]', skin_green='[g_skin]', skin_blue='[b_skin]', - markings_red='[r_markings]', - markings_green='[g_markings]', - markings_blue='[b_markings]', + marking_colours='[sanitizeSQL(markingcolourslist)]', head_accessory_red='[r_headacc]', head_accessory_green='[g_headacc]', head_accessory_blue='[b_headacc]', hair_style_name='[sanitizeSQL(h_style)]', facial_style_name='[sanitizeSQL(f_style)]', - marking_style_name='[sanitizeSQL(m_style)]', + marking_styles='[sanitizeSQL(markingstyleslist)]', head_accessory_style_name='[sanitizeSQL(ha_style)]', + alt_head_name='[sanitizeSQL(alt_head)]', eyes_red='[r_eyes]', eyes_green='[g_eyes]', eyes_blue='[b_eyes]', @@ -409,14 +434,17 @@ INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender, age, species, language, hair_red, hair_green, hair_blue, + secondary_hair_red, secondary_hair_green, secondary_hair_blue, facial_red, facial_green, facial_blue, + secondary_facial_red, secondary_facial_green, secondary_facial_blue, skin_tone, skin_red, skin_green, skin_blue, - markings_red, markings_green, markings_blue, + marking_colours, head_accessory_red, head_accessory_green, head_accessory_blue, hair_style_name, facial_style_name, - marking_style_name, + marking_styles, head_accessory_style_name, + alt_head_name, eyes_red, eyes_green, eyes_blue, underwear, undershirt, backbag, b_type, alternate_option, @@ -436,14 +464,17 @@ ('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]', '[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]', '[r_hair]', '[g_hair]', '[b_hair]', + '[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]', '[r_facial]', '[g_facial]', '[b_facial]', + '[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]', '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', - '[r_markings]', '[g_markings]', '[b_markings]', + '[sanitizeSQL(markingcolourslist)]', '[r_headacc]', '[g_headacc]', '[b_headacc]', '[sanitizeSQL(h_style)]', '[sanitizeSQL(f_style)]', - '[sanitizeSQL(m_style)]', + '[sanitizeSQL(markingstyleslist)]', '[sanitizeSQL(ha_style)]', + '[sanitizeSQL(alt_head)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 9945079b1a5..4ae3e230762 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -411,11 +411,12 @@ var/mob/living/carbon/human/M = src.loc to_chat(M, "\red The Optical Thermal Scanner overloads and blinds you!") if(M.glasses == src) - M.eye_blind = 3 - M.eye_blurry = 5 - M.disabilities |= NEARSIGHTED - spawn(100) - M.disabilities &= ~NEARSIGHTED + M.EyeBlind(3) + M.EyeBlurry(5) + if(!(M.disabilities & NEARSIGHTED)) + M.BecomeNearsighted() + spawn(100) + M.CureNearsighted() ..() /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete diff --git a/code/modules/clothing/patreon/glasses.dm b/code/modules/clothing/patreon/glasses.dm new file mode 100644 index 00000000000..8f795b212a2 --- /dev/null +++ b/code/modules/clothing/patreon/glasses.dm @@ -0,0 +1,21 @@ +/* + Donator Glasses Loadout for Patreon +*/ +//Kamina shades +/obj/item/clothing/glasses/fluff/kamina + name = "Spiky Orange-tinted Shades" + desc = "Row row!" + icon_state = "gar" + item_state = "gar" + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) + + +//Green Kamina shades +/obj/item/clothing/glasses/fluff/kamina/green + name = "Spiky Green-tinted Shades" + desc = "Fight the power!" + icon_state = "garm" + item_state = "garm" \ No newline at end of file diff --git a/code/modules/clothing/patreon/hats.dm b/code/modules/clothing/patreon/hats.dm new file mode 100644 index 00000000000..bfcc69972e4 --- /dev/null +++ b/code/modules/clothing/patreon/hats.dm @@ -0,0 +1,63 @@ +/* + Donator Loadout for Patreon +*/ + +//mushroom hat +/obj/item/clothing/head/fluff/mushhat + name = "Mushroom Hat" + desc = "A horrifying display of Nanotrasen's ruthless pursuit in being the forefront of fashion. Or genocide." + icon_state = "mushhat" + item_state = "mushhat" + flags = BLOCKHAIR + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + +//gold top hat and recolours +/obj/item/clothing/head/fluff/goldtophat + name = "Gold-trimmed Top Hat" + desc = "Poshness incarnate." + icon_state = "goldtophat" + item_state = "goldtophat" + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + + +/obj/item/clothing/head/fluff/goldtophat/blue + name = "Gold-trimmed Blue Top Hat" + desc = "Poshness incarnate. With blue." + icon_state = "goldtophatblue" + item_state = "goldtophatblue" + +/obj/item/clothing/head/fluff/goldtophat/red + name = "Gold-trimmed Red Top Hat" + desc = "Poshness incarnate. With red." + icon_state = "goldtophatred" + item_state = "goldtophatred" + +//medieval guard helm +/obj/item/clothing/head/fluff/guardhelm + name = "Plastic Guard helm" + desc = "A plastic re-creation of a medieval-era headwear worn by extremely bored recruits of the local army. Kintergarden only." + icon_state = "guardhelm" + item_state = "guardhelm" + flags = BLOCKHAIR + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + +//black sombrero +/obj/item/clothing/head/fluff/blacksombrero + name = "Black sombrero" + desc = "A rare identifying hat of the infamous ancient renegade gang known as 'El Loco Pocos'" + icon_state = "blacksombrero" + item_state = "blacksombrero" + flags = BLOCKHAIR + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 6fad0961ab4..1c8bd73c47f 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -189,15 +189,11 @@ to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.") H.update_inv_head() -/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params) if(!isliving(user)) return - if(istype(src.loc,/mob/living)) - to_chat(user, "How do you propose to modify a hardsuit while it is being worn?") - return - - if(istype(W,/obj/item/weapon/screwdriver)) + if(istype(W,/obj/item/weapon/screwdriver) && can_modify(user)) if(!helmet) to_chat(user, "\The [src] does not have a helmet installed.") else @@ -213,7 +209,7 @@ boots = null return - else if(istype(W,/obj/item/clothing/head/helmet/space)) + else if(istype(W,/obj/item/clothing/head/helmet/space) && can_modify(user)) if(!attached_helmet) to_chat(user, "\The [src] does not have a helmet mount.") return @@ -226,7 +222,7 @@ src.helmet = W return - else if(istype(W,/obj/item/clothing/shoes/magboots)) + else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user)) if(!attached_boots) to_chat(user, "\The [src] does not have boot mounts.") return @@ -242,6 +238,13 @@ return ..() ..() + +/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user) + if(isliving(loc)) + to_chat(user, "You can not modify the hardsuit while it is being worn.") + return 0 + + return 1 //Engineering rig /obj/item/clothing/head/helmet/space/rig/engineering diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index fccf464607b..085e57eb25b 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -936,11 +936,6 @@ if(wearer.notransform || !wearer.canmove) return - if(locate(/obj/effect/stop/, wearer.loc)) - for(var/obj/effect/stop/S in wearer.loc) - if(S.victim == wearer) - return - if(!wearer.lastarea) wearer.lastarea = get_area(wearer.loc) diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm index 726de710a1a..a4fad8a16cb 100644 --- a/code/modules/computer3/computers/communications.dm +++ b/code/modules/computer3/computers/communications.dm @@ -66,16 +66,21 @@ if("main" in href_list) state = STATE_DEFAULT if("login" in href_list) - var/mob/M = usr - var/obj/item/I = M.get_active_hand() + if(!ishuman(usr)) + to_chat(usr, "Access denied.") + return + var/mob/living/carbon/human/H = usr + var/obj/item/I = H.get_active_hand() if(I) I = I.GetID() if(istype(I,/obj/item/weapon/card/id) && check_access(I)) authenticated = 1 if(access_captain in I.GetAccess()) authenticated = 2 - crew_announcement.announcer = GetNameAndAssignmentFromId(I) - + var/obj/item/weapon/card/id = H.get_idcard(TRUE) + if(istype(id)) + crew_announcement.announcer = GetNameAndAssignmentFromId(id) + if("logout" in href_list) authenticated = 0 crew_announcement.announcer = "" diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm new file mode 100644 index 00000000000..2ef85d6a9d7 --- /dev/null +++ b/code/modules/countdown/countdown.dm @@ -0,0 +1,69 @@ +/obj/effect/countdown + name = "countdown" + desc = "We're leaving together\n\ + But still it's farewell\n\ + And maybe we'll come back\n\ + To earth, who can tell?" + + var/displayed_text + var/atom/attached_to + color = "#ff0000" + var/text_size = 4 + var/started = 0 + invisibility = INVISIBILITY_OBSERVER + anchored = 1 + layer = 5 + +/obj/effect/countdown/New(atom/A) + . = ..() + attach(A) + +/obj/effect/countdown/proc/attach(atom/A) + attached_to = A + loc = get_turf(A) + +/obj/effect/countdown/proc/start() + if(!started) + fast_processing += src + started = 1 + +/obj/effect/countdown/proc/stop() + if(started) + maptext = null + fast_processing -= src + started = 0 + +/obj/effect/countdown/proc/get_value() + // Get the value from our atom + return + +/obj/effect/countdown/process() + if(!attached_to || qdeleted(attached_to)) + qdel(src) + forceMove(get_turf(attached_to)) + var/new_val = get_value() + if(new_val == displayed_text) + return + displayed_text = new_val + + if(displayed_text) + maptext = "[displayed_text]" + else + maptext = null + +/obj/effect/countdown/Destroy() + attached_to = null + fast_processing -= src + return ..() + +/obj/effect/countdown/clonepod + name = "cloning pod countdown" + text_size = 1 + +/obj/effect/countdown/clonepod/get_value() + var/obj/machinery/clonepod/C = attached_to + if(!istype(C)) + return + else if(C.occupant) + var/completion = round(C.get_completion()) + return completion diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index f8b224f6cb7..a5c1e69b847 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -14,7 +14,7 @@ var/used = 0 /obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks - name = "dispoable tattoo pen" + name = "disposable tattoo pen" desc = "A cheap plastic tattoo application pen." icon = 'icons/obj/custom_items.dmi' icon_state = "tatgun" @@ -22,7 +22,7 @@ throwforce = 0 w_class = 1 var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages - var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm + var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm var/tattoo_r = 1 // RGB values for the body markings var/tattoo_g = 1 var/tattoo_b = 1 @@ -47,10 +47,15 @@ to_chat(user, "[target] has no skin, how do you expect to tattoo them?") return - if(target.m_style != "None") + if(target.m_styles["body"] != "None") to_chat(user, "[target] already has body markings, any more would look silly!") return + var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon] + if(!(target.species.name in temp_tatt.species_allowed)) + to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.") + return + if(target == user) to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!") @@ -61,12 +66,8 @@ user.visible_message("[user] finishes the [tattoo_name] on [target].", "You finish the [tattoo_name].") if(!used) // No exploiting do_after to tattoo multiple folks. - target.m_style = tattoo_icon - target.r_markings = tattoo_r - target.g_markings = tattoo_g - target.b_markings = tattoo_b - - target.update_markings() + target.change_markings(tattoo_icon, "body") + target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body") playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1) used = 1 @@ -98,9 +99,9 @@ if(!used) var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null if(ink_color && !(user.incapacitated() || used) ) - tattoo_r = hex2num(copytext(ink_color, 2, 4)) - tattoo_g = hex2num(copytext(ink_color, 4, 6)) - tattoo_b = hex2num(copytext(ink_color, 6, 8)) + tattoo_r = color2R(ink_color) + tattoo_g = color2G(ink_color) + tattoo_b = color2B(ink_color) to_chat(user, "You change the color setting on the [src].") @@ -224,6 +225,28 @@ to_chat(target, "You comb your tail with the [src].") used = 1 +/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery + name = "welding helmet modkit" + desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!" + icon_state = "modkit" + w_class = 2 + force = 0 + throwforce = 0 + +/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.lying) + return + + if(istype(target, /obj/item/clothing/head/welding)) + to_chat(user, "You modify the appearance of [target].") + + var/obj/item/clothing/head/welding/flamedecal/P = new(get_turf(target)) + transfer_fingerprints_to(P) + qdel(target) + qdel(src) + return + to_chat(user, "You can't modify [target]!") + #define USED_MOD_HELM 1 #define USED_MOD_SUIT 2 @@ -335,7 +358,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.head == src) - H.slurring = max(3, H.slurring) //always slur + H.Slur(3) //always slur /obj/item/clothing/head/beret/fluff/linda //Epic_Charger: Linda Clark name = "Green beret" @@ -432,6 +455,15 @@ item_state = "castile_dress" item_color = "castile_dress" +/obj/item/clothing/under/fluff/elishirt // FlattestGuitar9: Eli Randolph + name = "casual dress shirt" + desc = "A soft, white dress shirt paired up with black suit pants. The set looks comfortable." + icon = 'icons/obj/custom_items.dmi' + icon_state = "elishirt" + item_state = "elishirt" + item_color = "elishirt" + displays_id = 0 + /obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius name = "Isaca's suit" desc = "Black, comfortable and nicely fitting suit. Made not to hinder the wearer in any way. Made of some exotic fabric. And some strange glowing jewel at the waist. Name labels says; Property of Isaca Sirius; The Seeder." @@ -475,6 +507,14 @@ displays_id = 0 strip_delay = 100 +/obj/item/clothing/under/fluff/aegis //PlagueWalker: A.E.G.I.S. + name = "gilded waistcoat" + desc = "This black, gold-trimmed, rather expensive-looking uniform laced with fine materials appears comfortable despite its stiffness." + icon_state = "aegisuniform" + item_state = "aegisuniform" + item_color = "aegisuniform" + displays_id = 0 + //////////// Masks //////////// /obj/item/clothing/mask/bandana/fluff/dar //sasanek12: Dar'Konr diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index caca591b90b..b583c04702f 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -123,8 +123,6 @@ log transactions to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.") return if(get_dist(src,user) <= 1) - //check to see if the user has low security enabled - scan_user(user) add_fingerprint(user) //js replicated from obj/machinery/computer/card @@ -252,55 +250,59 @@ log transactions var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) authenticated_account.security_level = new_sec_level if("attempt_auth") - if(linked_db && !ticks_left_locked_down) - var/tried_account_num = text2num(href_list["account_num"]) - if(!tried_account_num) - tried_account_num = held_card.associated_account_number - var/tried_pin = text2num(href_list["account_pin"]) + if(linked_db) + // check if they have low security enabled + scan_user(usr) + + if(!ticks_left_locked_down && held_card) + var/tried_account_num = text2num(href_list["account_num"]) + if(!tried_account_num) + tried_account_num = held_card.associated_account_number + var/tried_pin = text2num(href_list["account_pin"]) - authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1) - if(!authenticated_account) - number_incorrect_tries++ - if(previous_account_number == tried_account_num) - if(number_incorrect_tries > max_pin_attempts) - //lock down the atm - ticks_left_locked_down = 30 - playsound(src, 'sound/machines/buzz-two.ogg', 50, 1) + authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1) + if(!authenticated_account) + number_incorrect_tries++ + if(previous_account_number == tried_account_num) + if(number_incorrect_tries > max_pin_attempts) + //lock down the atm + ticks_left_locked_down = 30 + playsound(src, 'sound/machines/buzz-two.ogg', 50, 1) - //create an entry in the account transaction log - var/datum/money_account/failed_account = linked_db.get_account(tried_account_num) - if(failed_account) - var/datum/transaction/T = new() - T.target_name = failed_account.owner_name - T.purpose = "Unauthorised login attempt" - T.source_terminal = machine_id - T.date = current_date_string - T.time = worldtime2text() - failed_account.transaction_log.Add(T) + //create an entry in the account transaction log + var/datum/money_account/failed_account = linked_db.get_account(tried_account_num) + if(failed_account) + var/datum/transaction/T = new() + T.target_name = failed_account.owner_name + T.purpose = "Unauthorised login attempt" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + failed_account.transaction_log.Add(T) + else + to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") + previous_account_number = tried_account_num + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else - to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") - previous_account_number = tried_account_num - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) + to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.") + number_incorrect_tries = 0 else - to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.") - number_incorrect_tries = 0 - else - playsound(src, 'sound/machines/twobeep.ogg', 50, 1) - ticks_left_timeout = 120 - view_screen = NO_SCREEN + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) + ticks_left_timeout = 120 + view_screen = NO_SCREEN - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Remote terminal access" - T.source_terminal = machine_id - T.date = current_date_string - T.time = worldtime2text() - authenticated_account.transaction_log.Add(T) + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = authenticated_account.owner_name + T.purpose = "Remote terminal access" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + authenticated_account.transaction_log.Add(T) - to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'") + to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'") - previous_account_number = tried_account_num + previous_account_number = tried_account_num if("withdrawal") var/amount = max(text2num(href_list["funds_amount"]),0) if(amount <= 0) @@ -404,3 +406,5 @@ log transactions T.date = current_date_string T.time = worldtime2text() authenticated_account.transaction_log.Add(T) + + view_screen = NO_SCREEN diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 05054f468dd..3bc26b52799 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -1,5 +1,3 @@ -/var/global/sent_aliens_to_station = 0 - /datum/event/alien_infestation announceWhen = 400 var/spawncount = 1 @@ -7,8 +5,8 @@ /datum/event/alien_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) - spawncount = rand(1, 2) - sent_aliens_to_station = 1 + if(prob(50)) + spawncount++ /datum/event/alien_infestation/announce() if(successSpawn) diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index d7877676b21..a3f302cff9f 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -6,7 +6,7 @@ var/armor = H.getarmor(type = "rad") if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue - H.hallucination += rand(50, 100) + H.AdjustHallucinate(rand(50, 100)) /datum/event/mass_hallucination/announce() - command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage") \ No newline at end of file + command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage") diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 81038eaf463..4c120db79e0 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -279,11 +279,11 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) var/target_dist = get_dist(src,target) if(target_dist<=3) //"Eaten" - target.sleeping = 20 + target.Sleeping(20) target.hal_crit = 1 target.hal_screwyhud = 1 spawn(rand(50,100)) - target.sleeping = 0 + target.SetSleeping(0) target.hal_crit = 0 target.hal_screwyhud = 0 @@ -480,7 +480,7 @@ Gunshots/explosions/opening doors/less rare audio (done) my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) my_target.staminaloss += 30 if(prob(20)) - my_target.eye_blurry += 3 + my_target.AdjustEyeBlurry(3) if(prob(33)) if(!locate(/obj/effect/overlay) in my_target.loc) fake_blood(my_target) @@ -565,13 +565,13 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite person = H people += H if(person) //Basic talk - to_chat(target, target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)) + target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person) else // Radio talk var/list/humans = list() for(var/mob/living/carbon/human/H in living_mob_list) humans += H person = pick(humans) - to_chat(target, target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ")) + target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") qdel(src) /obj/effect/hallucination/message @@ -752,11 +752,11 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite halimage = null if("death") //Fake death - src.sleeping = 20 + Sleeping(20) hal_crit = 1 hal_screwyhud = 1 spawn(rand(50,100)) - src.sleeping = 0 + SetSleeping(0) hal_crit = 0 hal_screwyhud = 0 if("husks") diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 15ce27b7d5c..0814bf988f4 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -81,7 +81,7 @@ refill = reagents.get_master_reagent_id() refillName = reagents.get_master_reagent_name() - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, " You transfer [trans] units of the solution to [target].") if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell @@ -102,22 +102,22 @@ if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird return if(is_hot(I)) - if(src.reagents) - src.reagents.chem_temp += 15 + if(reagents) + reagents.chem_temp += 15 to_chat(user, "You heat [src] with [I].") - src.reagents.handle_reactions() + reagents.handle_reactions() /obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) if(!..(user, 1)) return - if(!reagents || reagents.total_volume==0) + if(!reagents || reagents.total_volume == 0) to_chat(user, " \The [src] is empty!") - else if(reagents.total_volume<=src.volume/4) + else if(reagents.total_volume <= volume/4) to_chat(user, " \The [src] is almost empty!") - else if(reagents.total_volume<=src.volume*0.66) + else if(reagents.total_volume <= volume*0.66) to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! - else if(reagents.total_volume<=src.volume*0.90) + else if(reagents.total_volume <= volume*0.90) to_chat(user, " \The [src] is almost full!") else to_chat(user, " \The [src] is full!") diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 8928c5e8c57..53130d972f4 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -22,9 +22,9 @@ else user.drop_item() user.put_in_active_hand(B) - B.icon_state = src.icon_state + B.icon_state = icon_state - var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) + var/icon/I = new('icons/obj/drinks.dmi', icon_state) I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1) I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) B.icon = I @@ -99,11 +99,11 @@ //Display an attack message. if(target != user) - target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \ - "[user] has hit [target][head_attack_message] with a bottle of [src.name]!") + target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [name]!", \ + "[user] has hit [target][head_attack_message] with a bottle of [name]!") else - user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \ - "[target] hits \himself with a bottle of [src.name][head_attack_message]!") + user.visible_message("[target] hits \himself with a bottle of [name][head_attack_message]!", \ + "[target] hits \himself with a bottle of [name][head_attack_message]!") //Attack logs add_logs(user, target, "attacked", src) @@ -284,7 +284,7 @@ desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." icon_state = "vodkabottle" list_reagents = list() - var/list/accelerants = list(/datum/reagent/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston, + var/list/accelerants = list(/datum/reagent/consumable/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston, /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/plasma,/datum/reagent/plasma_dust) var/active = 0 diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm index 6d72ec2221c..89deed5dedd 100644 --- a/code/modules/food_and_drinks/drinks/drinks/cans.dm +++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm @@ -9,7 +9,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user) if(canopened == 0) - playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1) + playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1) to_chat(user, "You open the drink with an audible pop!") canopened = 1 flags |= OPENCONTAINER @@ -32,7 +32,7 @@ if(canopened == 0) to_chat(user, "You need to open the drink!") return - else if(M == user && !src.reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head") + else if(M == user && !reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head") user.visible_message("[user] crushes ["\the [src]"] on \his forehead!", "You crush \the [src] on your forehead.") crush(user) return diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index bc1442038e9..0412c93626b 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -36,523 +36,12 @@ reagents.clear_reagents() extinguish() -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream - if(reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("beer") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("cider") - icon_state = "rewriter" - name = "Cider" - desc = "a refreshing glass of traditional cider" - if("beer2") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("ale") - icon_state = "aleglass" - name = "Ale glass" - desc = "A freezing pint of delicious Ale" - if("milk") - icon_state = "glass_white" - name = "Glass of milk" - desc = "White and nutritious goodness!" - if("cream") - icon_state = "glass_white" - name = "Glass of cream" - desc = "Ewwww..." - if("chocolate") - icon_state = "chocolateglass" - name = "Glass of chocolate" - desc = "Tasty" - if("hot_coco") - icon_state = "hot_coco" - name = "Glass of hot coco" - desc = "Delicious and cozy" - if("lemonjuice") - icon_state = "lemonglass" - name = "Glass of lemonjuice" - desc = "Sour..." - if("cola") - icon_state = "glass_brown" - name = "Glass of Space Cola" - desc = "A glass of refreshing Space Cola" - if("nuka_cola") - icon_state = "nuka_colaglass" - name = "Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" - if("orangejuice") - icon_state = "glass_orange" - name = "Glass of Orange juice" - desc = "Vitamins! Yay!" - if("tomatojuice") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("blood") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("limejuice") - icon_state = "glass_green" - name = "Glass of Lime juice" - desc = "A glass of sweet-sour lime juice." - if("whiskey") - icon_state = "whiskeyglass" - name = "Glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - if("gin") - icon_state = "ginvodkaglass" - name = "Glass of gin" - desc = "A crystal clear glass of Griffeater gin." - if("vodka") - icon_state = "ginvodkaglass" - name = "Glass of vodka" - desc = "The glass contain wodka. Xynta." - if("sake") - icon_state = "ginvodkaglass" - name = "Glass of Sake" - desc = "A glass of Sake." - if("goldschlager") - icon_state = "ginvodkaglass" - name = "Glass of goldschlager" - desc = "100 proof that teen girls will drink anything with gold in it." - if("wine") - icon_state = "wineglass" - name = "Glass of wine" - desc = "A very classy looking drink." - if("cognac") - icon_state = "cognacglass" - name = "Glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - if("kahlua") - icon_state = "kahluaglass" - name = "Glass of RR coffee Liquor" - desc = "DAMN, THIS THING LOOKS ROBUST" - if("vermouth") - icon_state = "vermouthglass" - name = "Glass of Vermouth" - desc = "You wonder why you're even drinking this straight." - if("triple_citrus") - icon_state = "triplecitrus" - name = "Glass of Triplecitrus Juice" - desc = "As colorful and healthy as it is delicious." - if("mojito") - icon_state = "mojito" - name = "Glass of Mojito" - desc = "Fresh from Spesscuba." - if("tequila") - icon_state = "tequilaglass" - name = "Glass of Tequila" - desc = "Now all that's missing is the weird colored shades!" - if("patron") - icon_state = "patronglass" - name = "Glass of Patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - if("rum") - icon_state = "rumglass" - name = "Glass of Rum" - desc = "Now you want to Pray for a pirate suit, don't you?" - if("absinthe") - icon_state = "absinthebottle" - name = "Glass of Absinthe" - desc = "The green fairy is going to get you now!" - if("gintonic") - icon_state = "gintonicglass" - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - if("ginsonic") - icon_state = "ginsonic" - name = "Gin and Sonic" - desc = "An extremely high amperage drink. Absolutely not for the true Englishman." - if("whiskeycola") - icon_state = "whiskeycolaglass" - name = "Whiskey Cola" - desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - if("whiterussian") - icon_state = "whiterussianglass" - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - if("screwdrivercocktail") - icon_state = "screwdriverglass" - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - if("bloodymary") - icon_state = "bloodymaryglass" - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - if("martini") - icon_state = "martiniglass" - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - if("vodkamartini") - icon_state = "martiniglass" - name = "Vodka martini" - desc ="A bastardisation of the classic martini. Still great." - if("gargleblaster") - icon_state = "gargleblasterglass" - name = "Pan-Galactic Gargle Blaster" - desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - if("bravebull") - icon_state = "bravebullglass" - name = "Brave Bull" - desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up." - if("tequilasunrise") - icon_state = "tequilasunriseglass" - name = "Tequila Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - if("toxinsspecial") - icon_state = "toxinsspecialglass" - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE" - if("beepskysmash") - icon_state = "beepskysmashglass" - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - if("doctorsdelight") - icon_state = "doctorsdelightglass" - name = "Doctor's Delight" - desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - if("manlydorf") - icon_state = "manlydorfglass" - name = "The Manly Dorf" - desc = "A manly concotion made from Ale and Beer. Intended for true men only." - if("irishcream") - icon_state = "irishcreamglass" - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - if("cubalibre") - icon_state = "cubalibreglass" - name = "Cuba Libre" - desc = "A classic mix of rum and cola." - if("b52") - icon_state = "b52glass" - name = "B-52" - desc = "Kahlua, Irish Cream, and congac. You will get bombed." - if("atomicbomb") - icon_state = "atomicbombglass" - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - if("longislandicedtea") - icon_state = "longislandicedteaglass" - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - if("threemileisland") - icon_state = "threemileislandglass" - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - if("margarita") - icon_state = "margaritaglass" - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - if("blackrussian") - icon_state = "blackrussianglass" - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - if("vodkatonic") - icon_state = "vodkatonicglass" - name = "Vodka and Tonic" - desc = "For when a gin and tonic isn't russian enough." - if("manhattan") - icon_state = "manhattanglass" - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - if("manhattan_proj") - icon_state = "proj_manhattanglass" - name = "Manhattan Project" - desc = "A scienitst drink of choice, for thinking how to blow up the station." - if("ginfizz") - icon_state = "ginfizzglass" - name = "Gin Fizz" - desc = "Refreshingly lemony, deliciously dry." - if("irishcoffee") - icon_state = "irishcoffeeglass" - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - if("suicider") - icon_state = "suicider" - name = "Suicider" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("whiskeysoda") - icon_state = "whiskeysodaglass2" - name = "Whiskey Soda" - desc = "Ultimate refreshment." - if("tonic") - icon_state = "glass_clear" - name = "Glass of Tonic Water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - if("sodawater") - icon_state = "glass_clear" - name = "Glass of Soda Water" - desc = "Soda water. Why not make a scotch and soda?" - if("water") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - if("spacemountainwind") - icon_state = "Space_mountain_wind_glass" - name = "Glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - if("thirteenloko") - icon_state = "thirteen_loko_glass" - name = "Glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" - if("dr_gibb") - icon_state = "dr_gibb_glass" - name = "Glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the name might imply." - if("space_up") - icon_state = "space-up_glass" - name = "Glass of Space-up" - desc = "Space-up. It helps keep your cool." - if("moonshine") - icon_state = "glass_clear" - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("soymilk") - icon_state = "glass_white" - name = "Glass of soy milk" - desc = "White and nutritious soy goodness!" - if("berryjuice") - icon_state = "berryjuice" - name = "Glass of berry juice" - desc = "Berry juice. Or maybe its jam. Who cares?" - if("poisonberryjuice") - icon_state = "poisonberryjuice" - name = "Glass of poison berry juice" - desc = "A glass of deadly juice." - if("carrotjuice") - icon_state = "carrotjuice" - name = "Glass of carrot juice" - desc = "It is just like a carrot but without crunching." - if("potato") - icon_state = "glass_brown" - name = "Glass of potato juice" - desc = "Who in the hell requests this? Gross!" - if("banana") - icon_state = "banana" - name = "Glass of banana juice" - desc = "The raw essence of a banana. HONK" - if("bahama_mama") - icon_state = "bahama_mama" - name = "Bahama Mama" - desc = "Tropic cocktail" - if("singulo") - icon_state = "singulo" - name = "Singulo" - desc = "A blue-space beverage." - if("alliescocktail") - icon_state = "alliescocktail" - name = "Allies cocktail" - desc = "A drink made from your allies." - if("antifreeze") - icon_state = "antifreeze" - name = "Anti-freeze" - desc = "The ultimate refreshment." - if("barefoot") - icon_state = "b&p" - name = "Barefoot" - desc = "Barefoot and pregnant" - if("demonsblood") - icon_state = "demonsblood" - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - if("booger") - icon_state = "booger" - name = "Booger" - desc = "Ewww..." - if("snowwhite") - icon_state = "snowwhite" - name = "Snow White" - desc = "A cold refreshment." - if("aloe") - icon_state = "aloe" - name = "Aloe" - desc = "Very, very, very good." - if("andalusia") - icon_state = "andalusia" - name = "Andalusia" - desc = "A nice, strange named drink." - if("sbiten") - icon_state = "sbitenglass" - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - if("red_mead") - icon_state = "red_meadglass" - name = "Red Mead" - desc = "A True Vikings Beverage, though its color is strange." - if("mead") - icon_state = "meadglass" - name = "Mead" - desc = "A Vikings Beverage, though a cheap one." - if("iced_beer") - icon_state = "iced_beerglass" - name = "Iced Beer" - desc = "A beer so frosty, the air around it freezes." - if("grog") - icon_state = "grogglass" - name = "Grog" - desc = "A fine and cepa drink for Space." - if("soy_latte") - icon_state = "soy_latte" - name = "Soy Latte" - desc = "A nice and refrshing beverage while you are reading." - if("cafe_latte") - icon_state = "cafe_latte" - name = "Cafe Latte" - desc = "A nice, strong and refreshing beverage while you are reading." - if("cafe_mocha") - icon_state = "cafe_latte" - name = "Cafe Mocha" - desc = "The perfect blend of coffe, milk, and chocolate." - if("acidspit") - icon_state = "acidspitglass" - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - if("amasec") - icon_state = "amasecglass" - name = "Amasec" - desc = "Always handy before COMBAT!!!" - if("neurotoxin") - icon_state = "neurotoxinglass" - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - if("hippiesdelight") - icon_state = "hippiesdelightglass" - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - if("bananahonk") - icon_state = "bananahonkglass" - name = "Banana Honk" - desc = "A drink from Banana Heaven." - if("silencer") - icon_state = "silencerglass" - name = "Silencer" - desc = "A drink from mime Heaven." - if("nothing") - icon_state = "nothing" - name = "Nothing" - desc = "Absolutely nothing." - if("devilskiss") - icon_state = "devilskiss" - name = "Devils Kiss" - desc = "Creepy time!" - if("changelingsting") - icon_state = "changelingsting" - name = "Changeling Sting" - desc = "A stingy drink." - if("irishcarbomb") - icon_state = "irishcarbomb" - name = "Irish Car Bomb" - desc = "An irish car bomb." - if("syndicatebomb") - icon_state = "syndicatebomb" - name = "Syndicate Bomb" - desc = "A syndicate bomb." - if("erikasurprise") - icon_state = "erikasurprise" - name = "Erika Surprise" - desc = "The surprise is, it's green!" - if("driestmartini") - icon_state = "driestmartiniglass" - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - if("ice") - icon_state = "iceglass" - name = "Glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - if("icecoffee") - icon_state = "icedcoffeeglass" - name = "Iced Coffee" - desc = "A drink to perk you up and refresh you!" - if("coffee") - icon_state = "glass_brown" - name = "Glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - if("bilk") - icon_state = "glass_brown" - name = "Glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - if("fuel") - icon_state = "dr_gibb_glass" - name = "Glass of welder fuel" - desc = "Unless you are an industrial tool, this is probably not safe for consumption." - if("brownstar") - icon_state = "brownstar" - name = "Brown Star" - desc = "Its not what it sounds like..." - if("tea") - icon_state = "glass_brown" - name = "Glass of Tea" - desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" - if("icetea") - icon_state = "icetea" - name = "Iced Tea" - desc = "No relation to a certain rap artist/ actor." - if("milkshake") - icon_state = "milkshake" - name = "Milkshake" - desc = "Glorious brainfreezing mixture." - if("lemonade") - icon_state = "lemonade" - name = "Lemonade" - desc = "Oh the nostalgia..." - if("kiraspecial") - icon_state = "kiraspecial" - name = "Kira Special" - desc = "Long live the guy who everyone had mistaken for a girl. Baka!" - if("rewriter") - icon_state = "rewriter" - name = "Rewriter" - desc = "The secert of the sanctuary of the Libarian..." - if("applejack") - icon_state = "cognacglass" - name = "Glass of applejack" - desc = "When cider isn't strong enough, you gotta jack it." - if("jackrose") - icon_state = "patronglass" - name = "Jack Rose" - desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." - if("synthanol") - icon_state = "synthanolglass" - name = "Glass of Synthanol" - desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." - if("robottears") - icon_state = "robottearsglass" - name = "Glass of Robot Tears" - desc = "No robots were hurt in the making of this drink." - if("trinary") - icon_state = "trinaryglass" - name = "Glass of Trinary" - desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." - if("servo") - icon_state = "servoglass" - name = "Glass of Servo" - desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." - if("synthnsoda") - icon_state = "synthnsodaglass" - name = "Glass of Synth 'n Soda" - desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." - if("synthignon") - icon_state = "synthignonglass" - name = "Glass of Synthignon" - desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." - if("uplink") - icon_state = "uplinkglass" - name = "Glass of Uplink" - desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." - if("holywater") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - - - else - icon_state ="glass_brown" - name = "Glass of ..what?" - desc = "You can't really tell what this is." +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() + if(reagents.reagent_list.len) + var/datum/reagent/R = reagents.get_master_reagent() + icon_state = R.drink_icon + name = R.drink_name + desc = R.drink_desc else icon_state = "glass_empty" name = "glass" diff --git a/code/modules/food_and_drinks/food/candy.dm b/code/modules/food_and_drinks/food/candy.dm index d13eb7ec145..32a4a584a88 100644 --- a/code/modules/food_and_drinks/food/candy.dm +++ b/code/modules/food_and_drinks/food/candy.dm @@ -13,9 +13,6 @@ icon = 'icons/obj/food/candy.dmi' icon_state = "candy" -/obj/item/weapon/reagent_containers/food/snacks/candy/New() - ..() - // *********************************************************** // Candy Ingredients / Flavorings / Byproduct // *********************************************************** @@ -25,76 +22,53 @@ desc = "Such sweet, fattening food." icon_state = "chocolatebar" filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate",4) bitesize = 2 + list_reagents = list("nutriment" = 2, "chocolate" = 4) /obj/item/weapon/reagent_containers/food/snacks/candy/caramel name = "Caramel" desc = "Chewy and dense, yet it practically melts in your mouth!" icon_state = "caramel" filling_color = "#DB944D" - -/obj/item/weapon/reagent_containers/food/snacks/candy/caramel/New() - ..() - reagents.add_reagent("cream", 2) - reagents.add_reagent("sugar", 2) bitesize = 2 + list_reagents = list("cream" = 2, "sugar" = 2) + /obj/item/weapon/reagent_containers/food/snacks/candy/toffee name = "Toffee" desc = "A hard, brittle candy with a distinctive taste." icon_state = "toffee" filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/candy/toffee/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 3) bitesize = 2 + list_reagents = list("nutriment" = 3, "sugar" = 3) /obj/item/weapon/reagent_containers/food/snacks/candy/nougat name = "Nougat" desc = "A soft, chewy candy commonly found in candybars." icon_state = "nougat" filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/candy/nougat/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 3) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() bitesize = 2 + list_reagents = list("nutriment" = 3, "sugar" = 3) /obj/item/weapon/reagent_containers/food/snacks/candy/taffy name = "Saltwater Taffy" desc = "Old fashioned saltwater taffy. Chewy!" icon_state = "candy1" filling_color = "#7D5F46" + bitesize = 2 + list_reagents = list("nutriment" = 3, "sugar" = 3) /obj/item/weapon/reagent_containers/food/snacks/candy/taffy/New() ..() icon_state = pick("candy1", "candy2", "candy3", "candy4", "candy5") - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/candy/fudge name = "Fudge" desc = "Chocolate fudge, a timeless classic treat." icon_state = "fudge" filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/New() - ..() - reagents.add_reagent("cream", 3) - reagents.add_reagent("chocolate",6) bitesize = 3 + list_reagents = list("cream" = 3, "chocolate" = 6) /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut name = "Peanut Fudge" @@ -113,10 +87,7 @@ desc = "An extra creamy fudge with bits of real chocolate cookie mixed in. Crunchy!" icon_state = "fudge_cookies_n_cream" filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream/New() - ..() - reagents.add_reagent("cream", 3) + list_reagents = list("cream" = 6, "chocolate" = 6) /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle name = "Turtle Fudge" @@ -132,24 +103,16 @@ name = "Donor Candy" desc = "A little treat for blood donors." trash = /obj/item/trash/candy - -/obj/item/weapon/reagent_containers/food/snacks/candy/donor/New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("sugar", 3) bitesize = 5 + list_reagents = list("nutriment" = 10, "sugar" = 3) /obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn name = "candy corn" desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." icon_state = "candycorn" filling_color = "#FFFCB0" - -/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) bitesize = 2 + list_reagents = list("nutriment" = 4, "sugar" = 2) // *********************************************************** // Candy Products (plain / unflavored) @@ -161,11 +124,8 @@ icon_state = "cottoncandy_plain" trash = /obj/item/weapon/c_tube filling_color = "#FFFFFF" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/New() - ..() - reagents.add_reagent("sugar", 15) - bitesize = 3 + bitesize = 4 + list_reagents = list("sugar" = 15) /obj/item/weapon/reagent_containers/food/snacks/candy/candybar name = "candy" @@ -173,92 +133,64 @@ icon_state = "candy" trash = /obj/item/trash/candy filling_color = "#7D5F46" - -/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate",5) bitesize = 3 + list_reagents = list("nutriment" = 2, "chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/candycane name = "candy cane" desc = "A festive mint candy cane." icon_state = "candycane" filling_color = "#F2F2F2" - -/obj/item/weapon/reagent_containers/food/snacks/candy/candycane/New() - ..() - reagents.add_reagent("minttoxin", 1) - reagents.add_reagent("sugar", 5) bitesize = 2 + list_reagents = list("minttoxin" = 1, "sugar" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear name = "gummy bear" desc = "A small edible bear. It's squishy and chewy!" icon_state = "gbear" filling_color = "#FFFFFF" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/New() - ..() - reagents.add_reagent("sugar", 10) bitesize = 3 + list_reagents = list("sugar" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm name = "gummy worm" desc = "An edible worm, made from gelatin." icon_state = "gworm" filling_color = "#FFFFFF" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/New() - ..() - reagents.add_reagent("sugar", 10) bitesize = 3 + list_reagents = list("sugar" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas." icon_state = "jbean" filling_color = "#FFFFFF" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/New() - ..() - reagents.add_reagent("sugar", 10) bitesize = 3 + list_reagents = list("sugar" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker name = "jawbreaker" desc = "An unbelievably hard candy. The name is fitting." icon_state = "jawbreaker" filling_color = "#ED0758" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker/New() - ..() - reagents.add_reagent("sugar", 10) bitesize = 0.1 //this is gonna take a while, you'll be working at this all shift. + list_reagents = list("sugar" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/cash name = "candy cash" desc = "Not legal tender. Tasty though." icon_state = "candy_cash" filling_color = "#302000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cash/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate", 4) bitesize = 2 + list_reagents = list("nutriment" = 2, "chocolate" = 4) /obj/item/weapon/reagent_containers/food/snacks/candy/coin name = "chocolate coin" desc = "Probably won't work in the vending machines." icon_state = "choc_coin" filling_color = "#302000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/coin/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate",4) bitesize = 3 + list_reagents = list("nutriment" = 2, "chocolate" = 4) /obj/item/weapon/reagent_containers/food/snacks/candy/gum name = "bubblegum" @@ -266,22 +198,15 @@ icon_state = "bubblegum" trash = /obj/item/trash/gum filling_color = "#FF7495" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gum/New() - ..() - reagents.add_reagent("sugar", 5) bitesize = 0.2 + list_reagents = list("sugar" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/sucker name = "sucker" desc = "For being such a good sport!" icon_state = "sucker" filling_color = "#FFFFFF" - -/obj/item/weapon/reagent_containers/food/snacks/candy/sucker/New() - ..() - reagents.add_reagent("sugar", 10) - bitesize = 1 + list_reagents = list("sugar" = 10) // *********************************************************** // Gummy Bear Flavors @@ -292,91 +217,56 @@ desc = "A small edible bear. It's red!" icon_state = "gbear_red" filling_color = "#801E28" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/red/New() - ..() - reagents.add_reagent("cherryjelly", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "cherryjelly" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue name = "gummy bear" desc = "A small edible bear. It's blue!" icon_state = "gbear_blue" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue/New() - ..() - reagents.add_reagent("berryjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "berryjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison name = "gummy bear" desc = "A small edible bear. It's blue!" icon_state = "gbear_blue" filling_color = "#863353" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison/New() - ..() - reagents.add_reagent("poisonberryjuice", 12) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 3 + list_reagents = list("poisonberryjuice" = 12) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green name = "gummy bear" desc = "A small edible bear. It's green!" icon_state = "gbear_green" filling_color = "#365E30" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green/New() - ..() - reagents.add_reagent("limejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "limejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow name = "gummy bear" desc = "A small edible bear. It's yellow!" icon_state = "gbear_yellow" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow/New() - ..() - reagents.add_reagent("lemonjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "lemonjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange name = "gummy bear" desc = "A small edible bear. It's orange!" icon_state = "gbear_orange" filling_color = "#E78108" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange/New() - ..() - reagents.add_reagent("orangejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "orangejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple name = "gummy bear" desc = "A small edible bear. It's purple!" icon_state = "gbear_purple" filling_color = "#993399" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple/New() - ..() - reagents.add_reagent("grapejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "grapejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf name = "gummy bear" desc = "A small bear. Wait... what?" icon_state = "gbear_wtf" filling_color = "#60A584" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf/New() - ..() - reagents.add_reagent("space_drugs", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "space_drugs" = 2) // *********************************************************** // Gummy Worm Flavors @@ -387,91 +277,56 @@ desc = "An edible worm, made from gelatin. It's red!" icon_state = "gworm_red" filling_color = "#801E28" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/red/New() - ..() - reagents.add_reagent("cherryjelly", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "cherryjelly" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue name = "gummy worm" desc = "An edible worm, made from gelatin. It's blue!" icon_state = "gworm_blue" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue/New() - ..() - reagents.add_reagent("berryjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "berryjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison name = "gummy worm" desc = "An edible worm, made from gelatin. It's blue!" icon_state = "gworm_blue" filling_color = "#863353" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison/New() - ..() - reagents.add_reagent("poisonberryjuice", 12) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 3 + list_reagents = list("poisonberryjuice" = 12) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green name = "gummy worm" desc = "An edible worm, made from gelatin. It's green!" icon_state = "gworm_green" filling_color = "#365E30" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green/New() - ..() - reagents.add_reagent("limejuice", 10) - bitesize = 3 + list_reagents = list("sugar" = 10, "limejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow name = "gummy worm" desc = "An edible worm, made from gelatin. It's yellow!" icon_state = "gworm_yellow" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow/New() - ..() - reagents.add_reagent("lemonjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "lemonjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange name = "gummy worm" desc = "An edible worm, made from gelatin. It's orange!" icon_state = "gworm_orange" filling_color = "#E78108" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange/New() - ..() - reagents.add_reagent("orangejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "orangejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple name = "gummy worm" desc = "An edible worm, made from gelatin. It's purple!" icon_state = "gworm_purple" filling_color = "#993399" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple/New() - ..() - reagents.add_reagent("grapejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "grapejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf name = "gummy worm" desc = "An edible worm. Did it just move?" icon_state = "gworm_wtf" filling_color = "#60A584" - -/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf/New() - ..() - reagents.add_reagent("space_drugs", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "space_drugs" = 2) // *********************************************************** // Jelly Bean Flavors @@ -482,146 +337,91 @@ desc = "A candy bean, guarenteed to not give you gas. It's red!" icon_state = "jbean_red" filling_color = "#801E28" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/red/New() - ..() - reagents.add_reagent("cherryjelly", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "cherryjelly" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's blue!" icon_state = "jbean_blue" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue/New() - ..() - reagents.add_reagent("berryjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "berryjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's blue!" icon_state = "jbean_blue" filling_color = "#863353" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison/New() - ..() - reagents.add_reagent("poisonberryjuice", 12) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 3 + list_reagents = list("poisonberryjuice" = 12) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's green!" icon_state = "jbean_green" filling_color = "#365E30" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green/New() - ..() - reagents.add_reagent("limejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "limejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's yellow!" icon_state = "jbean_yellow" filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow/New() - ..() - reagents.add_reagent("lemonjuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "lemonjuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's orange!" icon_state = "jbean_orange" filling_color = "#E78108" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange/New() - ..() - reagents.add_reagent("orangejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "orangejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's purple!" icon_state = "jbean_purple" filling_color = "#993399" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple/New() - ..() - reagents.add_reagent("grapejuice", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "grapejuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's chocolate!" icon_state = "jbean_choc" filling_color = "#302000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate/New() - ..() - reagents.add_reagent("chocolate",2) - bitesize = 3 + list_reagents = list("sugar" = 10, "chocolate" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's popcorn flavored!" icon_state = "jbean_popcorn" filling_color = "#664330" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn/New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's Cola flavored!" icon_state = "jbean_cola" filling_color = "#102000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola/New() - ..() - reagents.add_reagent("cola", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "cola" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/drgibb name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's Dr. Gibb flavored!" icon_state = "jbean_cola" filling_color = "#102000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/drgibb/New() - ..() - reagents.add_reagent("dr_gibb", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "dr_gibb" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/coffee name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. It's Coffee flavored!" icon_state = "jbean_choc" filling_color = "#482000" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/coffee/New() - ..() - reagents.add_reagent("coffee", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "coffee" = 2) /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf name = "jelly bean" desc = "A candy bean, guarenteed to not give you gas. You aren't sure what color it is." icon_state = "jbean_wtf" filling_color = "#60A584" - -/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf/New() - ..() - reagents.add_reagent("space_drugs", 2) - bitesize = 3 + list_reagents = list("sugar" = 10, "space_drugs" = 2) // *********************************************************** // Cotton Candy Flavors @@ -633,11 +433,7 @@ icon_state = "cottoncandy_red" trash = /obj/item/weapon/c_tube filling_color = "#801E28" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red/New() - ..() - reagents.add_reagent("cherryjelly", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "cherryjelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue name = "cotton candy" @@ -645,11 +441,7 @@ icon_state = "cottoncandy_blue" trash = /obj/item/weapon/c_tube filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue/New() - ..() - reagents.add_reagent("berryjuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "berryjuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison name = "cotton candy" @@ -657,14 +449,7 @@ icon_state = "cottoncandy_blue" trash = /obj/item/weapon/c_tube filling_color = "#863353" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison/New() - ..() - reagents.add_reagent("poisonberryjuice", 20) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 4 + list_reagents = list("poisonberryjuice" = 20) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green name = "cotton candy" @@ -672,11 +457,7 @@ icon_state = "cottoncandy_green" trash = /obj/item/weapon/c_tube filling_color = "#365E30" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green/New() - ..() - reagents.add_reagent("limejuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "limejuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow name = "cotton candy" @@ -684,11 +465,7 @@ icon_state = "cottoncandy_yellow" trash = /obj/item/weapon/c_tube filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow/New() - ..() - reagents.add_reagent("lemonjuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "lemonjuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange name = "cotton candy" @@ -696,11 +473,7 @@ icon_state = "cottoncandy_orange" trash = /obj/item/weapon/c_tube filling_color = "#E78108" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange/New() - ..() - reagents.add_reagent("orangejuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "orangejuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple name = "cotton candy" @@ -708,11 +481,7 @@ icon_state = "cottoncandy_purple" trash = /obj/item/weapon/c_tube filling_color = "#993399" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple/New() - ..() - reagents.add_reagent("grapejuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "grapejuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink name = "cotton candy" @@ -720,11 +489,7 @@ icon_state = "cottoncandy_pink" trash = /obj/item/weapon/c_tube filling_color = "#863333" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink/New() - ..() - reagents.add_reagent("watermelonjuice", 5) - bitesize = 4 + list_reagents = list("sugar" = 15, "watermelonjuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow name = "cotton candy" @@ -732,14 +497,7 @@ icon_state = "cottoncandy_rainbow" trash = /obj/item/weapon/c_tube filling_color = "#C8A5DC" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow/New() - ..() - reagents.add_reagent("omnizine", 20) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 4 + list_reagents = list("omnizine" = 20) /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow name = "cotton candy" @@ -747,14 +505,7 @@ icon_state = "cottoncandy_rainbow" trash = /obj/item/weapon/c_tube filling_color = "#32127A" - -/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow/New() - ..() - reagents.add_reagent("sulfonal", 20) - spawn(1) - reagents.del_reagent("sugar") - reagents.update_total() - bitesize = 4 + list_reagents = list("sulfonal" = 20) // *********************************************************** // Candybar Flavors diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 931e84b892b..d7ffca96843 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -82,7 +82,7 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "you can't add anymore to [target]!") return - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "You transfer [trans] units of the condiment to [target].") /obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() @@ -223,7 +223,7 @@ return else to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") - src.reagents.trans_to(target, amount_per_transfer_from_this) + reagents.trans_to(target, amount_per_transfer_from_this) qdel(src) /obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change() diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 78651f97b0c..77e3f22a1e8 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -1,4 +1,4 @@ -/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/S = new(get_turf(user)) S.attackby(W,user, params) @@ -6,13 +6,13 @@ else ..() -/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/burger/S = new(get_turf(user)) S.attackby(W,user, params) qdel(src) -/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza/S = new(get_turf(user)) S.attackby(W,user, params) @@ -21,7 +21,7 @@ ..() -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user)) S.attackby(W,user, params) @@ -30,7 +30,7 @@ ..() -/obj/item/trash/plate/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/trash/plate/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom/S = new(get_turf(user)) S.attackby(W,user, params) @@ -44,7 +44,7 @@ icon = 'icons/obj/food/food.dmi' icon_state = "soup" -/obj/item/trash/bowl/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/trash/bowl/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/S = new(get_turf(user)) @@ -54,7 +54,6 @@ ..() /obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich - /obj/item/weapon/reagent_containers/food/snacks/customizable name = "sandwich" desc = "A sandwich! A timeless classic." icon_state = "breadslice" @@ -79,12 +78,7 @@ trash = /obj/item/trash/plate bitesize = 2 var/list/ingredients = list() - - New() - ..() - - reagents.add_reagent("nutriment", 8) - + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/customizable/pizza name = "personal pizza" @@ -323,7 +317,7 @@ toptype = new /obj/item/weapon/reagent_containers/food/snacks/bun() /obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) - if(src.contents.len > sandwich_limit) + if(contents.len > sandwich_limit) to_chat(user, "If you put anything else in or on [src] it's going to make a mess.") return if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks)) @@ -351,7 +345,7 @@ for(var/obj/item/O in ingredients) i++ if(!fullycustom) - var/image/I = new(src.icon, "[baseicon]_filling") + var/image/I = new(icon, "[baseicon]_filling") if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/food = O if(!food.filling_color == "#FFFFFF") @@ -372,7 +366,7 @@ overlays += O.overlays if(top) - var/image/T = new(src.icon, "[baseicon]_top") + var/image/T = new(icon, "[baseicon]_top") T.pixel_x = pick(list(-1,0,1)) T.pixel_y = (ingredients.len * 2)+1 overlays += T @@ -388,24 +382,6 @@ to_chat(user, " You think you can see [whatsinside] in there.") -/* -/obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES - - var/obj/item/shard - for(var/obj/item/O in contents) - if(istype(O,/obj/item/weapon/shard)) - shard = O - break - - var/mob/living/H - if(istype(M,/mob/living)) - H = M - - if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. - ..() -*/ /obj/item/weapon/reagent_containers/food/snacks/customizable/proc/newname() var/unsorteditems[0] @@ -487,7 +463,7 @@ sendback = "[pick(list("absurd","colossal","enormous","ridiculous","massive","oversized","cardiac-arresting","pipe-clogging","edible but sickening","sickening","gargantuan","mega","belly-burster","chest-burster"))] [basename]" return sendback -/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(var/list/unsorted, var/highest) +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(list/unsorted, highest) var/sorted[0] for(var/i = 1, i<= highest, i++) for(var/it in unsorted) diff --git a/code/modules/food_and_drinks/food/meat.dm b/code/modules/food_and_drinks/food/meat.dm index 76de76530ea..4635f6eb9b1 100644 --- a/code/modules/food_and_drinks/food/meat.dm +++ b/code/modules/food_and_drinks/food/meat.dm @@ -4,16 +4,11 @@ icon_state = "meat" health = 180 filling_color = "#FF1C1C" - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3) -/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if( \ - istype(W, /obj/item/weapon/kitchen/knife) || \ - istype(W, /obj/item/weapon/scalpel) \ - ) +/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/scalpel)) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) @@ -49,6 +44,4 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/ham name = "Ham" desc = "Taste like bacon." - New() - ..() - reagents.add_reagent("porktonium", 10) + list_reagents = list("protein" = 3, "porktonium" = 10) \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/seafood.dm b/code/modules/food_and_drinks/food/seafood.dm index 410c225247c..c0a95d39315 100644 --- a/code/modules/food_and_drinks/food/seafood.dm +++ b/code/modules/food_and_drinks/food/seafood.dm @@ -5,12 +5,8 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) - src.bitesize = 6 + bitesize = 6 + list_reagents = list("protein" = 3, "carpotoxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/salmonmeat name = "raw salmon" @@ -18,11 +14,8 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/salmonsteak name = "Salmon steak" @@ -31,14 +24,8 @@ icon_state = "salmonsteak" trash = /obj/item/trash/plate filling_color = "#7A3D11" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 3 - + bitesize = 3 + list_reagents = list("nutriment" = 4, "sodiumchloride" = 1, "blackpepper" = 1) /obj/item/weapon/reagent_containers/food/snacks/catfishmeat name = "raw catfish" @@ -46,11 +33,8 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/fishfingers name = "Fish Fingers" @@ -58,15 +42,8 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfingers" filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("carpotoxin", 3) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4, "carpotoxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/fishburger name = "Fillet -o- Carp Sandwich" @@ -74,12 +51,8 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishburger" filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "carpotoxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/cubancarp name = "Cuban Carp" @@ -88,13 +61,8 @@ icon_state = "cubancarp" trash = /obj/item/trash/plate filling_color = "#E9ADFF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "carpotoxin" = 3, "capsaicin" = 3) /obj/item/weapon/reagent_containers/food/snacks/fishandchips name = "Fish and Chips" @@ -102,168 +70,117 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "fishandchips" filling_color = "#E3D796" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "carpotoxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/sashimi name = "carp sashimi" desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." icon = 'icons/obj/food/seafood.dmi' icon_state = "sashimi" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("toxin", 5) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "toxin" = 5) /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp name = "fried shrimp" desc = "Just one of the many things you can do with shrimp!" icon = 'icons/obj/food/seafood.dmi' icon_state = "shrimp_fried" - - New() - ..() - reagents.add_reagent("nutriment", 2) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp name = "boiled shrimp" desc = "Just one of the many things you can do with shrimp!" icon = 'icons/obj/food/seafood.dmi' icon_state = "shrimp_cooked" - - New() - ..() - reagents.add_reagent("nutriment", 2) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi name = "Ebi Sushi" desc = "A simple sushi consisting of cooked shrimp and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Ebi" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura name = "Ikura Sushi" desc = "A simple sushi consisting of salmon roe." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Ikura" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("protein", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2, "protein" = 1) /obj/item/weapon/reagent_containers/food/snacks/sushi_Sake name = "Sake Sushi" desc = "A simple sushi consisting of raw salmon and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Sake" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon name = "Smoked Salmon Sushi" desc = "A simple sushi consisting of cooked salmon and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_SmokedSalmon" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Tamago name = "Tamago Sushi" desc = "A simple sushi consisting of egg and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Tamago" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Inari name = "Inari Sushi" desc = "A piece of fried tofu stuffed with rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Inari" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Masago name = "Masago Sushi" desc = "A simple sushi consisting of goldfish roe." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Masago" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("protein", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2, "protein" = 1) /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko name = "Tobiko Sushi" desc = "A simple sushi consisting of shark roe." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Masago" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("protein", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2, "protein" = 1) /obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg name = "Tobiko and Egg Sushi" desc = "A sushi consisting of shark roe and an egg." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_TobikoEgg" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("protein", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2, "protein" = 1) /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai name = "Tai Sushi" desc = "A simple sushi consisting of catfish and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Tai" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/sushi_Unagi name = "Unagi Sushi" desc = "A simple sushi consisting of eel and rice." icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Hokki" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 \ No newline at end of file + bitesize = 3 + list_reagents = list("nutriment" = 2) \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index d403b4aae4b..49cd0c1fa3b 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -4,7 +4,6 @@ desc = "yummy" icon = 'icons/obj/food/food.dmi' icon_state = null - bitesize = 1 var/bitecount = 0 var/trash = null var/slice_path @@ -38,10 +37,10 @@ /obj/item/weapon/reagent_containers/food/snacks/proc/Post_Consume(mob/living/M) return -/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob) +/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user) return -/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone) +/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone) if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. to_chat(user, "None of [src] left, oh no!") M.unEquip(src) //so icons update :[ @@ -64,11 +63,11 @@ if(bitecount==0) return else if(bitecount==1) - to_chat(user, "\blue \The [src] was bitten by someone!") + to_chat(user, "[src] was bitten by someone!") else if(bitecount<=3) - to_chat(user, "\blue \The [src] was bitten [bitecount] times!") + to_chat(user, "[src] was bitten [bitecount] times!") else - to_chat(user, "\blue \The [src] was bitten multiple times!") + to_chat(user, "[src] was bitten multiple times!") /obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params) @@ -93,10 +92,10 @@ "You scoop up some [src] with \the [U]!" \ ) - src.bitecount++ + bitecount++ U.overlays.Cut() var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color + I.color = filling_color U.overlays += I var/obj/item/weapon/reagent_containers/food/snacks/collected = new type @@ -136,7 +135,7 @@ else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) if(!iscarbon(user)) return 1 - to_chat(user, "\red You slip [W] inside [src].") + to_chat(user, "You slip [W] inside [src].") user.unEquip(W) if((user.client && user.s_active != src)) user.client.screen -= W @@ -147,28 +146,28 @@ else return 1 if( \ - !isturf(src.loc) || \ - !(locate(/obj/structure/table) in src.loc) && \ - !(locate(/obj/machinery/optable) in src.loc) && \ - !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ + !isturf(loc) || \ + !(locate(/obj/structure/table) in loc) && \ + !(locate(/obj/machinery/optable) in loc) && \ + !(locate(/obj/item/weapon/storage/bag/tray) in loc) \ ) - to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.") + to_chat(user, "You cannot slice [src] here! You need a table or at least a tray to do it.") return 1 var/slices_lost = 0 if(!inaccurate) user.visible_message( \ - "\blue [user] slices \the [src]!", \ - "\blue You slice \the [src]!" \ + "[user] slices [src]!", \ + "You slice [src]!" \ ) else user.visible_message( \ - "\blue [user] crudely slices \the [src] with [W]!", \ - "\blue You crudely slice \the [src] with your [W]!" \ + "[user] crudely slices [src] with [W]!", \ + "You crudely slice [src] with your [W]!" \ ) slices_lost = rand(1,min(1,round(slices_num/2))) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) - var/obj/slice = new slice_path (src.loc) + var/obj/slice = new slice_path (loc) reagents.trans_to(slice,reagents_per_slice) qdel(src) @@ -185,19 +184,19 @@ M.changeNext_move(CLICK_CD_MELEE) if(iscorgi(M)) if(bitecount >= 4) - M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")].","You swallow up the last part of \the [src].") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","You swallow up the last part of [src].") + playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1) var/mob/living/simple_animal/pet/corgi/C = M C.adjustBruteLoss(-5) C.adjustFireLoss(-5) qdel(src) else - M.visible_message("[M] takes a bite of \the [src].","You take a bite of \the [src].") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + M.visible_message("[M] takes a bite of [src].","You take a bite of [src].") + playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1) bitecount++ else if(ismouse(M)) var/mob/living/simple_animal/mouse/N = M - to_chat(N, text("\blue You nibble away at [src].")) + to_chat(N, text("You nibble away at [src].")) if(prob(50)) N.visible_message("[N] nibbles away at [src].", "") //N.emote("nibbles away at the [src]") @@ -255,49 +254,8 @@ icon_state = "aesirsalad" trash = /obj/item/trash/snack_bowl filling_color = "#468C00" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 8) - bitesize = 3 - -/* -/obj/item/weapon/reagent_containers/food/snacks/candy - name = "candy" - desc = "Nougat, love it or hate it." - icon_state = "candy" - trash = /obj/item/trash/candy - filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/candy/donor - name = "Donor Candy" - desc = "A little treat for blood donors." - trash = /obj/item/trash/candy - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("sugar", 3) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/candy_corn - name = "candy corn" - desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." - icon_state = "candy_corn" - filling_color = "#FFFCB0" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - bitesize = 2 -*/ + bitesize = 3 + list_reagents = list("nutriment" = 8, "omnizine" = 8) /obj/item/weapon/reagent_containers/food/snacks/chips name = "chips" @@ -305,12 +263,7 @@ icon_state = "chips" trash = /obj/item/trash/chips filling_color = "#E8C31E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 1 + list_reagents = list("nutriment" = 3, "sodiumchloride" = 1) /obj/item/weapon/reagent_containers/food/snacks/cornchips name = "corn chips" @@ -318,123 +271,79 @@ icon_state = "chips" trash = /obj/item/trash/chips filling_color = "#E8C31E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/cookie name = "cookie" desc = "COOKIE!!!" icon_state = "COOKIE!!!" filling_color = "#DBC94F" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolatebar name = "Chocolate Bar" desc = "Such sweet, fattening food." icon_state = "chocolatebar" filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2, "chocolate" = 4) /obj/item/weapon/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs name = "Pile of Chocolate" desc = "A pile of pure chocolate pieces." icon_state = "cocoa" filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("chocolate",5) //no longer can be used to generate the reagent infinitely - bitesize = 2 + bitesize = 2 + list_reagents = list("chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolateegg name = "Chocolate Egg" desc = "Such sweet, fattening food." icon_state = "chocolateegg" filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("chocolate",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 3, "chocolate" = 4) /obj/item/weapon/reagent_containers/food/snacks/donut name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" filling_color = "#D9C386" + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/normal name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 - if(prob(30)) - src.icon_state = "donut2" - src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) + list_reagents = list("nutriment" = 3, "sprinkles" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() + ..() + if(prob(30)) + icon_state = "donut2" + name = "frosted donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/sprinkles name = "frosted donut" icon_state = "donut2" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 3) + list_reagents = list("nutriment" = 3, "sprinkles" = 3) /obj/item/weapon/reagent_containers/food/snacks/donut/chaos name = "Chaos Donut" desc = "Like life, it never quite tastes the same." icon_state = "donut1" filling_color = "#ED11E6" + bitesize = 10 - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - bitesize = 10 - var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(chaosselect) - if(1) - reagents.add_reagent("nutriment", 3) - if(2) - reagents.add_reagent("capsaicin", 3) - if(3) - reagents.add_reagent("frostoil", 3) - if(4) - reagents.add_reagent("sprinkles", 3) - if(5) - reagents.add_reagent("plasma", 3) - if(6) - reagents.add_reagent("chocolate", 3) - if(7) - reagents.add_reagent("slimejelly", 3) - if(8) - reagents.add_reagent("banana", 3) - if(9) - reagents.add_reagent("berryjuice", 3) - if(10) - reagents.add_reagent("omnizine", 3) - if(prob(30)) - src.icon_state = "donut2" - src.name = "Frosted Chaos Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() + ..() + var/extra_reagent = pick("nutriment", "capsaicin", "frostoil", "sprinkles", "plasma", "chocolate", "slimejelly", "banana", "berryjuice", "omnizine") + reagents.add_reagent("[extra_reagent]", 3) + if(prob(30)) + icon_state = "donut2" + name = "Frosted Chaos Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/jelly @@ -442,85 +351,75 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + bitesize = 5 + list_reagents = list("nutriment" = 3, "sprinkles" = 1, "berryjuice" = 5) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() + ..() + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly name = "Jelly Donut" desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + bitesize = 5 + list_reagents = list("nutriment" = 3, "sprinkles" = 1, "slimejelly" = 5) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() + ..() + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly name = "Jelly Donut" desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + bitesize = 5 + list_reagents = list("nutriment" = 3, "sprinkles" = 1, "cherryjelly" = 5) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() + ..() + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/egg name = "egg" desc = "An egg!" icon_state = "egg" filling_color = "#FDFFD1" + list_reagents = list("protein" = 1, "egg" = 5) - New() +/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) + ..() + var/turf/T = get_turf(hit_atom) + new/obj/effect/decal/cleanable/egg_smudge(T) + if(reagents) + reagents.reaction(hit_atom, TOUCH) + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params) + if(istype( W, /obj/item/toy/crayon )) + var/obj/item/toy/crayon/C = W + var/clr = C.colourName + + if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) + to_chat(usr, "The egg refuses to take on this color!") + return + + to_chat(usr, "You color \the [src] [clr]") + icon_state = "egg-[clr]" + item_color = clr + else ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("egg", 5) - - throw_impact(atom/hit_atom) - ..() - var/turf/T = get_turf(hit_atom) - new/obj/effect/decal/cleanable/egg_smudge(T) - if(reagents) - reagents.reaction(hit_atom, TOUCH) - qdel(src) - - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype( W, /obj/item/toy/crayon )) - var/obj/item/toy/crayon/C = W - var/clr = C.colourName - - if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, "\blue The egg refuses to take on this color!") - return - - to_chat(usr, "\blue You color \the [src] [clr]") - icon_state = "egg-[clr]" - item_color = clr - else - ..() /obj/item/weapon/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" @@ -559,25 +458,14 @@ desc = "A fried egg, with a touch of salt and pepper." icon_state = "friedegg" filling_color = "#FFDF78" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("egg", 5) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 1 + list_reagents = list("nutriment" = 2, "egg" = 5, "sodiumchloride" = 1, "blackpepper" = 1) /obj/item/weapon/reagent_containers/food/snacks/boiledegg name = "Boiled egg" desc = "A hard boiled egg." icon_state = "egg" filling_color = "#FFFFFF" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("egg", 5) + list_reagents = list("nutriment" = 2, "egg" = 5) /obj/item/weapon/reagent_containers/food/snacks/organ @@ -586,11 +474,8 @@ icon = 'icons/obj/surgery.dmi' icon_state = "appendix" filling_color = "#E00D34" - - New() - ..() - reagents.add_reagent("protein", 4) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 4) /obj/item/weapon/reagent_containers/food/snacks/appendix //yes, this is the same as meat. I might do something different in future @@ -599,11 +484,8 @@ icon = 'icons/obj/surgery.dmi' icon_state = "appendix" filling_color = "#E00D34" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed name = "inflamed appendix" @@ -616,179 +498,125 @@ icon_state = "tofu" desc = "We all love tofu." filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("plantmatter" = 3) /obj/item/weapon/reagent_containers/food/snacks/fried_tofu name = "Fried Tofu" icon_state = "tofu" desc = "Proof that even vegetarians crave unhealthy foods." filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/tofurkey name = "Tofurkey" desc = "A fake turkey made from tofu." icon_state = "tofurkey" filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("ether", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 12, "ether" = 3) /obj/item/weapon/reagent_containers/food/snacks/stuffing name = "Stuffing" desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" icon_state = "stuffing" filling_color = "#C9AC83" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" desc = "A slice from a huge mushroom." icon_state = "hugemushroomslice" filling_color = "#E0D7C5" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - reagents.add_reagent("psilocybin", 3) - src.bitesize = 6 + bitesize = 6 + list_reagents = list("plantmatter" = 3, "psilocybin" = 3) /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" desc = "A slice from a huge tomato" icon_state = "tomatomeat" filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 6 + bitesize = 6 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/bearmeat name = "bear meat" desc = "A very manly slab of meat." icon_state = "bearmeat" filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 12) - reagents.add_reagent("methamphetamine", 5) - src.bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 12, "methamphetamine" = 5) /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" desc = "A slab of meat" icon_state = "xenomeat" filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 6 + bitesize = 6 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/spidermeat name = "spider meat" desc = "A slab of spider meat." icon_state = "spidermeat" - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3, "toxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/lizardmeat name = "mutant lizard meat" desc = "Seems to be a slab of meat from some mutant lizard thing?" icon_state = "xenomeat" filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("protein" = 3, "toxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/spiderleg name = "spider leg" desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" icon_state = "spiderleg" - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("toxin", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 2, "toxin" = 2) /obj/item/weapon/reagent_containers/food/snacks/meatball name = "Meatball" desc = "A great meal all round." icon_state = "meatball" filling_color = "#DB0000" - New() - ..() - reagents.add_reagent("protein", 3) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 3) /obj/item/weapon/reagent_containers/food/snacks/sausage name = "Sausage" desc = "A piece of mixed, long meat." icon_state = "sausage" filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("porktonium", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 6, "porktonium" = 10) /obj/item/weapon/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" filling_color = "#DEDEAB" - - New() - ..() - reagents.add_reagent("nutriment", 4) + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket name = "Warm Donk-pocket" desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" filling_color = "#DEDEAB" + list_reagents = list("nutriment" = 4) - New() - ..() - reagents.add_reagent("nutriment", 4) - - Post_Consume(mob/living/M) - M.reagents.add_reagent("omnizine", 15) +/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket/Post_Consume(mob/living/M) + M.reagents.add_reagent("omnizine", 15) /obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket_weak name = "Lightly Warm Donk-pocket" desc = "The food of choice for the seasoned traitor. This one is lukewarm." icon_state = "donkpocket" filling_color = "#DEDEAB" - -/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket_weak/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("weak_omnizine", 3) + list_reagents = list("nutriment" = 4, "weak_omnizine" = 3) /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket name = "Donk-pocket" @@ -796,42 +624,31 @@ icon_state = "donkpocket" filling_color = "#DEDEAB" bitesize = 100 //nom the whole thing at once. + list_reagents = list("nutriment" = 1) - New() - ..() - reagents.add_reagent("nutriment", 1) - - Post_Consume(mob/living/M) - M.reagents.add_reagent("omnizine", 15) - M.reagents.add_reagent("teporone", 15) - M.reagents.add_reagent("synaptizine", 15) - M.reagents.add_reagent("salglu_solution", 15) - M.reagents.add_reagent("salbutamol", 15) - M.reagents.add_reagent("methamphetamine", 15) +/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket/Post_Consume(mob/living/M) + M.reagents.add_reagent("omnizine", 15) + M.reagents.add_reagent("teporone", 15) + M.reagents.add_reagent("synaptizine", 15) + M.reagents.add_reagent("salglu_solution", 15) + M.reagents.add_reagent("salbutamol", 15) + M.reagents.add_reagent("methamphetamine", 15) /obj/item/weapon/reagent_containers/food/snacks/brainburger name = "brainburger" desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" filling_color = "#F2B6EA" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("prions", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6, "prions" = 10) /obj/item/weapon/reagent_containers/food/snacks/ghostburger name = "Ghost Burger" desc = "Spooky! It doesn't look very filling." icon_state = "ghostburger" filling_color = "#FFF2FF" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - + bitesize = 2 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/human var/hname = "" @@ -842,52 +659,38 @@ name = "-burger" desc = "A bloody burger." icon_state = "hburger" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/cheeseburger name = "cheeseburger" desc = "The cheese adds a good flavor." icon_state = "cheeseburger" - New() - ..() - reagents.add_reagent("nutriment", 2) + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger name = "burger" desc = "The cornerstone of every nutritious breakfast." icon_state = "hburger" filling_color = "#D63C3C" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/tofuburger name = "Tofu Burger" desc = "What.. is that meat?" icon_state = "tofuburger" filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/roburger name = "roburger" desc = "The lettuce is the only organic component. Beep." icon_state = "roburger" filling_color = "#CCCCCC" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("nanomachines", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2, "nanomachines" = 10) /obj/item/weapon/reagent_containers/food/snacks/roburgerbig name = "roburger" @@ -895,49 +698,32 @@ icon_state = "roburger" filling_color = "#CCCCCC" volume = 100 - - New() - ..() - reagents.add_reagent("nanomachines", 100) - bitesize = 0.1 + bitesize = 0.1 + list_reagents = list("nanomachines" = 100) /obj/item/weapon/reagent_containers/food/snacks/xenoburger name = "xenoburger" desc = "Smells caustic. Tastes like heresy." icon_state = "xburger" filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/clownburger name = "Clown Burger" desc = "This tastes funny..." icon_state = "clownburger" filling_color = "#FF00FF" - - 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 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/mimeburger name = "Mime Burger" desc = "Its taste defies language." icon_state = "mimeburger" filling_color = "#FFFFFF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/omelette name = "Omelette Du Fromage" @@ -945,23 +731,15 @@ icon_state = "omelette" trash = /obj/item/trash/plate filling_color = "#FFF9A8" - - //var/herp = 0 - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 1 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/muffin name = "Muffin" desc = "A delicious and spongy little cake" icon_state = "muffin" filling_color = "#E0CF9B" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/pie name = "Banana Cream Pie" @@ -969,17 +747,13 @@ icon_state = "pie" trash = /obj/item/trash/plate filling_color = "#FBFFB8" - -/obj/item/weapon/reagent_containers/food/snacks/pie/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana",5) bitesize = 3 + list_reagents = list("nutriment" = 4, "banana" = 5) /obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) ..() - new/obj/effect/decal/cleanable/pie_smudge(src.loc) - src.visible_message("\red [src.name] splats.","\red You hear a splat.") + new/obj/effect/decal/cleanable/pie_smudge(loc) + visible_message("[src] splats.","You hear a splat.") qdel(src) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis @@ -987,11 +761,8 @@ desc = "No black birds, this is a good sign." icon_state = "berryclafoutis" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("berryjuice", 5) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4, "berryjuice" = 5) /obj/item/weapon/reagent_containers/food/snacks/waffles name = "waffles" @@ -999,11 +770,8 @@ icon_state = "waffles" trash = /obj/item/trash/waffles filling_color = "#E6DEB5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/eggplantparm name = "Eggplant Parmigiana" @@ -1011,11 +779,8 @@ icon_state = "eggplantparm" trash = /obj/item/trash/plate filling_color = "#4D2F5E" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/soylentgreen name = "Soylent Green" @@ -1023,11 +788,8 @@ icon_state = "soylent_green" trash = /obj/item/trash/waffles filling_color = "#B8E6B5" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/soylenviridians name = "Soylen Virdians" @@ -1035,12 +797,8 @@ icon_state = "soylent_yellow" trash = /obj/item/trash/waffles filling_color = "#E6FA61" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - + bitesize = 2 + list_reagents = list("nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/meatpie name = "Meat-pie" @@ -1048,11 +806,8 @@ desc = "An old barber recipe, very delicious!" trash = /obj/item/trash/plate filling_color = "#948051" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/tofupie name = "Tofu-pie" @@ -1060,42 +815,31 @@ desc = "A delicious tofu pie." trash = /obj/item/trash/plate filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/amanita_pie name = "amanita pie" desc = "Sweet and tasty poison pie." icon_state = "amanita_pie" filling_color = "#FFCCCC" - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("amanitin", 3) - reagents.add_reagent("psilocybin", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 5, "amanitin" = 3, "psilocybin" = 1) /obj/item/weapon/reagent_containers/food/snacks/plump_pie name = "plump pie" desc = "I bet you love stuff made out of plump helmets!" icon_state = "plump_pie" filling_color = "#B8279B" + bitesize = 2 + list_reagents = list("nutriment" = 8) - New() - ..() - if(prob(10)) - name = "exceptional plump pie" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/plump_pie/New() + ..() + if(prob(10)) + name = "exceptional plump pie" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" // What + reagents.add_reagent("omnizine", 5) /obj/item/weapon/reagent_containers/food/snacks/xemeatpie name = "Xeno-pie" @@ -1103,11 +847,8 @@ desc = "A delicious meatpie. Probably heretical." trash = /obj/item/trash/plate filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/wingfangchu name = "Wing Fang Chu" @@ -1115,12 +856,8 @@ icon_state = "wingfangchu" trash = /obj/item/trash/snack_bowl filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/human/kabob name = "-kabob" @@ -1128,11 +865,8 @@ desc = "A human meat, on a stick." trash = /obj/item/stack/rods filling_color = "#A85340" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/monkeykabob name = "Meat-kabob" @@ -1140,11 +874,8 @@ desc = "Delicious meat, on a stick." trash = /obj/item/stack/rods filling_color = "#A85340" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/tofukabob name = "Tofu-kabob" @@ -1152,11 +883,8 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/popcorn name = "Popcorn" @@ -1165,18 +893,18 @@ trash = /obj/item/trash/popcorn var/unpopped = 0 filling_color = "#FFFAD4" + bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 + list_reagents = list("nutriment" = 2) - New() - ..() - unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 - On_Consume(mob/M, mob/user) - if(prob(unpopped)) //lol ...what's the point? - to_chat(user, "\red You bite down on an un-popped kernel!") - unpopped = max(0, unpopped-1) - ..() +/obj/item/weapon/reagent_containers/food/snacks/popcorn/New() + ..() + unpopped = rand(1,10) +/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume(mob/M, mob/user) + if(prob(unpopped)) //lol ...what's the point? + to_chat(user, "You bite down on an un-popped kernel!") + unpopped = max(0, unpopped-1) + ..() /obj/item/weapon/reagent_containers/food/snacks/sosjerky name = "Scaredy's Private Reserve Beef Jerky" @@ -1184,11 +912,8 @@ desc = "Beef jerky made from the finest space cows." trash = /obj/item/trash/sosjerky filling_color = "#631212" - - New() - ..() - reagents.add_reagent("protein", 4) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 4) /obj/item/weapon/reagent_containers/food/snacks/pistachios name = "Pistachios" @@ -1196,11 +921,7 @@ desc = "A snack of deliciously salted pistachios. A perfectly valid choice..." trash = /obj/item/trash/pistachios filling_color = "#BAD145" - - New() - ..() - reagents.add_reagent("plantmatter", 6) - reagents.add_reagent("sodiumchloride", 1) + list_reagents = list("plantmatter" = 6, "sodiumchloride" = 1) /obj/item/weapon/reagent_containers/food/snacks/no_raisin name = "4no Raisins" @@ -1208,21 +929,15 @@ desc = "Best raisins in the universe. Not sure why." trash = /obj/item/trash/raisins filling_color = "#343834" - - New() - ..() - reagents.add_reagent("plantmatter", 6) + list_reagents = list("plantmatter" = 6) /obj/item/weapon/reagent_containers/food/snacks/spacetwinkie name = "Space Twinkie" icon_state = "space_twinkie" desc = "Guaranteed to survive longer then you will." filling_color = "#FFE591" - - New() - ..() - reagents.add_reagent("sugar", 4) - bitesize = 2 + bitesize = 2 + list_reagents = list("sugar" = 4) /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers name = "Cheesie Honkers" @@ -1230,79 +945,53 @@ desc = "Bite sized cheesie snacks that will honk all over your mouth" trash = /obj/item/trash/cheesie filling_color = "#FFA305" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("fake_cheese", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 4, "fake_cheese" = 2) /obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein name = "chow mein" desc = "What is in this anyways?" icon_state = "chinese1" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("beans", 3) - reagents.add_reagent("msg",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6, "beans" = 3, "msg" = 4) /obj/item/weapon/reagent_containers/food/snacks/chinese/tao name = "Admiral Yamamoto carp" desc = "Tastes like chicken." icon_state = "chinese2" - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("protein", 2) - reagents.add_reagent("msg",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 4, "protein" = 2, "msg" = 4) /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles name = "chinese newdles" desc = "Made fresh, weekly!" icon_state = "chinese3" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("msg",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6, "msg" = 4) /obj/item/weapon/reagent_containers/food/snacks/chinese/rice name = "fried rice" desc = "A timeless classic." icon_state = "chinese4" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("rice", 3) - reagents.add_reagent("msg",4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 3, "rice" = 3, "msg" = 4) /obj/item/weapon/reagent_containers/food/snacks/syndicake name = "Syndi-Cakes" icon_state = "syndi_cakes" desc = "An extremely moist snack cake that tastes just as good after being nuked." filling_color = "#FF5D05" - trash = /obj/item/trash/syndi_cakes - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("salglu_solution", 5) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4, "salglu_solution" = 5) /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato name = "Loaded Baked Potato" desc = "Totally baked." icon_state = "loadedbakedpotato" filling_color = "#9C7A68" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/fries name = "Space Fries" @@ -1310,11 +999,8 @@ icon_state = "fries" trash = /obj/item/trash/plate filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/soydope name = "Soy Dope" @@ -1322,22 +1008,15 @@ icon_state = "soydope" trash = /obj/item/trash/plate filling_color = "#C4BF76" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/spagetti name = "Spagetti" desc = "A bundle of raw spaghetti." icon_state = "spagetti" filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 1 + list_reagents = list("nutriment" = 1) /obj/item/weapon/reagent_containers/food/snacks/cheesyfries name = "Cheesy Fries" @@ -1345,38 +1024,30 @@ icon_state = "cheesyfries" trash = /obj/item/trash/plate filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/fortunecookie name = "Fortune cookie" desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" filling_color = "#E8E79E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/badrecipe name = "Burned mess" desc = "Someone should be demoted from chef for this." icon_state = "badrecipe" filling_color = "#211F02" + bitesize = 2 + list_reagents = list("????" = 5, "carbon" = 3) - New() - ..() - reagents.add_reagent("????", 5) - reagents.add_reagent("carbon", 3) - bitesize = 2 - - // it's burned! it should start off being classed as any cooktype that burns - cooktype["grilled"] = 1 - cooktype["deep fried"] = 1 +/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() + ..() + // it's burned! it should start off being classed as any cooktype that burns + cooktype["grilled"] = 1 + cooktype["deep fried"] = 1 /obj/item/weapon/reagent_containers/food/snacks/meatsteak name = "Meat steak" @@ -1384,13 +1055,8 @@ icon_state = "meatstake" trash = /obj/item/trash/plate filling_color = "#7A3D11" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4, "sodiumchloride" = 1, "blackpepper" = 1) /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "Spacy Liberty Duff" @@ -1398,12 +1064,8 @@ icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl filling_color = "#42B873" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("psilocybin", 6) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "psilocybin" = 6) /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "Amanita Jelly" @@ -1411,13 +1073,8 @@ icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("amanitin", 6) - reagents.add_reagent("psilocybin", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "amanitin" = 6, "psilocybin" = 3) /obj/item/weapon/reagent_containers/food/snacks/poppypretzel name = "Poppy pretzel" @@ -1425,12 +1082,7 @@ icon_state = "poppypretzel" bitesize = 2 filling_color = "#916E36" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/meatballsoup name = "Meatball soup" @@ -1438,50 +1090,32 @@ icon_state = "meatballsoup" trash = /obj/item/trash/snack_bowl filling_color = "#785210" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 8, "water" = 5) /obj/item/weapon/reagent_containers/food/snacks/slimesoup name = "slime soup" desc = "If no water is available, you may substitute tears." icon_state = "slimesoup" filling_color = "#C4DBA0" - - New() - ..() - reagents.add_reagent("slimejelly", 5) - reagents.add_reagent("water", 10) - bitesize = 5 + bitesize = 5 + list_reagents = list("slimejelly" = 5, "water" = 10) /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "Tomato soup" desc = "Smells like copper" icon_state = "tomatosoup" filling_color = "#FF0000" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("blood", 10) - reagents.add_reagent("water", 5) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5) /obj/item/weapon/reagent_containers/food/snacks/clownstears name = "Clown's Tears" desc = "Not very funny." icon_state = "clownstears" filling_color = "#C4FBFF" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana", 5) - reagents.add_reagent("water", 10) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 10) /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "Vegetable soup" @@ -1489,12 +1123,8 @@ icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 8, "water" = 5) /obj/item/weapon/reagent_containers/food/snacks/nettlesoup name = "Nettle soup" @@ -1502,13 +1132,8 @@ icon_state = "nettlesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - reagents.add_reagent("omnizine", 5) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 8, "water" = 5, "omnizine" = 5) /obj/item/weapon/reagent_containers/food/snacks/mysterysoup name = "Mystery soup" @@ -1516,46 +1141,46 @@ icon_state = "mysterysoup" trash = /obj/item/trash/snack_bowl filling_color = "#F082FF" + bitesize = 5 - New() - ..() - var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(mysteryselect) - if(1) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - if(2) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - if(3) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 5) - reagents.add_reagent("omnizine", 5) - if(4) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 10) - if(5) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("banana", 10) - if(6) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blood", 10) - if(7) - reagents.add_reagent("slimejelly", 10) - reagents.add_reagent("water", 10) - if(8) - reagents.add_reagent("carbon", 10) - reagents.add_reagent("toxin", 10) - if(9) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - if(10) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("oculine", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New() + ..() + var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) + switch(mysteryselect) + if(1) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + if(2) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + if(3) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 5) + reagents.add_reagent("omnizine", 5) + if(4) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 10) + if(5) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("banana", 10) + if(6) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blood", 10) + if(7) + reagents.add_reagent("slimejelly", 10) + reagents.add_reagent("water", 10) + if(8) + reagents.add_reagent("carbon", 10) + reagents.add_reagent("toxin", 10) + if(9) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + if(10) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("oculine", 5) /obj/item/weapon/reagent_containers/food/snacks/wishsoup name = "Wish Soup" @@ -1563,14 +1188,14 @@ icon_state = "wishsoup" trash = /obj/item/trash/snack_bowl filling_color = "#D1F4FF" + bitesize = 5 + list_reagents = list("water" = 10) - New() - ..() - reagents.add_reagent("water", 10) - bitesize = 5 - if(prob(25)) - src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) +/obj/item/weapon/reagent_containers/food/snacks/wishsoup/New() + ..() + if(prob(25)) + desc = "A wish come true!" // hue + reagents.add_reagent("nutriment", 8) /obj/item/weapon/reagent_containers/food/snacks/hotchili name = "Hot Chili" @@ -1578,50 +1203,31 @@ icon_state = "hotchili" trash = /obj/item/trash/snack_bowl filling_color = "#FF3C00" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 - + bitesize = 5 + list_reagents = list("nutriment" = 6, "capsaicin" = 3, "tomatojuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/coldchili name = "Cold Chili" desc = "This slush is barely a liquid!" icon_state = "coldchili" filling_color = "#2B00FF" - trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 + bitesize = 5 + list_reagents = list("nutriment" = 6, "frostoil" = 3, "tomatojuice" = 2) /obj/item/weapon/reagent_containers/food/snacks/raw_bacon name = "raw bacon" desc = "It's fleshy and pink!" icon_state = "raw_bacon" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("porktonium", 10) + list_reagents = list("nutriment" = 1, "porktonium" = 10) /obj/item/weapon/reagent_containers/food/snacks/bacon name = "bacon" desc = "It looks juicy and tastes amazing!" icon_state = "bacon2" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("porktonium", 10) - reagents.add_reagent("msg", 4) - + list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4) /obj/item/weapon/reagent_containers/food/snacks/telebacon name = "Tele Bacon" @@ -1629,15 +1235,16 @@ icon_state = "bacon" var/obj/item/device/radio/beacon/bacon/baconbeacon bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("porktonium", 10) - baconbeacon = new /obj/item/device/radio/beacon/bacon(src) - On_Consume(mob/M, mob/user) - if(!reagents.total_volume) - baconbeacon.loc = user - baconbeacon.digest_delay() + list_reagents = list("nutriment" = 4, "porktonium" = 10) + +/obj/item/weapon/reagent_containers/food/snacks/telebacon/New() + ..() + baconbeacon = new /obj/item/device/radio/beacon/bacon(src) + +/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume(mob/M, mob/user) + if(!reagents.total_volume) + baconbeacon.loc = user + baconbeacon.digest_delay() /obj/item/weapon/reagent_containers/food/snacks/monkeycube @@ -1647,13 +1254,11 @@ bitesize = 12 filling_color = "#ADAC7F" var/monkey_type = "Monkey" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() - ..() - reagents.add_reagent("protein",10) + list_reagents = list("protein" = 10) /obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity) - if(!proximity) return + if(!proximity) + return if(istype(O,/obj/structure/sink) && !wrapped) to_chat(user, "You place [src] under a stream of water...") user.drop_item() @@ -1737,22 +1342,16 @@ desc = "This is absolutely Ei Nath." icon_state = "spellburger" filling_color = "#D505FF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger name = "Big Bite Burger" desc = "Forget the Big Mac. THIS is the future!" icon_state = "bigbiteburger" filling_color = "#E3D681" - - New() - ..() - reagents.add_reagent("nutriment", 14) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 14) /obj/item/weapon/reagent_containers/food/snacks/enchiladas name = "Enchiladas" @@ -1760,12 +1359,8 @@ icon_state = "enchiladas" trash = /obj/item/trash/tray filling_color = "#A36A1F" - - New() - ..() - reagents.add_reagent("nutriment",8) - reagents.add_reagent("capsaicin", 6) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 8, "capsaicin" = 6) /obj/item/weapon/reagent_containers/food/snacks/burrito name = "Burrito" @@ -1773,10 +1368,7 @@ icon_state = "burrito" trash = /obj/item/trash/plate filling_color = "#A36A1F" - -/obj/item/weapon/reagent_containers/food/snacks/burrito/New() - ..() - reagents.add_reagent("nutriment", 5) + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/chimichanga name = "Chimichanga" @@ -1784,11 +1376,7 @@ icon_state = "chimichanga" trash = /obj/item/trash/plate filling_color = "#A36A1F" - -/obj/item/weapon/reagent_containers/food/snacks/chimichanga/New() - ..() - reagents.add_reagent("omnizine", 4) //Deadpool reference. Deal with it. - reagents.add_reagent("cheese", 2) + list_reagents = list("omnizine" = 4, "cheese" = 2) //Deadpool reference. Deal with it. /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight name = "monkey's Delight" @@ -1796,27 +1384,16 @@ icon_state = "monkeysdelight" trash = /obj/item/trash/tray filling_color = "#5C3C11" - - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("banana", 5) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 6 + bitesize = 6 + list_reagents = list("nutriment" = 10, "banana" = 5, "blackpepper" = 1, "sodiumchloride" = 1) /obj/item/weapon/reagent_containers/food/snacks/baguette name = "Baguette" desc = "Bon appetit!" icon_state = "baguette" filling_color = "#E3D796" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 6, "blackpepper" = 1, "sodiumchloride" = 1) /obj/item/weapon/reagent_containers/food/snacks/sandwich name = "Sandwich" @@ -1824,11 +1401,8 @@ icon_state = "sandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich name = "Toasted Sandwich" @@ -1836,12 +1410,8 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carbon", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6, "carbon" = 2) /obj/item/weapon/reagent_containers/food/snacks/grilledcheese name = "Grilled Cheese Sandwich" @@ -1849,11 +1419,8 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 7) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 7) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value? /obj/item/weapon/reagent_containers/food/snacks/tomatosoup name = "Tomato Soup" @@ -1861,12 +1428,8 @@ icon_state = "tomatosoup" trash = /obj/item/trash/snack_bowl filling_color = "#D92929" - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 5, "tomatojuice" = 10) /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles name = "Roffle Waffles" @@ -1874,26 +1437,16 @@ icon_state = "rofflewaffles" trash = /obj/item/trash/waffles filling_color = "#FF00F7" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("psilocybin", 8) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 8, "psilocybin" = 8) /obj/item/weapon/reagent_containers/food/snacks/stew name = "Stew" desc = "A nice and warm stew. Healthy and strong." icon_state = "stew" filling_color = "#9E673A" - - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("oculine", 5) - reagents.add_reagent("water", 5) - bitesize = 10 + bitesize = 10 + list_reagents = list("nutriment" = 10, "tomatojuice" = 5, "oculine" = 5, "water" = 5) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast name = "Jellied Toast" @@ -1901,63 +1454,44 @@ icon_state = "jellytoast" trash = /obj/item/trash/plate filling_color = "#B572AB" - - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 1) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + list_reagents = list("nutriment" = 1, "cherryjelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + list_reagents = list("nutriment" = 1, "slimejelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger name = "Jelly Burger" desc = "Culinary delight..?" icon_state = "jellyburger" filling_color = "#B572AB" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + list_reagents = list("nutriment" = 5, "slimejelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + list_reagents = list("nutriment" = 5, "cherryjelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/milosoup name = "Milosoup" desc = "The universes best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 8, "water" = 5) /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat name = "Stewed Soy Meat" desc = "Even non-vegetarians will LOVE this!" icon_state = "stewedsoymeat" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti name = "Boiled Spagetti" @@ -1965,11 +1499,8 @@ icon_state = "spagettiboiled" trash = /obj/item/trash/plate filling_color = "#FCEE81" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledrice name = "Boiled Rice" @@ -1977,11 +1508,8 @@ icon_state = "boiledrice" trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/ricepudding name = "Rice Pudding" @@ -1989,11 +1517,8 @@ icon_state = "rpudding" trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/pastatomato name = "Spagetti" @@ -2001,12 +1526,8 @@ icon_state = "pastatomato" trash = /obj/item/trash/plate filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 10) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 6, "tomatojuice" = 10) /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti name = "Spagetti & Meatballs" @@ -2014,35 +1535,24 @@ icon_state = "meatballspagetti" trash = /obj/item/trash/plate filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("synaptizine", 5) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8, "synaptizine" = 5) /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "Spesslaw" desc = "A lawyers favourite" icon_state = "spesslaw" filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("synaptizine", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 8, "synaptizine" = 10) /obj/item/weapon/reagent_containers/food/snacks/poppypretzel name = "Poppy Pretzel" desc = "A large soft pretzel full of POP!" icon_state = "poppypretzel" filling_color = "#AB7D2E" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "Carrot Fries" @@ -2050,68 +1560,48 @@ icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#FAA005" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - reagents.add_reagent("oculine", 3) - bitesize = 2 + bitesize = 2 + list_reagents = list("plantmatter" = 3, "oculine" = 3) /obj/item/weapon/reagent_containers/food/snacks/superbiteburger name = "Super Bite Burger" desc = "This is a mountain of a burger. FOOD!" icon_state = "superbiteburger" filling_color = "#CCA26A" - - New() - ..() - reagents.add_reagent("nutriment", 50) - bitesize = 10 + bitesize = 10 + list_reagents = list("nutriment" = 50) /obj/item/weapon/reagent_containers/food/snacks/candiedapple name = "Candied Apple" desc = "An apple coated in sugary sweetness." icon_state = "candiedapple" filling_color = "#F21873" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 3) // A candy apple without sugar... /obj/item/weapon/reagent_containers/food/snacks/applepie name = "Apple Pie" desc = "A pie containing sweet sweet love... or apple." icon_state = "applepie" filling_color = "#E0EDC5" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 - + bitesize = 3 + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/cherrypie name = "Cherry Pie" desc = "Taste so good, make a grown man cry." icon_state = "cherrypie" filling_color = "#FF525A" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/twobread name = "Two Bread" desc = "It is very bitter and winy." icon_state = "twobread" filling_color = "#DBCC9A" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich name = "Jelly Sandwich" @@ -2119,41 +1609,28 @@ icon_state = "jellysandwich" trash = /obj/item/trash/plate filling_color = "#9E3A78" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + list_reagents = list("nutriment" = 2, "slimejelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + list_reagents = list("nutriment" = 2, "cherryjelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore name = "Boiled Slime Core" desc = "A boiled red thing." icon_state = "boiledrorocore" - New() - ..() - reagents.add_reagent("slimejelly", 5) - bitesize = 3 + bitesize = 3 + list_reagents = list("slimejelly" = 5) /obj/item/weapon/reagent_containers/food/snacks/mint name = "mint" desc = "it is only wafer thin." icon_state = "mint" filling_color = "#F2F2F2" - - New() - ..() - reagents.add_reagent("minttoxin", 1) - bitesize = 1 + list_reagents = list("minttoxin" = 2) /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup name = "chantrelle soup" @@ -2161,29 +1638,24 @@ icon_state = "mushroomsoup" trash = /obj/item/trash/snack_bowl filling_color = "#E386BF" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit name = "plump helmet biscuit" desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." icon_state = "phelmbiscuit" filling_color = "#CFB4C4" + bitesize = 2 + list_reagents = list("nutriment" = 5) - New() - ..() - if(prob(10)) - name = "exceptional plump helmet biscuit" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() + ..() + if(prob(10)) + name = "exceptional plump helmet biscuit" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" // Is this a reference? + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("omnizine", 5) /obj/item/weapon/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" @@ -2191,11 +1663,7 @@ icon_state = "chawanmushi" trash = /obj/item/trash/snack_bowl filling_color = "#F0F2E4" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/beetsoup name = "beet soup" @@ -2203,24 +1671,24 @@ icon_state = "beetsoup" trash = /obj/item/trash/snack_bowl filling_color = "#FAC9FF" + bitesize = 2 + list_reagents = list("nutriment" = 8) - 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" - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/beetsoup/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" /obj/item/weapon/reagent_containers/food/snacks/herbsalad name = "herb salad" @@ -2228,11 +1696,8 @@ icon_state = "herbsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 8) /obj/item/weapon/reagent_containers/food/snacks/validsalad name = "valid salad" @@ -2240,12 +1705,8 @@ icon_state = "validsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 8, "omnizine" = 5) /obj/item/weapon/reagent_containers/food/snacks/appletart name = "golden apple streusel tart" @@ -2253,33 +1714,24 @@ icon_state = "gappletart" trash = /obj/item/trash/plate filling_color = "#FFFF00" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("gold", 5) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 8, "gold" = 5) /obj/item/weapon/reagent_containers/food/snacks/dough_ball name = "ball of raw dough" desc = "A ball of raw dough, ready to be molded into new recipes." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/weapon/kitchen/rollingpin)) - user.visible_message( \ - "[user] flattens the dough with the rolling pin!", \ - "\blue You flatten the dough with your rolling pin!" \ - ) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src.loc) - qdel(src) + list_reagents = list("nutriment" = 3) + +/obj/item/weapon/reagent_containers/food/snacks/dough_ball/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W,/obj/item/weapon/kitchen/rollingpin)) + user.visible_message( \ + "[user] flattens the dough with the rolling pin!", \ + "You flatten the dough with your rolling pin!" \ + ) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc) + qdel(src) /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels @@ -2293,10 +1745,7 @@ icon_state = "flatdough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "slice of dough" @@ -2312,11 +1761,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice slices_num = 5 filling_color = "#FF7575" - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 20, "nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice name = "meatbread slice" @@ -2333,11 +1779,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice slices_num = 5 filling_color = "#8AFF75" - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 20, "nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice name = "xenomeatbread slice" @@ -2353,12 +1796,8 @@ icon_state = "spidermeatbread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("toxin", 15) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 20, "nutriment" = 10, "toxin" = 15) /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice name = "spider meat bread slice" @@ -2366,9 +1805,7 @@ icon_state = "xenobreadslice" trash = /obj/item/trash/plate bitesize = 2 - New() - ..() - reagents.add_reagent("toxin", 2) + list_reagents = list("toxin" = 2) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread name = "Banana-nut bread" @@ -2377,11 +1814,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice slices_num = 5 filling_color = "#EDE5AD" - New() - ..() - reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) - bitesize = 2 + bitesize = 2 + list_reagents = list("banana" = 20, "nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice name = "Banana-nut bread slice" @@ -2398,10 +1832,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice slices_num = 5 filling_color = "#F7FFE0" - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 30) /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice name = "Tofubread slice" @@ -2411,7 +1843,6 @@ filling_color = "#F7FFE0" bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake name = "Carrot Cake" desc = "A favorite desert of a certain wascally wabbit. Not a lie." @@ -2419,11 +1850,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice slices_num = 5 filling_color = "#FFD675" - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("oculine", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 25, "oculine" = 10) /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice name = "Carrot Cake slice" @@ -2440,12 +1868,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice slices_num = 5 filling_color = "#E6AEDB" - New() - ..() - reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("mannitol", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 15, "nutriment" = 10, "mannitol" = 10) /obj/item/weapon/reagent_containers/food/snacks/braincakeslice name = "Brain Cake slice" @@ -2462,10 +1886,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice slices_num = 5 filling_color = "#FAF7AF" - New() - ..() - reagents.add_reagent("nutriment", 25) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 25) /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "Cheese Cake slice" @@ -2482,9 +1904,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice slices_num = 5 filling_color = "#F7EDD5" - New() - ..() - reagents.add_reagent("nutriment", 20) + list_reagents = list("nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice name = "Vanilla Cake slice" @@ -2501,9 +1921,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice slices_num = 5 filling_color = "#FADA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) + list_reagents = list("nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice name = "Orange Cake slice" @@ -2520,9 +1938,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice slices_num = 5 filling_color = "#CBFA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) + list_reagents = list("nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/limecakeslice name = "Lime Cake slice" @@ -2539,9 +1955,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice slices_num = 5 filling_color = "#FAFA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) + list_reagents = list("nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice name = "Lemon Cake slice" @@ -2558,10 +1972,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 filling_color = "#805930" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("chocolate",20) + list_reagents = list("nutriment" = 20, "chocolate" = 20) /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice name = "Chocolate Cake slice" @@ -2578,11 +1989,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge slices_num = 5 filling_color = "#FFF700" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("cheese", 20) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 20, "cheese" = 20) /obj/item/weapon/reagent_containers/food/snacks/cheesewedge name = "Cheese wedge" @@ -2597,12 +2005,7 @@ icon_state = "weirdcheesewedge" filling_color = "#00FF33" bitesize = 2 - New() - ..() - reagents.add_reagent("mercury", 5) - reagents.add_reagent("lsd", 5) - reagents.add_reagent("ethanol", 5) - reagents.add_reagent("weird_cheese", 5) + list_reagents = list("mercury" = 5, "lsd" = 5, "ethanol" = 5, "weird_cheese" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake name = "Birthday Cake" @@ -2611,11 +2014,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice slices_num = 5 filling_color = "#FFD6D6" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("sprinkles", 10) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 20, "sprinkles" = 10) /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice name = "Birthday Cake slice" @@ -2632,14 +2032,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice slices_num = 6 filling_color = "#FFE396" - - New() - ..() - reagents.add_reagent("nutriment", 6) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/breadslice name = "Bread slice" @@ -2648,10 +2042,7 @@ trash = /obj/item/trash/plate filling_color = "#D27332" bitesize = 2 - - New() - ..() - reagents.add_reagent("bread", 5) + list_reagents = list("bread" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread name = "Cream Cheese Bread" @@ -2660,10 +2051,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice slices_num = 5 filling_color = "#FFF896" - New() - ..() - reagents.add_reagent("nutriment", 20) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 20) /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice name = "Cream Cheese Bread slice" @@ -2673,7 +2062,6 @@ filling_color = "#FFF896" bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/watermelonslice name = "Watermelon Slice" desc = "A slice of watery goodness." @@ -2681,7 +2069,6 @@ filling_color = "#FF3867" bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "Apple Cake" desc = "A cake centred with Apple" @@ -2689,9 +2076,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 filling_color = "#EBF5B8" - New() - ..() - reagents.add_reagent("nutriment", 15) + list_reagents = list("nutriment" = 15) /obj/item/weapon/reagent_containers/food/snacks/applecakeslice name = "Apple Cake slice" @@ -2708,10 +2093,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice slices_num = 5 filling_color = "#F5B951" - - New() - ..() - reagents.add_reagent("nutriment", 15) + list_reagents = list("nutriment" = 15) /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "Pumpkin Pie slice" @@ -2726,10 +2108,7 @@ desc = "It's a salted cracker." icon_state = "cracker" filling_color = "#F5DEB8" - - New() - ..() - reagents.add_reagent("nutriment", 1) + list_reagents = list("nutriment" = 1) /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -2737,17 +2116,16 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawcutlet" bitesize = 1 - New() - ..() - reagents.add_reagent("protein", 1) - attackby(obj/item/weapon/W, mob/user, params) - if(istype(W,/obj/item/weapon/kitchen/knife)) - user.visible_message( \ - "[user] cuts the raw cutlet with the knife!", \ - "You cut the raw cutlet with your knife!" \ - ) - new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(src.loc) - qdel(src) + list_reagents = list("protein" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W,/obj/item/weapon/kitchen/knife)) + user.visible_message( \ + "[user] cuts the raw cutlet with the knife!", \ + "You cut the raw cutlet with your knife!" \ + ) + new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(loc) + qdel(src) /////////////////////////////////////////////////PIZZA//////////////////////////////////////// @@ -2762,11 +2140,8 @@ icon_state = "pizzamargherita" slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 40) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 40, "tomatojuice" = 6) /obj/item/weapon/reagent_containers/food/snacks/margheritaslice name = "Margherita slice" @@ -2781,12 +2156,8 @@ icon_state = "meatpizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("protein", 30) - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 30, "nutriment" = 20, "tomatojuice" = 6) /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice name = "Meatpizza slice" @@ -2801,11 +2172,8 @@ icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("plantmatter", 25) - reagents.add_reagent("nutriment", 10) - bitesize = 2 + bitesize = 2 + list_reagents = list("plantmatter" = 25, "nutriment" = 10) /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice name = "Mushroompizza slice" @@ -2820,13 +2188,8 @@ icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("plantmatter", 20) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 6) - reagents.add_reagent("oculine", 12) - bitesize = 2 + bitesize = 2 + list_reagents = list("plantmatter" = 20, "nutriment" = 10, "tomatojuice" = 6, "oculine" = 12) /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "Vegetable pizza slice" @@ -2898,18 +2261,16 @@ icon_state = "pizzabox[boxes.len+1]" -/obj/item/pizzabox/attack_hand( mob/user as mob ) - - if( open && pizza ) - user.put_in_hands( pizza ) - - to_chat(user, "\red You take the [src.pizza] out of the [src].") - src.pizza = null +/obj/item/pizzabox/attack_hand(mob/user) + if(open && pizza) + user.put_in_hands(pizza) + to_chat(user, "You take the [pizza] out of the [src].") + pizza = null update_icon() return - if( boxes.len > 0 ) - if( user.get_inactive_hand() != src ) + if(boxes.len > 0) + if(user.get_inactive_hand() != src) ..() return @@ -2917,15 +2278,14 @@ boxes -= box user.put_in_hands( box ) - to_chat(user, "\red You remove the topmost [src] from your hand.") + to_chat(user, "You remove the topmost [src] from your hand.") box.update_icon() update_icon() return ..() -/obj/item/pizzabox/attack_self( mob/user as mob ) - - if( boxes.len > 0 ) +/obj/item/pizzabox/attack_self(mob/user) + if(boxes.len > 0) return open = !open @@ -2935,11 +2295,11 @@ update_icon() -/obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob , params) - if( istype(I, /obj/item/pizzabox/) ) +/obj/item/pizzabox/attackby( obj/item/I, mob/user, params) + if(istype(I, /obj/item/pizzabox/)) var/obj/item/pizzabox/box = I - if( !box.open && !src.open ) + if(!box.open && !open) // Make a list of all boxes to be added var/list/boxestoadd = list() boxestoadd += box @@ -2951,36 +2311,36 @@ box.loc = src box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit - src.boxes.Add( boxestoadd ) + boxes.Add( boxestoadd ) box.update_icon() update_icon() - to_chat(user, "\red You put the [box] ontop of the [src]!") + to_chat(user, "You put the [box] ontop of the [src]!") else - to_chat(user, "\red The stack is too high!") + to_chat(user, "The stack is too high!") else - to_chat(user, "\red Close the [box] first!") + to_chat(user, "Close the [box] first!") return - if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/)) // Long ass fucking object name - if( src.open ) + if(open) user.drop_item() I.loc = src - src.pizza = I + pizza = I update_icon() - to_chat(user, "\red You put the [I] in the [src]!") + to_chat(user, "You put the [I] in the [src]!") else - to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!") + to_chat(user, "You try to push the [I] through the lid but it doesn't work!") return - if( istype(I, /obj/item/weapon/pen/) ) + if(istype(I, /obj/item/weapon/pen/)) - if( src.open ) + if(open) return var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text @@ -3017,110 +2377,63 @@ name = "egg wrap" desc = "The precursor to Pigs in a Blanket." icon_state = "wrap" - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/beans name = "tin of beans" desc = "Musical fruit in a slightly less musical container." icon_state = "beans" - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("beans",10) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 10, "beans" = 10) /obj/item/weapon/reagent_containers/food/snacks/benedict name = "eggs benedict" desc = "There is only one egg on this, how rude." icon_state = "benedict" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("egg", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 3, "egg" = 3) /obj/item/weapon/reagent_containers/food/snacks/hotdog name = "hotdog" desc = "Fresh footlong ready to go down on." icon_state = "hotdog" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("ketchup", 3) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 3, "ketchup" = 3) /obj/item/weapon/reagent_containers/food/snacks/meatbun name = "meat bun" desc = "Has the potential to not be Dog." icon_state = "meatbun" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 6 + bitesize = 6 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich name = "icecream sandwich" desc = "Portable Ice-cream in it's own packaging." icon_state = "icecreamsandwich" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("ice", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2, "ice" = 2) /obj/item/weapon/reagent_containers/food/snacks/notasandwich name = "not-a-sandwich" desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." icon_state = "notasandwich" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." icon_state = "sugarcookie" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar", 5) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 2, "sugar" = 5) /obj/item/weapon/reagent_containers/food/snacks/friedbanana name = "Fried Banana" desc = "Goreng Pisang, also known as fried bananas." icon_state = "friedbanana" - New() - ..() - reagents.add_reagent("sugar", 5) - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("cornoil", 4) - -/obj/item/weapon/reagent_containers/food/snacks/tofurkey - name = "Tofurkey" - desc = "A fake turkey made from tofu." - icon_state = "tofurkey" - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("ether", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/stuffing - name = "Stuffing" - desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" - icon_state = "stuffing" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 + list_reagents = list("sugar" = 5, "nutriment" = 8, "cornoil" = 4) /obj/item/weapon/reagent_containers/food/snacks/dionaroast name = "roast diona" @@ -3128,46 +2441,31 @@ icon_state = "dionaroast" trash = /obj/item/trash/plate filling_color = "#75754B" - - New() - ..() - reagents.add_reagent("plantmatter", 4) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("radium", 2) - bitesize = 2 + bitesize = 2 + list_reagents = list("plantmatter" = 4, "nutriment" = 2, "radium" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg name = "boiled spider leg" desc = "A giant spider's leg that's still twitching after being cooked. Gross!" icon_state = "spiderlegcooked" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 2) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 3, "toxin" = 2) /obj/item/weapon/reagent_containers/food/snacks/spidereggs name = "spider eggs" desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." icon_state = "spidereggs" - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("toxin", 3) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 2, "toxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/spidereggsham name = "green eggs and ham" desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" icon_state = "spidereggsham" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("toxin", 3) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 6, "sodiumchloride" = 1, "toxin" = 3) /obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey name = "Turkey" @@ -3175,11 +2473,8 @@ icon_state = "turkey" slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice slices_num = 6 - New() - ..() - reagents.add_reagent("protein", 24) - reagents.add_reagent("nutriment", 18) - bitesize = 2 + bitesize = 2 + list_reagents = list("protein" = 24, "nutriment" = 18) /obj/item/weapon/reagent_containers/food/snacks/turkeyslice name = "turkey serving" @@ -3196,56 +2491,41 @@ trash = /obj/item/trash/plate filling_color = "#D6D9C1" bitesize = 2 - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("gravy", 5) - reagents.add_reagent("mashedpotatoes", 10) - bitesize = 2 + list_reagents = list("nutriment" = 5, "gravy" = 5, "mashedpotatoes" = 10) ////////////////////////////////ICE CREAM/////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/icecream - name = "ice cream" - desc = "Delicious ice cream." - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_cone" - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar",1) - bitesize = 1 - update_icon() + name = "ice cream" + desc = "Delicious ice cream." + icon = 'icons/obj/kitchen.dmi' + icon_state = "icecream_cone" + list_reagents = list("nutriment" = 1, "sugar" = 1) - update_icon() - overlays.Cut() - var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color") - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling +/obj/item/weapon/reagent_containers/food/snacks/icecream/New() + ..() + update_icon() + +/obj/item/weapon/reagent_containers/food/snacks/icecream/update_icon() + overlays.Cut() + var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color") + filling.icon += mix_color_from_reagents(reagents.reagent_list) + overlays += filling /obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone - name = "ice cream cone" - desc = "Delicious ice cream." - icon_state = "icecream_cone" - volume = 50 - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar",6) - reagents.add_reagent("ice",2) - bitesize = 3 + name = "ice cream cone" + desc = "Delicious ice cream." + icon_state = "icecream_cone" + volume = 50 + bitesize = 3 + list_reagents = list("nutriment" = 3, "sugar" = 7, "ice" = 2) /obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup - name = "chocolate ice cream cone" - desc = "Delicious ice cream." - icon_state = "icecream_cup" - volume = 50 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("chocolate",8) - reagents.add_reagent("ice",2) - bitesize = 6 + name = "chocolate ice cream cone" + desc = "Delicious ice cream." + icon_state = "icecream_cup" + volume = 50 + bitesize = 6 + list_reagents = list("nutriment" = 5, "chocolate" = 8, "ice" = 2) /obj/item/weapon/reagent_containers/food/snacks/cereal name = "box of cereal" @@ -3253,18 +2533,15 @@ icon = 'icons/obj/food/food.dmi' icon_state = "cereal_box" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) + list_reagents = list("nutriment" = 3) + /obj/item/weapon/reagent_containers/food/snacks/deepfryholder name = "Deep Fried Foods Holder Obj" desc = "If you can see this description the code for the deep fryer fucked up." icon = 'icons/obj/food/food.dmi' icon_state = "deepfried_holder_icon" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/dough name = "dough" @@ -3272,9 +2549,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) + list_reagents = list("nutriment" = 3) // Dough + rolling pin = flat dough /obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params) @@ -3296,9 +2571,7 @@ icon_state = "flat dough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 - New() - ..() - reagents.add_reagent("nutriment", 3) + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "dough slice" @@ -3306,29 +2579,22 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "doughslice" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 1) + list_reagents = list("nutriment" = 1) /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" desc = "The base for any self-respecting burger." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "bun" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 + bitesize = 3 + list_reagents = list("nutriment" = 4) /obj/item/weapon/reagent_containers/food/snacks/taco name = "taco" desc = "Take a bite!" icon_state = "taco" bitesize = 3 - New() - ..() - reagents.add_reagent("nutriment", 7) + list_reagents = list("nutriment" = 7) /obj/item/weapon/reagent_containers/food/snacks/cutlet name = "cutlet" @@ -3336,9 +2602,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "cutlet" bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 2) + list_reagents = list("protein" = 2) /obj/item/weapon/reagent_containers/food/snacks/rawmeatball name = "raw meatball" @@ -3346,18 +2610,14 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawmeatball" bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 2) + list_reagents = list("protein" = 2) /obj/item/weapon/reagent_containers/food/snacks/hotdog name = "hotdog" desc = "Unrelated to dogs, maybe." icon_state = "hotdog" bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 6) + list_reagents = list("protein" = 6) /obj/item/weapon/reagent_containers/food/snacks/flatbread name = "flatbread" @@ -3365,9 +2625,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flatbread" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) + list_reagents = list("nutriment" = 3) /obj/item/weapon/reagent_containers/food/snacks/rawsticks name = "raw potato sticks" @@ -3375,18 +2633,14 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawsticks" bitesize = 2 - New() - ..() - reagents.add_reagent("plantmatter", 3) + list_reagents = list("plantmatter" = 3) /obj/item/weapon/reagent_containers/food/snacks/ectoplasm name = "ectoplasm" desc = "A luminescent blob of what scientists refer to as 'ghost goo'." icon = 'icons/obj/wizard.dmi' icon_state = "ectoplasm" - New() - ..() - reagents.add_reagent("ectoplasm", 10) + list_reagents = list("ectoplasm" = 10) /obj/item/weapon/reagent_containers/food/snacks/liquidfood name = "\improper LiquidFood Ration" @@ -3394,12 +2648,8 @@ icon_state = "liquidfood" trash = /obj/item/trash/liquidfood filling_color = "#A8A8A8" - - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("iron", 3) - bitesize = 4 + bitesize = 4 + list_reagents = list("nutriment" = 20, "iron" = 3) /obj/item/weapon/reagent_containers/food/snacks/tastybread @@ -3408,8 +2658,5 @@ icon_state = "tastybread" trash = /obj/item/trash/tastybread filling_color = "#A66829" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + bitesize = 2 + list_reagents = list("nutriment" = 6) \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index b71bb0be2d4..fafa983cf1d 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -52,13 +52,13 @@ else overlays += image('icons/obj/kitchen.dmi', "gridle") -/obj/machinery/gibber/relaymove(mob/user as mob) +/obj/machinery/gibber/relaymove(mob/user) if(locked) return go_out() -/obj/machinery/gibber/attack_hand(mob/user as mob) +/obj/machinery/gibber/attack_hand(mob/user) if(stat & (NOPOWER|BROKEN)) return @@ -73,7 +73,7 @@ else startgibbing(user) -/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params) +/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = P if(G.state < 2) @@ -126,7 +126,7 @@ return user.visible_message("[user] starts to put [victim] into the gibber!") - src.add_fingerprint(user) + add_fingerprint(user) if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) user.visible_message("[user] stuffs [victim] into the gibber!") @@ -155,7 +155,7 @@ return for(var/obj/O in src) - O.loc = src.loc + O.loc = loc occupant.forceMove(get_turf(src)) occupant = null @@ -212,11 +212,11 @@ /obj/machinery/gibber/proc/startgibbing(var/mob/user, var/UserOverride=0) if(!istype(user) && !UserOverride) - log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)") + log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)") return if(UserOverride) - msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)") + msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)") if(operating) return @@ -236,7 +236,7 @@ var/slab_name = occupant.name var/slab_count = 3 var/slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human //gibber can only gib humans on paracode, no need to check meat type - var/slab_nutrition = src.occupant.nutrition / 15 + var/slab_nutrition = occupant.nutrition / 15 slab_nutrition /= slab_count @@ -352,7 +352,7 @@ feedinTopanim() return 1 -/obj/machinery/gibber/autogibber/proc/ejectclothes(var/mob/living/carbon/human/H) +/obj/machinery/gibber/autogibber/proc/ejectclothes(mob/living/carbon/human/H) if(!istype(H)) return 0 if(H != occupant) return 0 //only using H as a shortcut to typecast for(var/obj/O in H) @@ -367,7 +367,7 @@ if(O.flags & NODROP) qdel(O) //they are already dead by now H.unEquip(O) - O.loc = src.loc + O.loc = loc O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) sleep(1) @@ -375,7 +375,7 @@ if(C.flags & NODROP) qdel(C) H.unEquip(C) - C.loc = src.loc + C.loc = loc C.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) sleep(1) @@ -385,7 +385,7 @@ var/spats = 0 //keeps track of how many items get spit out. Don't show a message if none are found. for(var/obj/O in src) if(istype(O)) - O.loc = src.loc + O.loc = loc O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) spats++ sleep(1) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 5fbd65deddc..59f9ec60d12 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -24,10 +24,7 @@ /obj/machinery/icemachine/New() - var/datum/reagents/R = new/datum/reagents(500) - reagents = R - R.my_atom = src - + create_reagents(500) /obj/machinery/icemachine/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers/glass)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm index f0fb01efad2..19da4fb85ac 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm @@ -63,11 +63,11 @@ var/list/ingredients_source = list( while(ingredients.len < 11) ingredients.Add(5) -/obj/machinery/icecream_vat/attack_hand(mob/user as mob) +/obj/machinery/icecream_vat/attack_hand(mob/user) user.set_machine(src) interact(user) -/obj/machinery/icecream_vat/interact(mob/user as mob) +/obj/machinery/icecream_vat/interact(mob/user) var/dat dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).
" dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.
" @@ -91,7 +91,7 @@ var/list/ingredients_source = list( popup.set_content(dat) popup.open(0) -/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/weapon/reagent_containers)) if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream)) var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O @@ -99,7 +99,7 @@ var/list/ingredients_source = list( if(ingredients[ICECREAM_VANILLA] > 0) var/flavour_name = get_icecream_flavour_string(dispense_flavour) if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0) - src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I].") + visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I].") ingredients[dispense_flavour] -= 1 ingredients[ICECREAM_VANILLA] -= 1 @@ -127,7 +127,7 @@ var/list/ingredients_source = list( else var/obj/item/weapon/reagent_containers/R = O if(R.reagents) - src.visible_message("[user] has emptied all of [R] into [src].") + visible_message("[user] has emptied all of [R] into [src].") for(var/datum/reagent/current_reagent in R.reagents.reagent_list) if(ingredients_source[current_reagent.id]) add(ingredients_source[current_reagent.id], current_reagent.volume / 2) @@ -151,7 +151,7 @@ var/list/ingredients_source = list( ingredients[INGR_FLOUR] -= amount ingredients[INGR_SUGAR] -= amount ingredients[CONE_WAFFLE] += amount - src.visible_message("[user] cooks up some waffle cones.") + visible_message("[user] cooks up some waffle cones.") else to_chat(user, "You require sugar and flour to make waffle cones.") if(CONE_CHOC) @@ -160,7 +160,7 @@ var/list/ingredients_source = list( ingredients[CONE_WAFFLE] -= amount ingredients[FLAVOUR_CHOCOLATE] -= amount ingredients[CONE_CHOC] += amount - src.visible_message("[user] cooks up some chocolate cones.") + visible_message("[user] cooks up some chocolate cones.") else to_chat(user, "You require waffle cones and chocolate flavouring to make chocolate cones.") if(ICECREAM_VANILLA) @@ -169,7 +169,7 @@ var/list/ingredients_source = list( ingredients[INGR_ICE] -= amount ingredients[INGR_MILK] -= amount ingredients[ICECREAM_VANILLA] += amount - src.visible_message("[user] whips up some vanilla icecream.") + visible_message("[user] whips up some vanilla icecream.") else to_chat(user, "You require milk and ice to make vanilla icecream.") updateDialog() @@ -179,7 +179,7 @@ var/list/ingredients_source = list( return if(href_list["dispense"]) dispense_flavour = text2num(href_list["dispense"]) - src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") + visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") if(href_list["cone"]) var/dispense_cone = text2num(href_list["cone"]) @@ -187,11 +187,11 @@ var/list/ingredients_source = list( var/cone_name = get_icecream_flavour_string(dispense_cone) if(ingredients[dispense_cone] >= 1) ingredients[dispense_cone] -= 1 - var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc) + var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(loc) I.cone_type = cone_name I.icon_state = "icecream_cone_[cone_name]" I.desc = "Delicious [cone_name] cone, but no ice cream." - src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") + visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") else to_chat(usr, "There are no [cone_name] cones left!") updateDialog() @@ -202,7 +202,7 @@ var/list/ingredients_source = list( if(href_list["eject"]) if(held_container) - held_container.forceMove(src.loc) + held_container.forceMove(loc) held_container = null updateDialog() @@ -231,7 +231,7 @@ var/list/ingredients_source = list( /obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour) var/flavour_name = get_icecream_flavour_string(flavour) name = "[flavour_name] icecream" - src.overlays += "icecream_[flavour_name]" + overlays += "icecream_[flavour_name]" desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." ice_creamed = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index e1cb054690f..03ceb5c0034 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -35,7 +35,7 @@ return -/obj/machinery/juicer/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/obj/machinery/juicer/attackby(obj/item/O, mob/user, params) if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) if(beaker) @@ -46,9 +46,9 @@ return 0 O.forceMove(src) beaker = O - src.verbs += /obj/machinery/juicer/verb/detach + verbs += /obj/machinery/juicer/verb/detach update_icon() - src.updateUsrDialog() + updateUsrDialog() return 0 if(!is_type_in_list(O, allowed_items)) to_chat(user, "It doesn't look like that contains any juice.") @@ -57,24 +57,24 @@ to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") return 0 O.forceMove(src) - src.updateUsrDialog() + updateUsrDialog() return 0 -/obj/machinery/juicer/attack_ai(mob/user as mob) +/obj/machinery/juicer/attack_ai(mob/user) return 0 -/obj/machinery/juicer/attack_hand(mob/user as mob) +/obj/machinery/juicer/attack_hand(mob/user) user.set_machine(src) interact(user) -/obj/machinery/juicer/interact(mob/user as mob) // The microwave Menu +/obj/machinery/juicer/interact(mob/user) // The microwave Menu var/is_chamber_empty = 0 var/is_beaker_ready = 0 var/processing_chamber = "" var/beaker_contents = "" for(var/i in allowed_items) - for(var/obj/item/O in src.contents) + for(var/obj/item/O in contents) if(!istype(O,i)) continue processing_chamber+= "some [O]
" @@ -119,7 +119,7 @@ if("detach") detach() - src.updateUsrDialog() + updateUsrDialog() return /obj/machinery/juicer/verb/detach() @@ -130,8 +130,8 @@ return if(!beaker) return - src.verbs -= /obj/machinery/juicer/verb/detach - beaker.forceMove(src.loc) + verbs -= /obj/machinery/juicer/verb/detach + beaker.forceMove(loc) beaker = null update_icon() @@ -159,8 +159,8 @@ return if(!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) return - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) - for(var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents) + playsound(loc, 'sound/machines/juicer.ogg', 50, 1) + for(var/obj/item/weapon/reagent_containers/food/snacks/O in contents) var/r_id = get_juice_id(O) beaker.reagents.add_reagent(r_id,get_juice_amount(O)) qdel(O) diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 648f228bb54..ef7591e3955 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -32,8 +32,7 @@ ********************/ /obj/machinery/kitchen_machine/New() - reagents = new/datum/reagents(100) - reagents.my_atom = src + create_reagents(100) if(!available_recipes) available_recipes = new acceptable_items = new @@ -56,7 +55,7 @@ * Item Adding ********************/ -/obj/machinery/kitchen_machine/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/obj/machinery/kitchen_machine/attackby(obj/item/O, mob/user, params) if(operating) return if(!broken && dirty < 100) @@ -77,8 +76,8 @@ default_deconstruction_crowbar(O) - if(src.broken > 0) - if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver + if(broken > 0) + if(broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver user.visible_message( \ "[user] starts to fix part of \the [src].", \ "You start to fix part of \the [src]." \ @@ -88,8 +87,8 @@ "[user] fixes part of \the [src].", \ "You have fixed part of \the [src]." \ ) - src.broken = 1 // Fix it a bit - else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench + broken = 1 // Fix it a bit + else if(broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench user.visible_message( \ "[user] starts to fix part of \the [src].", \ "You start to fix part of \the [src]." \ @@ -99,14 +98,14 @@ "[user] fixes \the [src].", \ "You have fixed \the [src]." \ ) - src.icon_state = off_icon - src.broken = 0 // Fix it! - src.dirty = 0 // just to be sure - src.flags = OPENCONTAINER + icon_state = off_icon + broken = 0 // Fix it! + dirty = 0 // just to be sure + flags = OPENCONTAINER else to_chat(user, "It's broken!") return 1 - else if(src.dirty==100) // The machine is all dirty so can't be used! + else if(dirty==100) // The machine is all dirty so can't be used! if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them user.visible_message( \ "[user] starts to clean \the [src].", \ @@ -117,10 +116,10 @@ "[user] has cleaned \the [src].", \ "You have cleaned \the [src]." \ ) - src.dirty = 0 // It's clean! - src.broken = 0 // just to be sure - src.icon_state = off_icon - src.flags = OPENCONTAINER + dirty = 0 // It's clean! + broken = 0 // just to be sure + icon_state = off_icon + flags = OPENCONTAINER else //Otherwise bad luck!! to_chat(user, "It's dirty!") return 1 @@ -161,12 +160,12 @@ else to_chat(user, "You have no idea what you can cook with this [O].") return 1 - src.updateUsrDialog() + updateUsrDialog() -/obj/machinery/kitchen_machine/attack_ai(mob/user as mob) +/obj/machinery/kitchen_machine/attack_ai(mob/user) return 0 -/obj/machinery/kitchen_machine/attack_hand(mob/user as mob) +/obj/machinery/kitchen_machine/attack_hand(mob/user) user.set_machine(src) interact(user) @@ -174,15 +173,15 @@ * Machine Menu * ********************/ -/obj/machinery/kitchen_machine/interact(mob/user as mob) // The microwave Menu +/obj/machinery/kitchen_machine/interact(mob/user) // The microwave Menu if(panel_open || !anchored) return var/dat = "" - if(src.broken > 0) + if(broken > 0) dat = {"Bzzzzttttt"} - else if(src.operating) - dat = {"[pick(src.cook_verbs)] in progress!
Please wait...!
"} - else if(src.dirty==100) + else if(operating) + dat = {"[pick(cook_verbs)] in progress!
Please wait...!
"} + else if(dirty==100) dat = {"This [src] is dirty!
Please clean it before use!
"} else var/list/items_counts = new @@ -237,7 +236,7 @@ var/datum/browser/popup = new(user, name, name, 400, 400) popup.set_content(dat) popup.open(0) - onclose(user, "[src.name]") + onclose(user, "[name]") return @@ -298,14 +297,14 @@ byproduct = recipe.get_byproduct() stop() if(cooked) - cooked.forceMove(src.loc) + cooked.forceMove(loc) for(var/i=1,i\The [src] turns on.
", "You hear \a [src].") - src.operating = 1 - src.icon_state = on_icon - src.updateUsrDialog() + visible_message("\The [src] turns on.", "You hear \a [src].") + operating = 1 + icon_state = on_icon + updateUsrDialog() /obj/machinery/kitchen_machine/proc/abort() - src.operating = 0 // Turn it off again aferwards - src.icon_state = off_icon - src.updateUsrDialog() + operating = 0 // Turn it off again aferwards + icon_state = off_icon + updateUsrDialog() /obj/machinery/kitchen_machine/proc/stop() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.operating = 0 // Turn it off again aferwards - src.icon_state = off_icon - src.updateUsrDialog() + playsound(loc, 'sound/machines/ding.ogg', 50, 1) + operating = 0 // Turn it off again aferwards + icon_state = off_icon + updateUsrDialog() /obj/machinery/kitchen_machine/proc/dispose() for(var/obj/O in contents) - O.forceMove(src.loc) - if(src.reagents.total_volume) - src.dirty++ - src.reagents.clear_reagents() + O.forceMove(loc) + if(reagents.total_volume) + dirty++ + reagents.clear_reagents() to_chat(usr, "You dispose of \the [src]'s contents.") - src.updateUsrDialog() + updateUsrDialog() /obj/machinery/kitchen_machine/proc/muck_start() - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound - src.icon_state = dirty_icon // Make it look dirty!! + playsound(loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound + icon_state = dirty_icon // Make it look dirty!! /obj/machinery/kitchen_machine/proc/muck_finish() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.visible_message("\The [src] gets covered in muck!") - src.dirty = 100 // Make it dirty so it can't be used util cleaned - src.flags = null //So you can't add condiments - src.icon_state = dirty_icon // Make it look dirty too - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() + playsound(loc, 'sound/machines/ding.ogg', 50, 1) + visible_message("\The [src] gets covered in muck!") + dirty = 100 // Make it dirty so it can't be used util cleaned + flags = null //So you can't add condiments + icon_state = dirty_icon // Make it look dirty too + operating = 0 // Turn it off again aferwards + updateUsrDialog() /obj/machinery/kitchen_machine/proc/broke() var/datum/effect/system/spark_spread/s = new s.set_up(2, 1, src) s.start() - src.icon_state = broken_icon // Make it look all busted up and shit - src.visible_message("The [src] breaks!") //Let them know they're stupid - src.broken = 2 // Make it broken so it can't be used util fixed - src.flags = null //So you can't add condiments - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() + icon_state = broken_icon // Make it look all busted up and shit + visible_message("The [src] breaks!") //Let them know they're stupid + broken = 2 // Make it broken so it can't be used util fixed + flags = null //So you can't add condiments + operating = 0 // Turn it off again aferwards + updateUsrDialog() /obj/machinery/kitchen_machine/proc/fail() var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src) @@ -382,7 +381,7 @@ if(id) amount+=O.reagents.get_reagent_amount(id) qdel(O) - src.reagents.clear_reagents() + reagents.clear_reagents() ffuu.reagents.add_reagent("carbon", amount) ffuu.reagents.add_reagent("????", amount/10) ffuu.forceMove(get_turf(src)) @@ -392,8 +391,8 @@ return usr.set_machine(src) - if(src.operating) - src.updateUsrDialog() + if(operating) + updateUsrDialog() return switch(href_list["action"]) diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index dc283e65d6c..e70ac59209e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -33,7 +33,7 @@ cube_production = cubes_made required_grind = req_grind -/obj/machinery/monkey_recycler/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) return @@ -62,7 +62,7 @@ cycle_through = 0 to_chat(user, "You change the monkeycube type to [initial(cube_type.name)].") - if(src.stat != 0) //NOPOWER etc + if(stat != 0) //NOPOWER etc return if(istype(O, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O @@ -76,11 +76,11 @@ user.drop_item() qdel(target) to_chat(user, "You stuff the monkey in the machine.") - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) + playsound(loc, 'sound/machines/juicer.ogg', 50, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking use_power(500) - src.grinded++ + grinded++ sleep(50) pixel_x = initial(pixel_x) to_chat(user, "The machine now has [grinded] monkey\s worth of material stored.") @@ -90,15 +90,15 @@ to_chat(user, "The machine only accepts monkeys!") return -/obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) - if(src.stat != 0) //NOPOWER etc +/obj/machinery/monkey_recycler/attack_hand(mob/user) + if(stat != 0) //NOPOWER etc return if(grinded >= required_grind) to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.") - playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) + playsound(loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through - new cube_type(src.loc) + new cube_type(loc) to_chat(user, "The machine's display flashes that it has [grinded] monkey\s worth of material left.") else // I'm not sure if the \s macro works with a word in between; I'll play it safe to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm index 796e8c4bd4b..6a47eb94ff5 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/oven.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm @@ -60,7 +60,7 @@ food_choices.Remove(U) for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/cook)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/V = new U - src.food_choices += V + food_choices += V return /obj/machinery/cooking/candy @@ -75,5 +75,5 @@ food_choices.Remove(U) for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/candy)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/V = new U - src.food_choices += V + food_choices += V return diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index d2b810dc7bb..5183fe6a4fa 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -58,9 +58,9 @@ var/time = 40 /datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor) - if(src.output && loc && processor) + if(output && loc && processor) for(var/i = 0, i < processor.rating_amount, i++) - new src.output(loc) + new output(loc) if(what) qdel(what) @@ -154,9 +154,9 @@ return P return 0 -/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/obj/machinery/processor/attackby(obj/item/O, mob/user, params) - if(src.processing) + if(processing) to_chat(user, "\the [src] is already processing something!") return 1 @@ -191,25 +191,25 @@ what.loc = src return -/obj/machinery/processor/attack_hand(var/mob/user as mob) +/obj/machinery/processor/attack_hand(mob/user) if(stat & (NOPOWER|BROKEN)) //no power or broken return - if(src.processing) + if(processing) to_chat(user, "\the [src] is already processing something!") return 1 - if(src.contents.len == 0) + if(contents.len == 0) to_chat(user, "\the [src] is empty.") return 1 - src.processing = 1 + processing = 1 user.visible_message("[user] turns on [src].", \ "You turn on [src].", \ "You hear a food processor.") - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + playsound(loc, 'sound/machines/blender.ogg', 50, 1) use_power(500) var/total_time = 0 - for(var/O in src.contents) + for(var/O in contents) var/datum/food_processor_process/P = select_recipe(O) if(!P) log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") @@ -217,14 +217,14 @@ total_time += P.time sleep(total_time / rating_speed) - for(var/O in src.contents) + for(var/O in contents) var/datum/food_processor_process/P = select_recipe(O) if(!P) log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") continue - P.process_food(src.loc, O, src) - src.processing = 0 + P.process_food(loc, O, src) + processing = 0 - src.visible_message("\the [src] has finished processing.", \ + visible_message("\the [src] has finished processing.", \ "\the [src] has finished processing.", \ "You hear a food processor stopping.") diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index c6f7e54a003..2446b74ad22 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -53,7 +53,7 @@ A.forceMove(loc) return ..() -/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/proc/accept_check(obj/item/O) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) return 1 return 0 @@ -66,7 +66,7 @@ icon_on = "seeds" icon_off = "seeds-off" -/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/seeds/accept_check(obj/item/O) if(istype(O,/obj/item/seeds/)) return 1 return 0 @@ -77,7 +77,7 @@ icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" -/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/medbay/accept_check(obj/item/O) if(istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 if(istype(O,/obj/item/weapon/storage/pill_bottle/)) @@ -91,7 +91,7 @@ desc = "A refrigerated storage unit for slime extracts" req_access_txt = "47" -/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/secure/extract/accept_check(obj/item/O) if(istype(O,/obj/item/slime_extract)) return 1 return 0 @@ -103,7 +103,7 @@ icon_on = "smartfridge_chem" req_one_access_txt = "5;33" -/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O) if(istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 if(istype(O,/obj/item/weapon/storage/pill_bottle/)) @@ -134,7 +134,7 @@ nanomanager.update_uis(src) amount-- -/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O) if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) return 1 return 0 @@ -154,7 +154,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, /obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1) -/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(obj/item/O) if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker)) return 1 return 0 @@ -163,17 +163,17 @@ name = "\improper Drink Showcase" desc = "A refrigerated storage unit for tasty tasty alcohol." -/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) +/obj/machinery/smartfridge/drinks/accept_check(obj/item/O) if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) return 1 /obj/machinery/smartfridge/process() if(stat & (BROKEN|NOPOWER)) return - if(src.seconds_electrified > 0) - src.seconds_electrified-- - if(src.shoot_inventory && prob(2)) - src.throw_item() + if(seconds_electrified > 0) + seconds_electrified-- + if(shoot_inventory && prob(2)) + throw_item() /obj/machinery/smartfridge/power_change() var/old_stat = stat @@ -192,9 +192,9 @@ * Item Adding ********************/ -/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) +/obj/machinery/smartfridge/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/weapon/screwdriver) && anchored) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") overlays.Cut() @@ -271,20 +271,20 @@ return 1 return 0 -/obj/machinery/smartfridge/attack_ai(mob/user as mob) +/obj/machinery/smartfridge/attack_ai(mob/user) return 0 -/obj/machinery/smartfridge/attack_ghost(mob/user as mob) - return src.attack_hand(user) +/obj/machinery/smartfridge/attack_ghost(mob/user) + return attack_hand(user) -/obj/machinery/smartfridge/attack_hand(mob/user as mob) +/obj/machinery/smartfridge/attack_hand(mob/user) if(stat & (NOPOWER|BROKEN)) return wires.Interact(user) ui_interact(user) //Drag pill bottle to fridge to empty it into the fridge -/obj/machinery/smartfridge/MouseDrop_T(obj/over_object as obj, mob/user as mob) +/obj/machinery/smartfridge/MouseDrop_T(obj/over_object, mob/user) if(!istype(over_object, /obj/item/weapon/storage/pill_bottle)) //Only pill bottles, please return @@ -305,7 +305,7 @@ to_chat(user, "Some items are refused.") nanomanager.update_uis(src) -/obj/machinery/smartfridge/secure/emag_act(user as mob) +/obj/machinery/smartfridge/secure/emag_act(user) emagged = 1 locked = -1 to_chat(user, "You short out the product lock on [src].") @@ -314,7 +314,7 @@ * SmartFridge Menu ********************/ -/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) user.set_machine(src) var/data[0] @@ -336,7 +336,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) + ui = new(user, src, ui_key, "smartfridge.tmpl", name, 400, 500) ui.set_initial_data(data) ui.open() @@ -346,7 +346,7 @@ var/mob/user = usr var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - src.add_fingerprint(user) + add_fingerprint(user) if(href_list["close"]) user.unset_machine() @@ -387,7 +387,7 @@ item_quants[O]-- for(var/obj/T in contents) if(T.name == O) - T.forceMove(src.loc) + T.forceMove(loc) throw_item = T break break @@ -395,7 +395,7 @@ return 0 spawn(0) throw_item.throw_at(target,16,3,src) - src.visible_message("[src] launches [throw_item.name] at [target.name]!") + visible_message("[src] launches [throw_item.name] at [target.name]!") return 1 /************************ diff --git a/code/modules/food_and_drinks/recipes/recipes_candy.dm b/code/modules/food_and_drinks/recipes/recipes_candy.dm index 2ab54fc0e27..98f969a17ec 100644 --- a/code/modules/food_and_drinks/recipes/recipes_candy.dm +++ b/code/modules/food_and_drinks/recipes/recipes_candy.dm @@ -78,6 +78,11 @@ items = list(/obj/item/weapon/reagent_containers/food/snacks/egg) result = /obj/item/weapon/reagent_containers/food/snacks/candy/nougat +/datum/recipe/candy/nougat/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/candy/nougat/being_cooked = ..() + being_cooked.reagents.del_reagent("egg") + return being_cooked + // *********************************************************** // Base Candy Recipes (unflavored / plain) // *********************************************************** diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm index 4c459b737ff..5845e860c9d 100644 --- a/code/modules/food_and_drinks/recipes/recipes_grill.dm +++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm @@ -89,6 +89,11 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers +/datum/recipe/grill/fishfingers/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/fishfingers/being_cooked = ..() + being_cooked.reagents.del_reagent("egg") + return being_cooked + /datum/recipe/grill/cutlet items = list( /obj/item/weapon/reagent_containers/food/snacks/rawcutlet diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index 0f58955a2bf..5903e191b4e 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -205,10 +205,11 @@ reagents = list("water" = 5, "vodka" = 5) fruit = list("amanita" = 3) result = /obj/item/weapon/reagent_containers/food/snacks/amanitajelly - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/being_cooked = ..(container) - being_cooked.reagents.del_reagent("amanitin") - return being_cooked + +/datum/recipe/microwave/amanitajelly/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/being_cooked = ..() + being_cooked.reagents.del_reagent("amanitin") + return being_cooked /datum/recipe/microwave/meatballsoup reagents = list("water" = 10) @@ -538,10 +539,11 @@ datum/recipe/microwave/slimesandwich /datum/recipe/microwave/herbsalad fruit = list("ambrosia" = 3, "apple" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..(container) - being_cooked.reagents.del_reagent("toxin") - return being_cooked + +/datum/recipe/microwave/herbsalad/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..() + being_cooked.reagents.del_reagent("toxin") + return being_cooked /datum/recipe/microwave/aesirsalad fruit = list("ambrosiadeus" = 3, "goldapple" = 1) @@ -553,10 +555,11 @@ datum/recipe/microwave/slimesandwich /obj/item/weapon/reagent_containers/food/snacks/meatball, ) result = /obj/item/weapon/reagent_containers/food/snacks/validsalad - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..(container) - being_cooked.reagents.del_reagent("toxin") - return being_cooked + +/datum/recipe/microwave/validsalad/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..() + being_cooked.reagents.del_reagent("toxin") + return being_cooked ////////////////////////////FOOD ADDITTIONS/////////////////////////////// diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm index 9ee3ff3343e..d20c06e260f 100644 --- a/code/modules/food_and_drinks/recipes/recipes_oven.dm +++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm @@ -176,20 +176,22 @@ /obj/item/weapon/paper, ) result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie - make_food(var/obj/container as obj) + +/datum/recipe/oven/fortunecookie/make_food(obj/container) + var/obj/item/weapon/paper/paper = locate() in container + paper.loc = null //prevent deletion + var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..() + paper.loc = being_cooked + being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn + return being_cooked + +/datum/recipe/oven/fortunecookie/check_items(obj/container) + . = ..() + if(.) var/obj/item/weapon/paper/paper = locate() in container - paper.loc = null //prevent deletion - var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container) - paper.loc = being_cooked - being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn - return being_cooked - check_items(var/obj/container as obj) - . = ..() - if(.) - var/obj/item/weapon/paper/paper = locate() in container - if(!paper || !paper.info) - return -1 - return . + if(!paper || !paper.info) + return -1 + return . /datum/recipe/oven/pizzamargherita fruit = list("tomato" = 1) @@ -293,6 +295,11 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread +/datum/recipe/oven/bread/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread/being_cooked = ..() + being_cooked.reagents.del_reagent("egg") + return being_cooked + /datum/recipe/oven/applepie fruit = list("apple" = 1) items = list( @@ -377,6 +384,11 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/appletart +/datum/recipe/oven/appletart/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/appletart/being_cooked = ..() + being_cooked.reagents.del_reagent("egg") + return being_cooked + /datum/recipe/oven/cracker reagents = list("sodiumchloride" = 1) items = list( @@ -392,6 +404,11 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie +/datum/recipe/oven/sugarcookie/make_food(obj/container) + var/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/being_cooked = ..() + being_cooked.reagents.del_reagent("egg") + return being_cooked + /datum/recipe/oven/flatbread items = list( /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm index 005be6c1f7e..b6c943dbdab 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm @@ -31,7 +31,7 @@ /datum/crafting_recipe/cherrysandwich name = "Cherry Jelly Sandwich" reqs = list( - /datum/reagent/cherryjelly = 5, + /datum/reagent/consumable/cherryjelly = 5, /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry @@ -49,7 +49,7 @@ /datum/crafting_recipe/jellyburger name = "Cherry Jelly Burger" reqs = list( - /datum/reagent/cherryjelly = 5, + /datum/reagent/consumable/cherryjelly = 5, /obj/item/weapon/reagent_containers/food/snacks/bun = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index bc6692d72b1..712f368a078 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -13,9 +13,7 @@ ..() - var/datum/reagents/R = new/datum/reagents(50) - reagents = R - R.my_atom = src + create_reagents(50) //Handle some post-spawn var stuff. if(planttype) @@ -98,7 +96,7 @@ to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") add_logs(user, M, "attacked", src) - M.eye_blurry += force/7 + M.AdjustEyeBlurry(force/7) if(prob(20)) M.Paralyse(force / 6) M.Weaken(force / 15) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index e9c63ed8794..72bf80c58de 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -380,10 +380,12 @@ //--FalseIncarnate /obj/machinery/portable_atmospherics/hydroponics/verb/remove_label() - set name = "Remove Label" set category = "Object" set src in view(1) + + if(usr.incapacitated()) + return if(labelled) to_chat(usr, "You remove the label.") @@ -397,6 +399,9 @@ set name = "Set Light" set category = "Object" set src in view(1) + + if(usr.incapacitated()) + return var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) if(new_light) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 2f41c6cdb5c..4086403c6e0 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -13,19 +13,23 @@ origin_tech = "magnets=1;biotech=1" var/form_title var/last_data + var/print_cooldown = 0 + var/cooldown_length = 50 // Five seconds /obj/item/device/analyzer/plant_analyzer/proc/print_report_verb() set name = "Print Plant Report" set category = "Object" set src = usr - if(usr.stat || usr.restrained() || usr.lying) + if(usr.incapacitated()) return + print_report(usr) /obj/item/device/analyzer/plant_analyzer/Topic(href, href_list) if(..()) - return + return 1 + if(href_list["print"]) print_report(usr) @@ -33,6 +37,11 @@ if(!last_data) to_chat(user, "There is no scan data to print.") return + if(print_cooldown > world.time) + to_chat(user, "The printer is still cooling down.") + return + print_cooldown = world.time + cooldown_length + playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) P.name = "paper - [form_title]" diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm index da60e939987..fd92e6675f1 100644 --- a/code/modules/lighting/light_source.dm +++ b/code/modules/lighting/light_source.dm @@ -114,9 +114,9 @@ /datum/light_source/proc/parse_light_color() if(light_color) - lum_r = GetRedPart(light_color) / 255 - lum_g = GetGreenPart(light_color) / 255 - lum_b = GetBluePart(light_color) / 255 + lum_r = color2R(light_color) / 255 + lum_g = color2G(light_color) / 255 + lum_b = color2B(light_color) / 255 else lum_r = 1 lum_g = 1 @@ -195,7 +195,7 @@ effect_str.Cut() effect_turf.Cut() - + /datum/light_source/proc/forget_turf(turf/T) var/idx = effect_turf.Find(T) effect_turf.Cut(idx, idx + 1) diff --git a/code/modules/martial_arts/krav_maga.dm b/code/modules/martial_arts/krav_maga.dm index 9b589878475..e1a577e24fa 100644 --- a/code/modules/martial_arts/krav_maga.dm +++ b/code/modules/martial_arts/krav_maga.dm @@ -88,7 +88,7 @@ D.visible_message("[A] pounds [D] on the chest!", \ "[A] slams your chest! You can't breathe!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) - D.losebreath += 5 + D.AdjustLoseBreath(5) D.adjustOxyLoss(10) return 1 @@ -97,7 +97,7 @@ "[A] karate chops your neck, rendering you unable to speak for a short time!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.apply_damage(5, BRUTE) - D.silent += 10 + D.AdjustSilence(10) return 1 datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) @@ -170,4 +170,4 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi name = "krav maga gloves" desc = "These gloves can teach you to perform Krav Maga using nanochips." icon_state = "fightgloves" - item_state = "fightgloves" \ No newline at end of file + item_state = "fightgloves" diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index bc4e15eb598..960844a063a 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -66,7 +66,7 @@ D.visible_message("[A] knees [D] in the stomach!", \ "[A] winds you with a knee in the stomach!") D.audible_message("[D] gags!") - D.losebreath += 3 + D.AdjustLoseBreath(3) D.Stun(2) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) if(prob(80)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 1b1e4755e9b..9e4f7289532 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -344,7 +344,6 @@ desc = "An easily-compressable wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "smooth" - walltype = "shuttle" smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 11f0b3a11f4..a1fc5699d62 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -274,9 +274,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp A.icon = ui_style2icon(client.prefs.UI_style) A.desc = message var/old_layer = source.layer + var/old_plane = source.plane source.layer = FLOAT_LAYER + source.plane = FLOAT_PLANE A.overlays += source source.layer = old_layer + source.plane = old_plane to_chat(src, "(Click to re-enter)") if(sound) src << sound(sound) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 50a9527326a..f158534475e 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -28,7 +28,7 @@ //non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet. if(language && (language.flags & NONVERBAL)) - if(disabilities & BLIND || blinded) //blind people can't see dumbass + if(!has_vision()) //blind people can't see dumbass message = stars(message) if(!speaker || !(speaker in view(src))) @@ -65,7 +65,7 @@ if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) message = "[message]" - if(disabilities & DEAF || ear_deaf) + if(!can_hear()) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) to_chat(src, "You cannot hear yourself speak!") @@ -95,7 +95,7 @@ //non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet. if(language && (language.flags & NONVERBAL)) - if(disabilities & BLIND || blinded) //blind people can't see dumbass + if(!has_vision()) //blind people can't see dumbass message = stars(message) if(!speaker || !(speaker in view(src))) @@ -182,7 +182,7 @@ formatted = language.format_message_radio(message, verb) else formatted = "[verb], \"[message]\"" - if(disabilities & DEAF || ear_deaf) + if(!can_hear()) if(prob(20)) to_chat(src, "You feel your headset vibrate but can hear nothing from it!") else if(track) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fbb3c5edfd4..c9e410d9e9b 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -559,6 +559,17 @@ flags = RESTRICTED | HIVEMIND drone_only = 1 follow = 1 + +/datum/language/drone + name = "Drone" + desc = "An encrypted stream of data converted to speech patterns." + speech_verb = "states" + ask_verb = "queries" + exclaim_verb = "declares" + key = "]" + flags = RESTRICTED + follow = 1 + syllables = list ("beep", "boop") /datum/language/swarmer name = "Swarmer" @@ -594,7 +605,7 @@ return ..() // Can we speak this language, as opposed to just understanding it? -/mob/proc/can_speak(datum/language/speaking) +/mob/proc/can_speak_language(datum/language/speaking) return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 6797744fbf6..ca520ba9289 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -28,12 +28,14 @@ var/leaping = 0 ventcrawler = 2 + var/list/alien_organs = list() + /mob/living/carbon/alien/New() verbs += /mob/living/verb/mob_sleep verbs += /mob/living/verb/lay_down - internal_organs += new /obj/item/organ/internal/brain/xeno - internal_organs += new /obj/item/organ/internal/xenos/hivenode - for(var/obj/item/organ/internal/I in internal_organs) + alien_organs += new /obj/item/organ/internal/brain/xeno + alien_organs += new /obj/item/organ/internal/xenos/hivenode + for(var/obj/item/organ/internal/I in alien_organs) I.insert(src) ..() @@ -161,8 +163,8 @@ show_stat_emergency_shuttle_eta() -/mob/living/carbon/alien/SetStunned(amount) - ..(amount) +/mob/living/carbon/alien/SetStunned(amount, updating = 1, force = 0) + ..() if(!(status_flags & CANSTUN) && amount) // add some movement delay move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10 diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index 220b61e28d8..c6e2bcc510d 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -15,9 +15,8 @@ In all, this is a lot like the monkey code. /N return switch(M.a_intent) - if(I_HELP) - sleeping = max(0,sleeping-5) + AdjustSleeping(-5) resting = 0 AdjustParalysis(-3) AdjustStunned(-3) @@ -25,11 +24,12 @@ In all, this is a lot like the monkey code. /N visible_message("[M.name] nuzzles [src] trying to wake it up!") if(I_GRAB) - src.grabbedby(M) + grabbedby(M) return 1 else if(health > 0) + M.do_attack_animation(src) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) var/damage = 1 visible_message("[M.name] bites [src]!", \ @@ -39,13 +39,10 @@ In all, this is a lot like the monkey code. /N updatehealth() else to_chat(M, "[name] is too injured for that.") - return - /mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L as mob) return attack_alien(L) - /mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob) if(..()) //to allow surgery to return properly. return 0 @@ -56,7 +53,7 @@ In all, this is a lot like the monkey code. /N if(I_HELP) help_shake_act(M) if(I_GRAB) - src.grabbedby(M) + grabbedby(M) if(I_HARM, I_DISARM) return 1 return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index e45fa198006..1249c0f462c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -6,15 +6,13 @@ icon_state = "aliend_s" /mob/living/carbon/alien/humanoid/drone/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) if(src.name == "alien drone") src.name = text("alien drone ([rand(1, 1000)])") src.real_name = src.name - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone - internal_organs += new /obj/item/organ/internal/xenos/acidgland - internal_organs += new /obj/item/organ/internal/xenos/resinspinner + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone + alien_organs += new /obj/item/organ/internal/xenos/acidgland + alien_organs += new /obj/item/organ/internal/xenos/resinspinner ..() //Drones use the same base as generic humanoids. diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 60a1e5daa5f..bc1e1e4f56d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -6,13 +6,11 @@ icon_state = "alienh_s" /mob/living/carbon/alien/humanoid/hunter/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) if(name == "alien hunter") name = text("alien hunter ([rand(1, 1000)])") real_name = name - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter ..() /mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates() @@ -108,7 +106,7 @@ sleep(2)//Runtime prevention (infinite bump() calls on hulks) step_towards(src,L) else - weakened = 2 + Weaken(2, 1, 1) toggle_leap(0) pounce_cooldown = !pounce_cooldown @@ -116,7 +114,7 @@ pounce_cooldown = !pounce_cooldown else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") - weakened = 2 + Weaken(2, 1, 1) if(leaping) leaping = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index d93fb0a835c..2644ef8a306 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -35,15 +35,13 @@ overlays += I /mob/living/carbon/alien/humanoid/sentinel/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) if(name == "alien sentinel") name = text("alien sentinel ([rand(1, 1000)])") real_name = name - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel - internal_organs += new /obj/item/organ/internal/xenos/acidgland - internal_organs += new /obj/item/organ/internal/xenos/neurotoxin + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel + alien_organs += new /obj/item/organ/internal/xenos/acidgland + alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() /mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates() diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index b49bc8c1ad1..d50befa47f0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -31,9 +31,7 @@ overlays += I /mob/living/carbon/alien/humanoid/empress/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) //there should only be one queen for(var/mob/living/carbon/alien/humanoid/empress/E in living_mob_list) @@ -44,11 +42,11 @@ break real_name = src.name - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen - internal_organs += new /obj/item/organ/internal/xenos/acidgland - internal_organs += new /obj/item/organ/internal/xenos/eggsac - internal_organs += new /obj/item/organ/internal/xenos/resinspinner - internal_organs += new /obj/item/organ/internal/xenos/neurotoxin + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen + alien_organs += new /obj/item/organ/internal/xenos/acidgland + alien_organs += new /obj/item/organ/internal/xenos/eggsac + alien_organs += new /obj/item/organ/internal/xenos/resinspinner + alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() /mob/living/carbon/alien/humanoid/empress diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 5692c99e9be..b99cde337d6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -16,9 +16,7 @@ //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/New() - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src + create_reagents(1000) if(name == "alien") name = text("alien ([rand(1, 1000)])") real_name = name @@ -96,13 +94,15 @@ f_loss += 60 - adjustEarDamage(30, 120) + AdjustEarDamage(30) + AdjustEarDeaf(120) if(3.0) b_loss += 30 if(prob(50) && !shielded) Paralyse(1) - adjustEarDamage(15,60) + AdjustEarDamage(15) + AdjustEarDeaf(60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) @@ -243,70 +243,6 @@ visible_message("[M] has attempted to disarm [src]!") return -/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. -As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. -In all, this is a lot like the monkey code. /N -*/ - -/mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if(!ticker) - to_chat(M, "You cannot attack people before the game has started.") - return - - if(istype(loc, /turf) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return - - ..() - - switch(M.a_intent) - - if(I_HELP) - sleeping = max(0,sleeping-5) - resting = 0 - AdjustParalysis(-3) - AdjustStunned(-3) - AdjustWeakened(-3) - visible_message("[M.name] nuzzles [src] trying to wake it up!") - - else - if(health > 0) - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - var/damage = rand(1, 3) - visible_message("[M.name] bites [src]!!", \ - "[M.name] bites [src]!!") - - adjustBruteLoss(damage) - updatehealth() - else - to_chat(M, "[name] is too injured for that.") - return - - -/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob) - - switch(L.a_intent) - if(I_HELP) - visible_message("[L] rubs its head against [src].") - - - else - if(health > 0) - L.do_attack_animation(src) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - var/damage = rand(1, 3) - visible_message("[L.name] bites [src]!!", \ - "[L.name] bites [src]!!") - - adjustBruteLoss(damage) - updatehealth() - else - to_chat(L, "[name] is too injured for that.") - return - - - /mob/living/carbon/alien/humanoid/restrained() if(handcuffed) return 1 @@ -362,4 +298,4 @@ In all, this is a lot like the monkey code. /N return initial(pixel_x) /mob/living/carbon/alien/humanoid/get_permeability_protection() - return 0.8 \ No newline at end of file + return 0.8 diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 4cccb6e57ed..e6a2f6567c2 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -57,18 +57,17 @@ if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP blinded = 1 - silent = 0 + SetSilence(0) else //ALIVE. LIGHTS ARE ON if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain)) death() blinded = 1 - stat = DEAD - silent = 0 + SetSilence(0) return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) + if((getOxyLoss() > 50) || (config.health_threshold_crit >= health)) + if(health <= 20 && prob(1)) spawn(0) emote("gasp") if(!reagents.has_reagent("epinephrine")) @@ -76,14 +75,12 @@ Paralyse(3) if(paralysis) - AdjustParalysis(-1) blinded = 1 stat = UNCONSCIOUS else if(sleeping) - sleeping = max(sleeping-1, 0) blinded = 1 stat = UNCONSCIOUS - if( prob(10) && health ) + if(prob(10) && health) spawn(0) emote("hiss") //CONSCIOUS @@ -98,36 +95,25 @@ if(disabilities & BLIND) //disabled-blind, doesn't get better on its own blinded = 1 else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) + AdjustEyeBlind(-1) blinded = 1 else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + AdjustEyeBlurry(-1) //Ears if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) + EarDeaf(1) else if(ear_deaf) //deafness, heals slowly over time - adjustEarDamage(0,-1) + AdjustEarDeaf(-1) else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - adjustEarDamage(-0.05, 0) - - //Other - if(stunned) - AdjustStunned(-1) - if(!stunned) - update_icons() - - if(weakened) - weakened = max(weakened-1,0) - if(!weakened) - update_icons() + AdjustEarDamage(-0.05) if(stuttering) - stuttering = max(stuttering-1, 0) + AdjustStuttering(-1) if(silent) - silent = max(silent-1, 0) + AdjustSilence(-1) if(druggy) - druggy = max(druggy-1, 0) - return 1 \ No newline at end of file + AdjustDruggy(-1) + return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index daba3852764..11914d3c0ee 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -10,9 +10,7 @@ ventcrawler = 0 /mob/living/carbon/alien/humanoid/queen/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) //there should only be one queen for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list) @@ -23,11 +21,11 @@ break real_name = src.name - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen - internal_organs += new /obj/item/organ/internal/xenos/acidgland - internal_organs += new /obj/item/organ/internal/xenos/eggsac - internal_organs += new /obj/item/organ/internal/xenos/resinspinner - internal_organs += new /obj/item/organ/internal/xenos/neurotoxin + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen + alien_organs += new /obj/item/organ/internal/xenos/acidgland + alien_organs += new /obj/item/organ/internal/xenos/eggsac + alien_organs += new /obj/item/organ/internal/xenos/resinspinner + alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index eb5522cafac..c7c8c1cefa8 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -15,16 +15,14 @@ //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/larva/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src + create_reagents(100) if(name == "alien larva") name = "alien larva ([rand(1, 1000)])" real_name = name regenerate_icons() add_language("Xenomorph") add_language("Hivemind") - internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva + alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva ..() @@ -88,13 +86,15 @@ f_loss += 60 - adjustEarDamage(30,120) + AdjustEarDamage(30) + AdjustEarDeaf(120) if(3.0) b_loss += 30 if(prob(50)) Paralyse(1) - adjustEarDamage(15,60) + AdjustEarDamage(15) + AdjustEarDeaf(60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) @@ -190,41 +190,6 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to kick [src]!", \ "[M] has attempted to kick [src]!") - return - -/mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if(!ticker) - to_chat(M, "You cannot attack people before the game has started.") - return - - if(istype(loc, /turf) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return - - ..() - - switch(M.a_intent) - - if(I_HELP) - sleeping = max(0,sleeping-5) - resting = 0 - AdjustParalysis(-3) - AdjustStunned(-3) - AdjustWeakened(-3) - visible_message("[M.name] nuzzles [src] trying to wake it up!") - - else - if(health > 0) - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - var/damage = 1 - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - adjustBruteLoss(damage) - updatehealth() - else - to_chat(M, "[name] is too injured for that.") - return /mob/living/carbon/alien/larva/restrained() return 0 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 76ceef6ad2e..447f65c6744 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -17,12 +17,12 @@ if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP blinded = 1 - silent = 0 + SetSilence(0) else //ALIVE. LIGHTS ARE ON if(health < -25 || !get_int_organ(/obj/item/organ/internal/brain)) death() blinded = 1 - silent = 0 + SetSilence(0) return 1 //UNCONSCIOUS. NO-ONE IS HOME @@ -35,11 +35,9 @@ Paralyse(3) if(paralysis) - AdjustParalysis(-2) blinded = 1 stat = UNCONSCIOUS else if(sleeping) - sleeping = max(sleeping-1, 0) blinded = 1 stat = UNCONSCIOUS if( prob(10) && health ) @@ -57,32 +55,25 @@ if(disabilities & BLIND) //disabled-blind, doesn't get better on its own blinded = 1 else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) + AdjustEyeBlind(-1) blinded = 1 else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + AdjustEyeBlurry(-1) //Ears if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) + EarDeaf(1) else if(ear_deaf) //deafness, heals slowly over time - adjustEarDamage(0,-1) + AdjustEarDeaf(-1) else if(ear_damage < 25) //ear damage heals slowly under this threshold. - adjustEarDamage(-0.05,0) - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) + AdjustEarDamage(-0.05) if(stuttering) - stuttering = max(stuttering-1, 0) + AdjustStuttering(-1) if(silent) - silent = max(silent-1, 0) + AdjustSilence(-1) if(druggy) - druggy = max(druggy-1, 0) - return 1 \ No newline at end of file + AdjustDruggy(-1) + return 1 diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 996687ee4b0..555fcff29da 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -8,45 +8,43 @@ icon = 'icons/obj/surgery.dmi' icon_state = "brain1" - New() - var/datum/reagents/R = new/datum/reagents(330) - reagents = R - R.my_atom = src - ..() +/mob/living/carbon/brain/New() + create_reagents(330) + ..() - Destroy() - if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. - death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA - ghostize() //Ghostize checks for key so nothing else is necessary. - return ..() +/mob/living/carbon/brain/Destroy() + if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. + if(stat!=DEAD) //If not dead. + death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA + ghostize() //Ghostize checks for key so nothing else is necessary. + return ..() - say_understands(var/other)//Goddamn is this hackish, but this say code is so odd - if(istype(other, /mob/living/silicon/ai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if(istype(other, /mob/living/silicon/decoy)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if(istype(other, /mob/living/silicon/pai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if(istype(other, /mob/living/silicon/robot)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if(istype(other, /mob/living/carbon/human)) +/mob/living/carbon/brain/say_understands(other)//Goddamn is this hackish, but this say code is so odd + if(istype(other, /mob/living/silicon/ai)) + if(!(container && istype(container, /obj/item/device/mmi))) + return 0 + else return 1 - if(istype(other, /mob/living/carbon/slime)) + if(istype(other, /mob/living/silicon/decoy)) + if(!(container && istype(container, /obj/item/device/mmi))) + return 0 + else return 1 - return ..() + if(istype(other, /mob/living/silicon/pai)) + if(!(container && istype(container, /obj/item/device/mmi))) + return 0 + else + return 1 + if(istype(other, /mob/living/silicon/robot)) + if(!(container && istype(container, /obj/item/device/mmi))) + return 0 + else + return 1 + if(istype(other, /mob/living/carbon/human)) + return 1 + if(istype(other, /mob/living/carbon/slime)) + return 1 + return ..() /mob/living/carbon/brain/update_canmove(delay_action_updates = 0) @@ -100,8 +98,8 @@ I'm using this for Stat to give it a more nifty interface to work with /mob/living/carbon/brain/can_safely_leave_loc() return 0 //You're not supposed to be ethereal jaunting, brains -/mob/living/carbon/brain/adjustEarDamage() +/mob/living/carbon/brain/SetEarDamage() // no ears to damage or heal return -/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal - return \ No newline at end of file +/mob/living/carbon/brain/SetEarDeaf() + return diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index fa466759bcc..e3ffe2074a7 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -21,7 +21,8 @@ /obj/item/organ/internal/brain/surgeryize() if(!owner) return - owner.setEarDamage(0,0) //Yeah, didn't you...hear? The ears are totally inside the brain. + owner.SetEarDeaf(0) + owner.SetEarDamage(0) //Yeah, didn't you...hear? The ears are totally inside the brain. /obj/item/organ/internal/brain/xeno name = "xenomorph brain" diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 40273bf66ad..74d096d9518 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -52,12 +52,12 @@ if(stat == DEAD) blinded = 1 - silent = 0 + SetSilence(0) else if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life))) death() - blinded =1 - silent = 0 + blinded = 1 + SetSilence(0) return 1 . = 1 diff --git a/code/modules/mob/living/carbon/brain/login.dm b/code/modules/mob/living/carbon/brain/login.dm index e90297dfe5b..622ae74656a 100644 --- a/code/modules/mob/living/carbon/brain/login.dm +++ b/code/modules/mob/living/carbon/brain/login.dm @@ -1,3 +1,3 @@ /mob/living/carbon/brain/Login() ..() - sleeping = 0 \ No newline at end of file + SetSleeping(0) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 4f76dce16bd..3b5b415964d 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -185,7 +185,7 @@ src.brainmob.loc = src src.brainmob.container = src src.brainmob.stat = 0 - src.brainmob.silent = 0 + src.brainmob.SetSilence(0) dead_mob_list -= src.brainmob ..() diff --git a/code/modules/mob/living/carbon/brain/update_status.dm b/code/modules/mob/living/carbon/brain/update_status.dm new file mode 100644 index 00000000000..2532edfe37d --- /dev/null +++ b/code/modules/mob/living/carbon/brain/update_status.dm @@ -0,0 +1,8 @@ +/mob/living/carbon/brain/update_stat() + if(status_flags & GODMODE) + return + // if(health <= min_health) + if(health <= config.health_threshold_dead) + if(stat != DEAD) + death() + // Put brain(organ) damaging code here diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 688508c4bf3..f62df2ab76b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -158,13 +158,13 @@ "You feel a powerful shock coursing through your body!", \ "You hear a heavy electrical crack." \ ) - jitteriness += 1000 //High numbers for violent convulsions + AdjustJitter(1000) //High numbers for violent convulsions do_jitter_animation(jitteriness) - stuttering += 2 + AdjustStuttering(2) if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) Stun(2) spawn(20) - jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less + AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) Stun(3) Weaken(3) @@ -268,7 +268,7 @@ if(istype(src,/mob/living/carbon/human) && src:w_uniform) var/mob/living/carbon/human/H = src H.w_uniform.add_fingerprint(M) - src.sleeping = max(0,src.sleeping-5) + AdjustSleeping(-5) if(src.sleeping == 0) src.resting = 0 AdjustParalysis(-3) @@ -327,8 +327,8 @@ E.damage += rand(12, 16) if(E.damage > E.min_bruised_damage) - eye_blind += damage - eye_blurry += damage * rand(3, 6) + AdjustEyeBlind(damage) + AdjustEyeBlurry(damage * rand(3, 6)) if(E.damage > (E.min_bruised_damage + E.min_broken_damage) / 2) if(!(E.status & ORGAN_ROBOT)) @@ -742,7 +742,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/resist_fire() fire_stacks -= 5 - weakened = max(weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy. + Weaken(3, 1, 1) //We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy. update_canmove() spin(32,2) visible_message("[src] rolls on the floor, trying to put themselves out!", \ diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index b0ccdc8381d..f8a9b38d098 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -1,9 +1,9 @@ /mob/living/carbon/death(gibbed) - losebreath = 0 + SetLoseBreath(0) med_hud_set_health() med_hud_set_status() if(reagents) reagents.death_metabolize(src) - ..(gibbed) \ No newline at end of file + ..(gibbed) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 7802cfd53c6..eb58d39ea7c 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -4,32 +4,29 @@ AC.ui_interact(user, state = state) /mob/living/carbon/human/proc/change_species(var/new_species) - if(!new_species) + if(!new_species || species == new_species || !(new_species in all_species)) return - if(species == new_species) - return - - if(!(new_species in all_species)) - return - - set_species(new_species) + set_species(new_species, null, 1) reset_hair() + if(species.bodyflags & HAS_MARKINGS) + reset_markings() + return 1 -/mob/living/carbon/human/proc/change_gender(var/gender, var/update_dna = 1) +/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1) var/obj/item/organ/external/head/H = organs_by_name["head"] - if(src.gender == gender) + if(gender == new_gender) return - src.gender = gender + gender = new_gender var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style] - if(current_hair.gender != NEUTER && current_hair.gender != src.gender) + if(current_hair.gender != NEUTER && current_hair.gender != gender) reset_head_hair() var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[H.f_style] - if(current_fhair.gender != NEUTER && current_fhair.gender != src.gender) + if(current_fhair.gender != NEUTER && current_fhair.gender != gender) reset_facial_hair() if(update_dna) @@ -40,13 +37,7 @@ /mob/living/carbon/human/proc/change_hair(var/hair_style) var/obj/item/organ/external/head/H = get_organ("head") - if(!hair_style) - return - - if(H.h_style == hair_style) - return - - if(!(hair_style in hair_styles_list)) + if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list)) return H.h_style = hair_style @@ -56,13 +47,7 @@ /mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style) var/obj/item/organ/external/head/H = get_organ("head") - if(!facial_hair_style) - return - - if(H.f_style == facial_hair_style) - return - - if(!(facial_hair_style in facial_hair_styles_list)) + if(!facial_hair_style || !H || H.f_style == facial_hair_style || !(facial_hair_style in facial_hair_styles_list)) return H.f_style = facial_hair_style @@ -72,13 +57,7 @@ /mob/living/carbon/human/proc/change_head_accessory(var/head_accessory_style) var/obj/item/organ/external/head/H = get_organ("head") - if(!head_accessory_style) - return - - if(H.ha_style == head_accessory_style) - return - - if(!(head_accessory_style in head_accessory_styles_list)) + if(!head_accessory_style || !H || H.ha_style == head_accessory_style || !(head_accessory_style in head_accessory_styles_list)) return H.ha_style = head_accessory_style @@ -86,52 +65,95 @@ update_head_accessory() return 1 -/mob/living/carbon/human/proc/change_markings(var/marking_style) - if(!marking_style) +/mob/living/carbon/human/proc/change_markings(var/marking_style, var/location = "body") + if(!marking_style || m_styles[location] == marking_style || !(marking_style in marking_styles_list)) return - if(src.m_style == marking_style) + var/datum/sprite_accessory/body_markings/marking = marking_styles_list[marking_style] + if(marking.name != "None" && marking.marking_location != location) return - if(!(marking_style in marking_styles_list)) - return + var/obj/item/organ/external/head/head_organ = get_organ("head") + if(location == "head") + if(!head_organ) + return - src.m_style = marking_style + if(head_organ.alt_head && head_organ.alt_head != "None") + var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style] + if(marking.name != "None" && (!H.heads_allowed || (!("All" in H.heads_allowed) && !(head_organ.alt_head in H.heads_allowed)))) + return + else + if(!head_organ.alt_head || head_organ.alt_head == "None") + head_organ.alt_head = "None" + var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style] + if(H.heads_allowed && !("All" in H.heads_allowed)) + return - update_markings() + if(location == "tail" && marking.name != "None") + var/datum/sprite_accessory/body_markings/tail/tail_marking = marking_styles_list[marking_style] + if(!body_accessory) + if(tail_marking.tails_allowed) + return + else + if(!tail_marking.tails_allowed || !(body_accessory.name in tail_marking.tails_allowed)) + return + + m_styles[location] = marking_style + + if(location == "tail") + stop_tail_wagging() + else + update_markings() return 1 /mob/living/carbon/human/proc/change_body_accessory(var/body_accessory_style) var/found - if(!body_accessory_style) + if(!body_accessory_style || (body_accessory && body_accessory.name == body_accessory_style)) return - if(src.body_accessory) - if(src.body_accessory.name == body_accessory_style) - return - for(var/B in body_accessory_by_name) if(B == body_accessory_style) - src.body_accessory = body_accessory_by_name[body_accessory_style] + body_accessory = body_accessory_by_name[body_accessory_style] found = 1 if(!found) return + m_styles["tail"] = "None" update_tail_layer() return 1 +/mob/living/carbon/human/proc/change_alt_head(var/alternate_head) + var/obj/item/organ/external/head/H = get_organ("head") + if(!H || H.alt_head == alternate_head || (H.status & ORGAN_ROBOT) || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list)) + return + + H.alt_head = alternate_head + + //Handle head markings if they're incompatible with the new alt head. + if(m_styles["head"]) + var/head_marking = m_styles["head"] + var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking] + if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(H.alt_head in head_marking_style.heads_allowed))) + m_styles["head"] = "None" + update_markings() + + update_body(1, 1) //Update the body and force limb icon regeneration to update the head with the new icon. + if(wear_mask) + update_inv_wear_mask() + return 1 + /mob/living/carbon/human/proc/reset_hair() reset_head_hair() reset_facial_hair() reset_head_accessory() - if(m_style && m_style != "None") //Resets the markings if they were head markings. - var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] - if(marking_style && marking_style.marking_location == "head") - reset_markings() + if(m_styles["head"] && m_styles["head"] != "None") //Resets head markings. + reset_markings("head") /mob/living/carbon/human/proc/reset_head_hair() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return var/list/valid_hairstyles = generate_valid_hairstyles() if(valid_hairstyles.len) H.h_style = pick(valid_hairstyles) @@ -143,6 +165,8 @@ /mob/living/carbon/human/proc/reset_facial_hair() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return var/list/valid_facial_hairstyles = generate_valid_facial_hairstyles() if(valid_facial_hairstyles.len) H.f_style = pick(valid_facial_hairstyles) @@ -151,17 +175,32 @@ H.f_style = "Shaved" update_fhair() -/mob/living/carbon/human/proc/reset_markings() - var/list/valid_markings = generate_valid_markings() - if(valid_markings.len) - m_style = pick(valid_markings) +/mob/living/carbon/human/proc/reset_markings(var/location) + var/list/valid_markings + + if(location) + valid_markings = generate_valid_markings(location) + if(valid_markings.len) + m_styles[location] = pick(valid_markings) + else + //this shouldn't happen + m_styles[location] = "None" else - //this shouldn't happen - m_style = "None" + for(var/m_location in list("head", "body", "tail")) + valid_markings = generate_valid_markings(m_location) + if(valid_markings.len) + m_styles[m_location] = pick(valid_markings) + else + //this shouldn't happen + m_styles[m_location] = "None" + update_markings() + stop_tail_wagging() /mob/living/carbon/human/proc/reset_head_accessory() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return var/list/valid_head_accessories = generate_valid_head_accessories() if(valid_head_accessories.len) H.ha_style = pick(valid_head_accessories) @@ -193,32 +232,57 @@ update_body() return 1 -/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue) +/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary) var/obj/item/organ/external/head/H = get_organ("head") - if(red == H.r_hair && green == H.g_hair && blue == H.b_hair) + if(!H) return - H.r_hair = red - H.g_hair = green - H.b_hair = blue + if(!secondary) + if(red == H.r_hair && green == H.g_hair && blue == H.b_hair) + return + + H.r_hair = red + H.g_hair = green + H.b_hair = blue + else + if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec) + return + + H.r_hair_sec = red + H.g_hair_sec = green + H.b_hair_sec = blue update_hair() return 1 -/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue) +/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary) var/obj/item/organ/external/head/H = get_organ("head") - if(red == H.r_facial && green == H.g_facial && blue == H.b_facial) + if(!H) return - H.r_facial = red - H.g_facial = green - H.b_facial = blue + if(!secondary) + if(red == H.r_facial && green == H.g_facial && blue == H.b_facial) + return + + H.r_facial = red + H.g_facial = green + H.b_facial = blue + else + if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec) + return + + H.r_facial_sec = red + H.g_facial_sec = green + H.b_facial_sec = blue update_fhair() return 1 /mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue) var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return + if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc) return @@ -229,15 +293,16 @@ update_head_accessory() return 1 -/mob/living/carbon/human/proc/change_marking_color(var/red, var/green, var/blue) - if(red == r_markings && green == g_markings && blue == b_markings) +/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body") + if(colour == m_colours[location]) return - r_markings = red - g_markings = green - b_markings = blue + m_colours[location] = colour - update_markings() + if(location == "tail") + update_tail_layer() + else + update_markings() return 1 @@ -287,75 +352,66 @@ /mob/living/carbon/human/proc/generate_valid_hairstyles() var/list/valid_hairstyles = new() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return //No head, no hair. + for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) + if(hairstyle == "Bald") //Just in case. + valid_hairstyles += hairstyle continue - if(gender == FEMALE && S.gender == MALE) + if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE)) continue if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = all_robolimbs[H.model] - if(!H) - return - if(H.species.name in S.species_allowed) //If this is a hairstyle native to the user's species... - if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. - valid_hairstyles += hairstyle //Give them their hairstyles if they do. - continue - else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally. - continue + if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_hairstyles += hairstyle //Give them their hairstyles if they do. else - if(robohead.is_monitor) //If the hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. - continue - else - if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head. - valid_hairstyles += hairstyle - continue + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */ + valid_hairstyles += hairstyle else //If the user is not a species who can have robotic heads, use the default handling. - if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the hair style allows, skip it. Otherwise, add it to the list. - continue - valid_hairstyles += hairstyle + if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. + valid_hairstyles += hairstyle return valid_hairstyles /mob/living/carbon/human/proc/generate_valid_facial_hairstyles() var/list/valid_facial_hairstyles = new() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return //No head, no hair. + for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) + if(facialhairstyle == "Shaved") //Just in case. + valid_facial_hairstyles += facialhairstyle continue - if(gender == FEMALE && S.gender == MALE) + if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE)) continue if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = all_robolimbs[H.model] - if(!H) - continue // No head, no hair if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species... - if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. - valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do. - continue - else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally. - continue + if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do. else - - if(robohead.is_monitor) //If the facial hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. - continue - else - if("Human" in S.species_allowed) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head. - valid_facial_hairstyles += facialhairstyle - continue + if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. + But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */ + valid_facial_hairstyles += facialhairstyle else //If the user is not a species who can have robotic heads, use the default handling. - if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the facial hair style allows, skip it. Otherwise, add it to the list. - continue - valid_facial_hairstyles += facialhairstyle + if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. + valid_facial_hairstyles += facialhairstyle return valid_facial_hairstyles /mob/living/carbon/human/proc/generate_valid_head_accessories() var/list/valid_head_accessories = new() var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return //No head, no head accessory. + for(var/head_accessory in head_accessory_styles_list) var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory] @@ -365,18 +421,40 @@ return valid_head_accessories -/mob/living/carbon/human/proc/generate_valid_markings() +/mob/living/carbon/human/proc/generate_valid_markings(var/location = "body") var/list/valid_markings = new() var/obj/item/organ/external/head/H = get_organ("head") - for(var/marking in marking_styles_list) - var/datum/sprite_accessory/S = marking_styles_list[marking] + if(!H && location == "head") + return //No head, no head markings. - if(!(species.name in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list. + for(var/marking in marking_styles_list) + var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking] + if(S.name == "None") + valid_markings += marking continue - if(H.species.flags & ALL_RPARTS) //If the user is a species that can have a robotic head... - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head. - continue + if(S.marking_location != location) //If the marking isn't for the location we desire, skip. + continue + if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list. + continue + if(location == "tail") + if(!body_accessory) + if(S.tails_allowed) + continue + else + if(!S.tails_allowed || !(body_accessory.name in S.tails_allowed)) + continue + if(location == "head") + var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name] + if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head... + var/datum/robolimb/robohead = all_robolimbs[H.model] + if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head. + continue + else if(H.alt_head && H.alt_head != "None") //If the user's got an alt head, validate markings for that head. + if(!M.heads_allowed || (!("All" in M.heads_allowed) && !(H.alt_head in M.heads_allowed))) + continue + else + if(M.heads_allowed && !("All" in M.heads_allowed)) + continue valid_markings += marking return valid_markings @@ -389,10 +467,24 @@ valid_body_accessories = body_accessory_by_name.Copy() else if(!istype(A)) - valid_body_accessories += "None" //The only null entry should be the "None" option. + valid_body_accessories["None"] = "None" //The only null entry should be the "None" option. continue - if(!(species.name in A.allowed_species)) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. - continue - valid_body_accessories += B + if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. + valid_body_accessories += B return valid_body_accessories + +/mob/living/carbon/human/proc/generate_valid_alt_heads() + var/list/valid_alt_heads = list() + var/obj/item/organ/external/head/H = get_organ("head") + if(!H) + return //No head, no alt heads. + valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option. + for(var/alternate_head in alt_heads_list) + var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head] + if(!(H.species.name in head.species_allowed)) + continue + + valid_alt_heads += alternate_head + + return valid_alt_heads \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index f4b95eec4d4..8744a09ea4d 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -112,36 +112,30 @@ var/global/list/body_accessory_by_species = list("None" = null) //Vulpkanin /datum/body_accessory/tail/vulpkanin_2 name = "Vulpkanin Alt 1 (Bushy)" - icon_state = "vulptail2" animated_icon_state = "vulptail2_a" allowed_species = list("Vulpkanin") /datum/body_accessory/tail/vulpkanin_3 name = "Vulpkanin Alt 2 (Straight)" - icon_state = "vulptail3" animated_icon_state = "vulptail3_a" allowed_species = list("Vulpkanin") /datum/body_accessory/tail/vulpkanin_4 name = "Vulpkanin Alt 3 (Tiny)" - icon_state = "vulptail4" animated_icon_state = "vulptail4_a" allowed_species = list("Vulpkanin") /datum/body_accessory/tail/vulpkanin_5 name = "Vulpkanin Alt 4 (Short)" - icon_state = "vulptail5" animated_icon_state = "vulptail5_a" allowed_species = list("Vulpkanin") /datum/body_accessory/tail/vulpkanin_6 name = "Vulpkanin Alt 5 (Straight Bushy)" - icon_state = "vulptail6" animated_icon_state = "vulptail6_a" allowed_species = list("Vulpkanin") - diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index df78c286254..89c35870cad 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -97,8 +97,8 @@ emote("deathgasp") //let the world KNOW WE ARE DEAD stat = DEAD - dizziness = 0 - jitteriness = 0 + SetDizzy(0) + SetJitter(0) heart_attack = 0 //Handle species-specific deaths. @@ -155,11 +155,19 @@ if(istype(H)) if(H.f_style) - H.f_style = "Shaved" + H.f_style = initial(H.f_style) if(H.h_style) - H.h_style = "Bald" + H.h_style = initial(H.h_style) + if(H.ha_style) + H.ha_style = initial(H.ha_style) + if(H.alt_head) + H.alt_head = initial(H.alt_head) + H.handle_alt_icon() + m_styles = DEFAULT_MARKING_STYLES update_fhair(0) update_hair(0) + update_head_accessory(0) + update_markings(0) mutations.Add(SKELETON) mutations.Add(NOCLONE) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 0746cb30b2c..37826ae0a10 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -10,7 +10,7 @@ act = copytext(act, 1, t1) var/muzzled = is_muzzled() - if(disabilities & MUTE || silent) + if(!can_speak()) muzzled = 1 //var/m_type = 1 @@ -313,7 +313,7 @@ M = null if(M) - if(lying || weakened) + if(lying) message = "[src] flops and flails around on the floor." else message = "[src] flips in [M]'s general direction." @@ -378,7 +378,7 @@ message = "[src] faints." if(src.sleeping) return //Can't faint while asleep - src.sleeping += 1 + AdjustSleeping(2) m_type = 1 if("cough", "coughs") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 86232208e2e..170673d2395 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -31,9 +31,7 @@ if(mind) mind.name = real_name - var/datum/reagents/R = new/datum/reagents(330) - reagents = R - R.my_atom = src + create_reagents(330) prev_gender = gender // Debug for plural genders make_blood() @@ -352,7 +350,8 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - adjustEarDamage(30, 120) + AdjustEarDamage(30) + AdjustEarDeaf(120) if(prob(70) && !shielded) Paralyse(10) @@ -376,7 +375,8 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - adjustEarDamage(15,60) + AdjustEarDamage(15) + AdjustEarDeaf(60) if(prob(50) && !shielded) Paralyse(10) @@ -491,8 +491,7 @@ O.show_message(text("The [M.name] has shocked []!", src), 1) Weaken(power) - if(stuttering < power) - stuttering = power + Stuttering(power) Stun(power) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -709,12 +708,19 @@ if(!.) . = if_no_id //to prevent null-names making the mob unclickable return -//gets ID card object from special clothes slot or null. -/mob/living/carbon/human/proc/get_idcard() +//gets ID card object from special clothes slot or, if applicable, hands as well +/mob/living/carbon/human/proc/get_idcard(var/check_hands = FALSE) var/obj/item/weapon/card/id/id = wear_id var/obj/item/device/pda/pda = wear_id if(istype(pda) && pda.id) id = pda.id + + if(check_hands) + if(istype(get_active_hand(), /obj/item/weapon/card/id)) + id = get_active_hand() + else if(istype(get_inactive_hand(), /obj/item/weapon/card/id)) + id = get_inactive_hand() + if(istype(id)) return id @@ -854,12 +860,7 @@ modified = 1 spawn() - if(istype(usr,/mob/living/carbon/human)) - //var/mob/living/carbon/human/U = usr - sec_hud_set_security_status() - if(istype(usr,/mob/living/silicon/robot)) - //var/mob/living/silicon/robot/U = usr - sec_hud_set_security_status() + sec_hud_set_security_status() if(!modified) to_chat(usr, "\red Unable to locate a data core entry for this person.") @@ -984,12 +985,7 @@ PDA_Manifest.Cut() spawn() - if(istype(usr,/mob/living/carbon/human)) - //var/mob/living/carbon/human/U = usr - sec_hud_set_security_status() - if(istype(usr,/mob/living/silicon/robot)) - //var/mob/living/silicon/robot/U = usr - sec_hud_set_security_status() + sec_hud_set_security_status() if(!modified) to_chat(usr, "\red Unable to locate a data core entry for this person.") @@ -1482,7 +1478,6 @@ to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].") /mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0) - var/datum/species/oldspecies = species if(!dna) if(!new_species) @@ -1535,9 +1530,9 @@ if(species.base_color && default_colour) //Apply colour. - r_skin = hex2num(copytext(species.base_color, 2, 4)) - g_skin = hex2num(copytext(species.base_color, 4, 6)) - b_skin = hex2num(copytext(species.base_color, 6, 8)) + r_skin = color2R(species.base_color) + g_skin = color2G(species.base_color) + b_skin = color2B(species.base_color) else r_skin = 0 g_skin = 0 @@ -1552,37 +1547,47 @@ var/obj/item/organ/external/head/H = get_organ("head") if(species.default_hair) H.h_style = species.default_hair + else + H.h_style = "Bald" if(species.default_fhair) H.f_style = species.default_fhair + else + H.f_style = "Shaved" if(species.default_headacc) H.ha_style = species.default_headacc + else + H.ha_style = "None" if(species.default_hair_colour) //Apply colour. - H.r_hair = hex2num(copytext(species.default_hair_colour, 2, 4)) - H.g_hair = hex2num(copytext(species.default_hair_colour, 4, 6)) - H.b_hair = hex2num(copytext(species.default_hair_colour, 6, 8)) + H.r_hair = color2R(species.default_hair_colour) + H.g_hair = color2G(species.default_hair_colour) + H.b_hair = color2B(species.default_hair_colour) else H.r_hair = 0 H.g_hair = 0 H.b_hair = 0 if(species.default_fhair_colour) - H.r_facial = hex2num(copytext(species.default_fhair_colour, 2, 4)) - H.g_facial = hex2num(copytext(species.default_fhair_colour, 4, 6)) - H.b_facial = hex2num(copytext(species.default_fhair_colour, 6, 8)) + H.r_facial = color2R(species.default_fhair_colour) + H.g_facial = color2G(species.default_fhair_colour) + H.b_facial = color2B(species.default_fhair_colour) else H.r_facial = 0 H.g_facial = 0 H.b_facial = 0 if(species.default_headacc_colour) - H.r_headacc = hex2num(copytext(species.default_headacc_colour, 2, 4)) - H.g_headacc = hex2num(copytext(species.default_headacc_colour, 4, 6)) - H.b_headacc = hex2num(copytext(species.default_headacc_colour, 6, 8)) + H.r_headacc = color2R(species.default_headacc_colour) + H.g_headacc = color2G(species.default_headacc_colour) + H.b_headacc = color2B(species.default_headacc_colour) else H.r_headacc = 0 H.g_headacc = 0 H.b_headacc = 0 + m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None". + m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings. + body_accessory = null + if(!dna) dna = new /datum/dna(null) dna.species = species.name @@ -1683,16 +1688,13 @@ if(!head_organ) return if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics! - var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null + var/optic_colour = input(src, "Select optic colour", m_colours["head"]) as color|null if(incapacitated()) to_chat(src, "You were interrupted while changing the colour of your optics.") return if(optic_colour) - r_markings = hex2num(copytext(optic_colour, 2, 4)) - g_markings = hex2num(copytext(optic_colour, 4, 6)) - b_markings = hex2num(copytext(optic_colour, 6, 8)) + change_markings(optic_colour, "head") - update_markings() else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize. var/list/hair = list() for(var/i in hair_styles_list) @@ -1700,14 +1702,12 @@ if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use. hair += i - var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair + var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair if(incapacitated()) to_chat(src, "You were interrupted while changing your monitor display.") return if(new_style) - head_organ.h_style = new_style - - update_hair() + change_hair(new_style) //Putting a couple of procs here that I don't know where else to dump. //Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse). @@ -1738,7 +1738,7 @@ if(last_special > world.time) return - if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) + if(!canmove) to_chat(src, "You cannot leap in your current state.") return @@ -1792,7 +1792,7 @@ if(last_special > world.time) return - if(stat || paralysis || stunned || weakened || lying) + if(!canmove) to_chat(src, "\red You cannot do that in your current state.") return @@ -1987,6 +1987,12 @@ var/obj/item/weapon/card/id/id = wear_id if(istype(id) && id.is_untrackable()) return 0 + if(wear_pda) + var/obj/item/device/pda/pda = wear_pda + if(istype(pda)) + var/obj/item/weapon/card/id/id = pda.id + if(istype(id) && id.is_untrackable()) + return 0 if(istype(head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = head if(hat.blockTracking) @@ -2002,6 +2008,8 @@ if(wear_id) . |= wear_id.GetAccess() + if(wear_pda) + . |= wear_pda.GetAccess() if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.accessories) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 16d940dd439..0ceabc84bfe 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -254,7 +254,7 @@ emp_act visible_message("[src] has been knocked down!", \ "[src] has been knocked down!") apply_effect(5, WEAKEN, armor) - confused += 15 + AdjustConfused(15) if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE) ticker.mode.remove_revolutionary(mind) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 272cb65e33a..0d30c5c8265 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -4,10 +4,8 @@ var/global/default_martial_art = new/datum/martial_art hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD) //Marking colour and style - var/r_markings = 0 - var/g_markings = 0 - var/b_markings = 0 - var/m_style = "None" + var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000. + var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None. var/s_tone = 0 //Skin tone diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 96a23acf5c7..50f1e7cd342 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -108,11 +108,13 @@ if((E.body_part == HAND_LEFT) || (E.body_part == ARM_LEFT)) if(!l_hand) continue - unEquip(l_hand) + if(!unEquip(l_hand)) + continue else if(!r_hand) continue - unEquip(r_hand) + if(!unEquip(r_hand)) + continue var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") custom_emote(1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!") @@ -122,11 +124,13 @@ if((E.body_part == HAND_LEFT) || (E.body_part == ARM_LEFT)) if(!l_hand) continue - unEquip(l_hand) + if(!unEquip(l_hand)) + continue else if(!r_hand) continue - unEquip(r_hand) + if(!unEquip(r_hand)) + continue custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!") @@ -148,7 +152,7 @@ mutations.Remove(FAT) update_mutantrace(0) update_mutations(0) - update_body(0) + update_body(0, 1) update_inv_w_uniform(0) update_inv_wear_suit() @@ -163,7 +167,7 @@ mutations.Add(FAT) update_mutantrace(0) update_mutations(0) - update_body(0) + update_body(0, 1) update_inv_w_uniform(0) update_inv_wear_suit() diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index 1862062e4cf..2dfc4f8d24e 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -167,7 +167,7 @@ /client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in npc_master.botPool_l) set name = "Customize SNPC" - set desc = "Customise the SNPC" + set desc = "Customize the SNPC" set category = "Debug" if(!holder) @@ -403,7 +403,7 @@ if(!hud_used) hud_used = new /datum/hud/human(src) -/mob/living/carbon/human/interactive/New() +/mob/living/carbon/human/interactive/New(var/new_loc, var/new_species = null) ..() snpc_list += src @@ -916,7 +916,7 @@ TARGET = null return 1 - if(!(get_turf(src) in validHome)) + if(!(get_turf(src) in validHome) && validHome.len) tryWalk(pick(get_area_turfs(job2area(myjob)))) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 78e9098f434..cfeb6e88faa 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -86,8 +86,8 @@ // If we have the gene for being crazy, have random events. if(dna.GetSEState(HALLUCINATIONBLOCK)) - if(prob(1) && hallucination < 1) - hallucination += 20 + if(prob(1)) + Hallucinate(20) if(disabilities & COUGHING) if((prob(5) && paralysis <= 1)) @@ -111,9 +111,9 @@ if(disabilities & NERVOUS) speech_problem_flag = 1 if(prob(10)) - stuttering = max(10, stuttering) + Stuttering(10) - if(getBrainLoss() >= 60 && stat != 2) + if(getBrainLoss() >= 60 && stat != DEAD) speech_problem_flag = 1 if(prob(3)) var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH", @@ -152,8 +152,8 @@ if(getBrainLoss() >= 100 && stat != 2) //you lapse into a coma and die without immediate aid; RIP. -Fox Weaken(20) - losebreath += 10 - silent += 2 + AdjustLoseBreath(10) + AdjustSilence(2) if(getBrainLoss() >= 120 && stat != 2) //they died from stupidity--literally. -Fox visible_message("[src] goes limp, their facial expression utterly blank.") @@ -281,10 +281,10 @@ var/datum/gas_mixture/breath if(health <= config.health_threshold_crit) - losebreath++ + AdjustLoseBreath(1) if(losebreath > 0) - losebreath-- + AdjustLoseBreath(-1) if(prob(10)) spawn emote("gasp") if(istype(loc, /obj/)) @@ -696,20 +696,20 @@ overeatduration -= 2 if(drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) + AdjustDrowsy(-1) + EyeBlurry(2) if(prob(5)) - sleeping += 1 + AdjustSleeping(1) Paralyse(5) - confused = max(0, confused - 1) + AdjustConfused(-1) // decrement dizziness counter, clamped to 0 if(resting) - dizziness = max(0, dizziness - 15) - jitteriness = max(0, jitteriness - 15) + AdjustDizzy(-15) + AdjustJitter(-15) else - dizziness = max(0, dizziness - 3) - jitteriness = max(0, jitteriness - 3) + AdjustDizzy(-3) + AdjustJitter(-3) if(species && species.flags & NO_INTORGANS) return @@ -744,8 +744,7 @@ alcohol_strength *= 5 if(alcohol_strength >= slur_start) //slurring - if(!slurring) slurring = 1 - slurring = drunk + Slur(drunk) if(alcohol_strength >= brawl_start) //the drunken martial art if(!istype(martial_art, /datum/martial_art/drunk_brawling)) var/datum/martial_art/drunk_brawling/F = new @@ -754,18 +753,17 @@ if(istype(martial_art, /datum/martial_art/drunk_brawling)) martial_art.remove(src) if(alcohol_strength >= confused_start && prob(33)) //confused walking - if(!confused) confused = 1 - confused = max(confused+(3/sober_str),0) + if(!confused) Confused(1) + AdjustConfused(3/sober_str) if(alcohol_strength >= blur_start) //blurry eyes - eye_blurry = max(eye_blurry, 10/sober_str) - drowsyness = max(drowsyness, 0) + EyeBlurry(10/sober_str) if(!isSynthetic()) //stuff only for non-synthetics if(alcohol_strength >= vomit_start) //vomiting if(prob(8)) fakevomit() if(alcohol_strength >= pass_out) - Paralyse(5 / sober_str) - drowsyness = max(drowsyness, 30/sober_str) + Paralyse(5/sober_str) + Drowsy(30/sober_str) if(L) L.take_damage(0.1, 1) adjustToxLoss(0.1) @@ -789,7 +787,7 @@ /mob/living/carbon/human/proc/has_booze() //checks if the human has ethanol or its subtypes inside for(var/A in reagents.reagent_list) var/datum/reagent/R = A - if(istype(R, /datum/reagent/ethanol)) + if(istype(R, /datum/reagent/consumable/ethanol)) return 1 return 0 @@ -837,14 +835,14 @@ vision = get_int_organ(species.vision_organ) if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means. - eye_blind = 0 + SetEyeBlind(0) blinded = 0 - eye_blurry = 0 + SetEyeBlurry(0) else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind. - eye_blind = 1 + EyeBlind(2) blinded = 1 - eye_blurry = 1 + EyeBlurry(2) else //blindness @@ -852,34 +850,34 @@ blinded = 1 else if(eye_blind) // Blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) + AdjustEyeBlind(-1) blinded = 1 else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster - eye_blurry = max(eye_blurry-3, 0) + AdjustEyeBlurry(-3) blinded = 1 //blurry sight if(vision.is_bruised()) // Vision organs impaired? Permablurry. - eye_blurry = 1 + EyeBlurry(2) if(eye_blurry) // Blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + AdjustEyeBlurry(-1) //Ears if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) + EarDeaf(1) else if(ear_deaf) //deafness, heals slowly over time - adjustEarDamage(0,-1) + AdjustEarDeaf(-1) else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - adjustEarDamage(-0.15,0) - setEarDamage(-1, max(ear_deaf, 1)) + AdjustEarDamage(-0.15) + EarDeaf(1) else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - adjustEarDamage(-0.05,0) + AdjustEarDamage(-0.05) if(flying) animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) @@ -896,7 +894,7 @@ else //dead blinded = 1 - silent = 0 + SetSilence(0) /mob/living/carbon/human/handle_vision() @@ -995,8 +993,8 @@ if(shock_stage >= 30) if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.") - eye_blurry = max(2, eye_blurry) - stuttering = max(stuttering, 5) + EyeBlurry(2) + Stuttering(5) if(shock_stage == 40) to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) @@ -1183,8 +1181,7 @@ if(!heart_attack) return else - if(losebreath < 3) - losebreath += 2 + AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) adjustOxyLoss(5) adjustBruteLoss(1) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 72e6ff63314..26ca4af83e8 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -142,7 +142,7 @@ message = uppertext(message) verb = "yells loudly" - if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) + if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)) message = "[message]" returns[1] = message diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index d8434a87223..5fe7d44ab6d 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -189,7 +189,7 @@ if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit H.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 - H.sleeping = min(H.sleeping+2, 10) + H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10) else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) spawn(0) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 33aa58b94d4..2af29aefe72 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -120,11 +120,11 @@ var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg' //Default hair/headacc style vars. - var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set. + var/default_hair //Default hair style for newly created humans unless otherwise set. var/default_hair_colour - var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set. + var/default_fhair //Default facial hair style for newly created humans unless otherwise set. var/default_fhair_colour - var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set. + var/default_headacc //Default head accessory style for newly created humans unless otherwise set. var/default_headacc_colour //Defining lists of icon skin tones for species that have them. @@ -305,7 +305,7 @@ if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. H.co2overloadtime = world.time else if(world.time - H.co2overloadtime > 120) - H.Paralyse(3) + H.Paralyse(5) H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! H.adjustOxyLoss(8) @@ -314,6 +314,7 @@ H.emote("cough") else H.clear_alert("co2") + H.co2overloadtime = 0 if(atmos_requirements["min_co2"]) //species breathes this gas, so they got their air H.failed_last_breath = 0 H.adjustOxyLoss(-5) @@ -332,7 +333,8 @@ if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well - H.sleeping = max(H.sleeping + 2, 10) + // This value is large because breaths are taken only once every 4 life ticks. + H.AdjustSleeping(8, bound_lower = 0, bound_upper = 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) @@ -509,7 +511,7 @@ if(tinted_weldhelh) H.overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) if(H.tinttotal >= TINT_BLIND) - H.eye_blind = max(H.eye_blind, 1) + H.EyeBlind(1) else H.clear_fullscreen("tint") diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 924a7c03bf4..1a6c8254a3e 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -8,7 +8,7 @@ language = "Sol Common" flags = HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_TONE + bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS dietflags = DIET_OMNI unarmed_type = /datum/unarmed_attack/punch blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ @@ -40,7 +40,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING dietflags = DIET_CARN cold_level_1 = 280 //Default 260 - Lower is better @@ -112,13 +112,11 @@ flags = HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR + bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" - base_color = "#333333" - //Default styles for created mobs. - default_headacc = "Tajaran Ears" + base_color = "#424242" butt_sprite = "tajaran" has_organ = list( @@ -164,11 +162,11 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR + bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#966464" - base_color = "#B43214" + base_color = "#CF4D2F" butt_sprite = "vulp" has_organ = list( @@ -212,7 +210,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR + bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS dietflags = DIET_HERB flesh_color = "#8CD7A3" blood_color = "#1D2CBF" @@ -287,7 +285,7 @@ flags = NO_SCAN | IS_WHITELISTED clothing_flags = HAS_SOCKS dietflags = DIET_OMNI - bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED + bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS blood_color = "#2299FC" flesh_color = "#808D11" @@ -705,6 +703,7 @@ flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_BODY_MARKINGS dietflags = DIET_HERB reagent_tag = PROCESS_ORG blood_color = "#A200FF" @@ -855,7 +854,7 @@ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY + bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" @@ -946,7 +945,7 @@ flags = IS_WHITELISTED | HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT - bodyflags = FEET_CLAWS | HAS_SKIN_TONE + bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS dietflags = DIET_OMNI cold_level_1 = -1 //Default 260 - Lower is better diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8f7ed81a5fa..037e5234d27 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -212,15 +212,15 @@ var/global/list/damage_icon_parts = list() if(update_icons) update_icons() //BASE MOB SPRITE -/mob/living/carbon/human/proc/update_body(var/update_icons=1) +/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0) var/husk_color_mod = rgb(96,88,80) var/hulk_color_mod = rgb(48,224,40) - var/husk = (HUSK in src.mutations) - var/fat = (FAT in src.mutations) - var/hulk = (HULK in src.mutations) - var/skeleton = (SKELETON in src.mutations) + var/husk = (HUSK in mutations) + var/fat = (FAT in mutations) + var/hulk = (HULK in mutations) + var/skeleton = (SKELETON in mutations) if(species && species.bodyflags & HAS_ICON_SKIN_TONE) species.updatespeciescolor(src) @@ -262,7 +262,7 @@ var/global/list/damage_icon_parts = list() icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon - if(human_icon_cache[icon_key]) + if(human_icon_cache[icon_key] && !rebuild_base) base_icon = human_icon_cache[icon_key] else //BEGIN CACHED ICON GENERATION. @@ -309,7 +309,7 @@ var/global/list/damage_icon_parts = list() //END CACHED ICON GENERATION. stand_icon.Blend(base_icon,ICON_OVERLAY) - if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... + if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this) overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails). else overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's @@ -360,29 +360,32 @@ var/global/list/damage_icon_parts = list() //MARKINGS OVERLAY /mob/living/carbon/human/proc/update_markings(var/update_icons=1) - //Reset our markings + //Reset our markings. overlays_standing[MARKINGS_LAYER] = null + //Base icon. + var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s") + + //Body markings. var/obj/item/organ/external/chest/chest_organ = get_organ("chest") - if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) ) - if(update_icons) update_icons() - return - - //base icons - var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - - if(m_style && m_style != "None") - var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] - if(marking_style) - var/obj/item/organ/external/head/head_organ = get_organ("head") - if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head") - return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example. - var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") - if(marking_style.do_colouration) - markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) - markings_standing.Blend(markings_s, ICON_OVERLAY) - else - //warning("Invalid m_style for [species.name]: [m_style]") + if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"]) + var/body_marking = m_styles["body"] + var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking] + if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed)) + var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") + if(body_marking_style.do_colouration) + b_marking_s.Blend(m_colours["body"], ICON_ADD) + markings_standing.Blend(b_marking_s, ICON_OVERLAY) + //Head markings. + var/obj/item/organ/external/head/head_organ = get_organ("head") + if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example. + var/head_marking = m_styles["head"] + var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking] + if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed)) + var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") + if(head_marking_style.do_colouration) + h_marking_s.Blend(m_colours["head"], ICON_ADD) + markings_standing.Blend(h_marking_s, ICON_OVERLAY) overlays_standing[MARKINGS_LAYER] = image(markings_standing) @@ -399,7 +402,7 @@ var/global/list/damage_icon_parts = list() return //masks and helmets can obscure our head accessory - if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) if(update_icons) update_icons() return @@ -426,15 +429,15 @@ var/global/list/damage_icon_parts = list() //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) //Reset our hair - overlays_standing[HAIR_LAYER] = null + overlays_standing[HAIR_LAYER] = null var/obj/item/organ/external/head/head_organ = get_organ("head") - if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) if(update_icons) update_icons() return //masks and helmets can obscure our hair, unless we're a synthetic - if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) if(update_icons) update_icons() return @@ -454,13 +457,19 @@ var/global/list/damage_icon_parts = list() else if(hair_style.do_colouration) hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) + if(hair_style.secondary_theme) + var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") + if(!hair_style.no_sec_colour) + hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD) + hair_s.Blend(hair_secondary_s, ICON_OVERLAY) + hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY) //Having it this way preserves animations. Useful for IPC screens. else //warning("Invalid h_style for [species.name]: [h_style]") //hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish? - overlays_standing[HAIR_LAYER] = image(hair_standing) + overlays_standing[HAIR_LAYER] = image(hair_standing) if(update_icons) update_icons() @@ -468,15 +477,15 @@ var/global/list/damage_icon_parts = list() //FACIAL HAIR OVERLAY /mob/living/carbon/human/proc/update_fhair(var/update_icons=1) //Reset our facial hair - overlays_standing[FHAIR_LAYER] = null + overlays_standing[FHAIR_LAYER] = null var/obj/item/organ/external/head/head_organ = get_organ("head") - if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) if(update_icons) update_icons() return //masks and helmets can obscure our facial hair, unless we're a synthetic - if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) if(update_icons) update_icons() return @@ -492,11 +501,18 @@ var/global/list/damage_icon_parts = list() facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) else if(facial_hair_style.do_colouration) facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD) + + if(facial_hair_style.secondary_theme) + var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") + if(!facial_hair_style.no_sec_colour) + facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD) + facial_s.Blend(facial_secondary_s, ICON_OVERLAY) + face_standing.Blend(facial_s, ICON_OVERLAY) else //warning("Invalid f_style for [species.name]: [f_style]") - overlays_standing[FHAIR_LAYER] = image(face_standing) + overlays_standing[FHAIR_LAYER] = image(face_standing) if(update_icons) update_icons() @@ -536,7 +552,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1) //BS12 EDIT - var/skel = (SKELETON in src.mutations) + var/skel = (SKELETON in mutations) if(skel) skeleton = 'icons/mob/human_races/r_skeleton.dmi' else @@ -562,7 +578,7 @@ var/global/list/damage_icon_parts = list() ..() if(notransform) return update_mutations(0) - update_body(0) + update_body(0, 1) //Update the body and force limb icon regeneration. update_hair(0) update_head_accessory(0) update_fhair(0) @@ -997,13 +1013,21 @@ var/global/list/damage_icon_parts = list() if(inv) inv.update_icon() if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory))) + var/obj/item/organ/external/head/head_organ = get_organ("head") + var/datum/sprite_accessory/alt_heads/alternate_head + if(head_organ.alt_head && head_organ.alt_head != "None") + alternate_head = alt_heads_list[head_organ.alt_head] + var/image/standing + var/icon/mask_icon = new(wear_mask.icon) if(wear_mask.icon_override) - standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]") + mask_icon = new(wear_mask.icon_override) + standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name]) - standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]") + mask_icon = new(wear_mask.sprite_sheets[species.name]) + standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") else - standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") + standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA) var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood") @@ -1053,7 +1077,7 @@ var/global/list/damage_icon_parts = list() clear_alert("legcuffed") if(legcuffed) overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed) + throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) if(m_intent != "walk") m_intent = "walk" if(hud_used && hud_used.move_intent) @@ -1121,71 +1145,66 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1) overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER. - overlays_standing[TAIL_LAYER] = null // This will be one of two things: - // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. - // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. + overlays_standing[TAIL_LAYER] = null /* This will be one of two things: + If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. + Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ + + var/icon/tail_marking_icon + var/datum/sprite_accessory/body_markings/tail/tail_marking_style + if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS)) + var/tail_marking = m_styles["tail"] + tail_marking_style = marking_styles_list[tail_marking] + tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s") + tail_marking_icon.Blend(m_colours["tail"], ICON_ADD) if(body_accessory) if(body_accessory.try_restrictions(src)) var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state) if(species.bodyflags & HAS_SKIN_COLOR) accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) - - if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... + if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) + accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) + if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. - var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(species.name in body_accessory.allowed_species) - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay") - temp1 = temp - else - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay") - temp1 = temp + var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") + under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH) + under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) + under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - temp1.Insert(new/icon(accessory_s,dir=SOUTH),dir=SOUTH) - temp1.Insert(new/icon(accessory_s,dir=EAST),dir=EAST) - temp1.Insert(new/icon(accessory_s,dir=WEST),dir=WEST) - - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) // Creates a blank icon, and copies accessory_s' north direction sprite into it // before passing that to the tail layer that overlays uniforms and such. - var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(species.name in body_accessory.allowed_species) - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay") - temp2 = temp - else - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay") - temp2 = temp + var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") + over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - temp2.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH) - - overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") if(species.bodyflags & HAS_SKIN_COLOR) tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - - if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... + if(tail_marking_icon) + tail_s.Blend(tail_marking_icon, ICON_OVERLAY) + if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. - var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay") - temp1.Insert(new/icon(tail_s,dir=SOUTH),dir=SOUTH) - temp1.Insert(new/icon(tail_s,dir=EAST),dir=EAST) - temp1.Insert(new/icon(tail_s,dir=WEST),dir=WEST) + var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank") + under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH) + under.Insert(new/icon(tail_s, dir=EAST), dir=EAST) + under.Insert(new/icon(tail_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under) - // Creates a blank icon, and copies accessory_s' north direction sprite into it - // before passing that to the tail layer that overlays uniforms and such. - var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay") - temp2.Insert(new/icon(tail_s,dir=NORTH),dir=NORTH) + // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. + var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank") + over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(temp2) + overlays_standing[TAIL_LAYER] = image(over) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(tail_s) + overlays_standing[TAIL_LAYER] = image(tail_s) if(update_icons) update_icons() @@ -1193,70 +1212,67 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1) overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER. - overlays_standing[TAIL_LAYER] = null // This will be one of two things: - // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. - // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. + overlays_standing[TAIL_LAYER] = null /* This will be one of two things: + If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. + Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ + + var/icon/tail_marking_icon + var/datum/sprite_accessory/body_markings/tail/tail_marking_style + if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS)) + var/tail_marking = m_styles["tail"] + tail_marking_style = marking_styles_list[tail_marking] + tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s") + tail_marking_icon.Blend(m_colours["tail"], ICON_ADD) if(body_accessory) var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state()) if(species.bodyflags & HAS_SKIN_COLOR) accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) - - if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... + if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) + accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) + if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. - var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(body_accessory.allowed_species) - if(species.name in body_accessory.allowed_species) - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay") - temp1 = temp - else - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay") - temp1 = temp + var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay") + if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) + under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay") + under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH) + under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) + under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - temp1.Insert(accessory_s,dir=SOUTH) - temp1.Insert(accessory_s,dir=EAST) - temp1.Insert(accessory_s,dir=WEST) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. + var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay") + if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank + over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay") + over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - // Creates a blank icon, and copies accessory_s' north direction sprite into it - // before passing that to the tail layer that overlays uniforms and such. - var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(species.name in body_accessory.allowed_species) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay") - temp2 = temp - else // Else if the user's species is not in the list of allowed species for the currently selected body accessory, this point must have been reached by admin-override. Use vulpkanin timings as default. - var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay") - temp2 = temp - - temp2.Insert(accessory_s,dir=NORTH) - - overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) else if(species.tail && species.bodyflags & HAS_TAIL) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s") if(species.bodyflags & HAS_SKIN_COLOR) tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - - if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... + if(tail_marking_icon) + tailw_s.Blend(tail_marking_icon, ICON_OVERLAY) + if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. - var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay") - temp1.Insert(tailw_s,dir=SOUTH) - temp1.Insert(tailw_s,dir=EAST) - temp1.Insert(tailw_s,dir=WEST) + var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay") + under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH) + under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST) + under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under) - // Creates a blank icon, and copies accessory_s' north direction sprite into it - // before passing that to the tail layer that overlays uniforms and such. - var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay") - temp2.Insert(tailw_s,dir=NORTH) + // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. + var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay") + over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(temp2) + overlays_standing[TAIL_LAYER] = image(over) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(tailw_s) + overlays_standing[TAIL_LAYER] = image(tailw_s) if(update_icons) update_icons() @@ -1282,17 +1298,17 @@ var/global/list/damage_icon_parts = list() if(wear_suit.icon_override) var/icon_path = "[wear_suit.icon_override]" icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty). - var/icon/icon_file if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. - icon_file = new(icon_path) - standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") + var/icon/icon_file = new(icon_path) + if(wear_suit.icon_state in icon_file.IconStates()) + standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name]) var/icon_path = "[wear_suit.sprite_sheets[species.name]]" icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty). - var/icon/icon_file if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. - icon_file = new(icon_path) - standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") + var/icon/icon_file = new(icon_path) + if(wear_suit.icon_state in icon_file.IconStates()) + standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") else if(wear_suit.icon_state in C.IconStates()) standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 985047a8284..5e0841168e0 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -49,10 +49,10 @@ var/datum/gas_mixture/breath if(health <= config.health_threshold_crit) - losebreath++ + AdjustLoseBreath(1) if(losebreath > 0) - losebreath-- + AdjustLoseBreath(-1) if(prob(10)) spawn emote("gasp") if(istype(loc, /obj/)) @@ -165,7 +165,7 @@ if(SA_partialpressure > SA_para_min) Paralyse(3) if(SA_partialpressure > SA_sleep_min) - sleeping = max(sleeping+2, 10) + AdjustSleeping(2, bound_lower = 0, bound_upper = 10) else if(SA_partialpressure > 0.01) if(prob(20)) spawn(0) emote(pick("giggle","laugh")) @@ -319,30 +319,27 @@ C.pixel_x -= pixel_x_diff C.pixel_y -= pixel_y_diff src = oldsrc - dizziness = max(dizziness - restingpwr, 0) + AdjustDizzy(-restingpwr) if(drowsyness) - drowsyness = max(drowsyness - restingpwr, 0) - eye_blurry = max(2, eye_blurry) + AdjustDrowsy(-restingpwr) + EyeBlurry(2) if(prob(5)) - sleeping += 1 + AdjustSleeping(1) Paralyse(5) if(confused) - confused = max(0, confused - 1) + AdjustConfused(-1) //Jitteryness if(jitteriness) do_jitter_animation(jitteriness) - jitteriness = max(jitteriness - restingpwr, 0) + AdjustJitter(-restingpwr) if(hallucination) spawn handle_hallucinations() - if(hallucination<=2) - hallucination = 0 - else - hallucination -= 2 + AdjustHallucinate(-2) /mob/living/carbon/handle_sleeping() if(..()) @@ -352,8 +349,8 @@ spawn(0) emote("snore") // Keep SSD people asleep - if(player_logged && sleeping < 2) - sleeping = 2 + if(player_logged) + Sleeping(2) return sleeping diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index b51e0084ee3..6e3221c19fa 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -208,25 +208,25 @@ if(src.stuttering) src.stuttering = 0 if(src.eye_blind) - src.eye_blind = 0 + src.SetEyeBlind(0) src.blinded = 1 - if(src.ear_deaf > 0) src.ear_deaf = 0 + if(src.ear_deaf > 0) SetEarDeaf(0) if(src.ear_damage < 25) - src.ear_damage = 0 + SetEarDamage(0) src.density = !( src.lying ) if(src.disabilities & BLIND) src.blinded = 1 if(src.disabilities & DEAF) - src.ear_deaf = 1 + EarDeaf(1) if(src.eye_blurry > 0) - src.eye_blurry = 0 + SetEyeBlurry(0) if(src.druggy > 0) - src.druggy = 0 + SetDruggy(0) return 1 diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm new file mode 100644 index 00000000000..3b0d3a045fc --- /dev/null +++ b/code/modules/mob/living/carbon/update_status.dm @@ -0,0 +1,17 @@ +/mob/living/carbon/update_stat() + if(status_flags & GODMODE) + return + if(stat != DEAD) +// if(health <= min_health) + if(health <= config.health_threshold_dead) + death() + return +// if(paralysis || sleeping || getOxyLoss() > low_oxy_ko || (status_flags & FAKEDEATH) || health <= crit_health) + if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit) + if(stat == CONSCIOUS) + KnockOut() + else + if(stat == UNCONSCIOUS) + // updating=FALSE because `WakeUp` will handle canmove up for us + StopResting(updating=FALSE) + WakeUp() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 921080c989a..ffd1fb9cd60 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -57,17 +57,16 @@ rad_damage = max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0) radiation += rad_damage if(SLUR) - slurring = max(slurring,(effect * blocked)) + Slur(effect * blocked) if(STUTTER) - if(status_flags & CANSTUN) // stun is usually associated with stutter - stuttering = max(stuttering,(effect * blocked)) + Stuttering(effect * blocked) if(EYE_BLUR) - eye_blurry = max(eye_blurry,(effect * blocked)) + EyeBlurry(effect * blocked) if(DROWSY) - drowsyness = max(drowsyness,(effect * blocked)) + Drowsy(effect * blocked) if(JITTER) if(status_flags & CANSTUN) - jitteriness = max(jitteriness,(effect * blocked)) + Jitter(effect * blocked) updatehealth() return 1 diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index e17d9af6250..c5ce705ba17 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -3,4 +3,4 @@ clear_fullscreens() update_action_buttons_icon() - ..(gibbed) \ No newline at end of file + ..(gibbed) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index a151a062bce..e7222caa910 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -117,14 +117,14 @@ /mob/living/proc/handle_stunned() if(stunned) - AdjustStunned(-1) + AdjustStunned(-1, updating = 1, force = 1) if(!stunned) update_icons() return stunned /mob/living/proc/handle_weakened() if(weakened) - AdjustWeakened(-1) + AdjustWeakened(-1, updating = 1, force = 1) if(!weakened) update_icons() return weakened @@ -136,22 +136,22 @@ /mob/living/proc/handle_silent() if(silent) - silent = max(silent-1, 0) + AdjustSilence(-1) return silent /mob/living/proc/handle_drugged() if(druggy) - druggy = max(druggy-1, 0) + AdjustDruggy(-1) return druggy /mob/living/proc/handle_slurring() if(slurring) - slurring = max(slurring-1, 0) + AdjustSlur(-1) return slurring /mob/living/proc/handle_paralysed() if(paralysis) - AdjustParalysis(-1) + AdjustParalysis(-1, updating = 1, force = 1) return paralysis /mob/living/proc/handle_sleeping() @@ -164,7 +164,7 @@ /mob/living/proc/handle_slowed() if(slowed) - slowed = max(slowed-1, 0) + AdjustSlowed(-1) return slowed /mob/living/proc/handle_drunk() @@ -175,19 +175,20 @@ /mob/living/proc/handle_disabilities() //Eyes if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own - eye_blind = max(eye_blind, 1) + EyeBlind(1) else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) + AdjustEyeBlind(-1) else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + AdjustEyeBlurry(-1) //Ears if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) + EarDeaf(1) else // deafness heals slowly over time, unless ear_damage is over 100 if(ear_damage < 100) - adjustEarDamage(-0.05,-1) + AdjustEarDamage(-0.05) + AdjustEarDeaf(-1) //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 72cc4789779..6be18445b44 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -261,19 +261,6 @@ var/obj/item/organ/external/def_zone = ran_zone(t) return def_zone - -//damage/heal the mob ears and adjust the deaf amount -/mob/living/adjustEarDamage(damage, deaf) - ear_damage = max(0, ear_damage + damage) - ear_deaf = max(0, ear_deaf + deaf) - -//pass a negative argument to skip one of the variable -/mob/living/setEarDamage(damage, deaf) - if(damage >= 0) - ear_damage = damage - if(deaf >= 0) - ear_deaf = deaf - // heal ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/heal_organ_damage(var/brute, var/burn) adjustBruteLoss(-brute) @@ -323,14 +310,6 @@ C.reagents.clear_reagents() C.reagents.addiction_list.Cut() -/mob/living/proc/update_revive() // handles revival through other means than cloning or adminbus (defib, IPC repair) - stat = CONSCIOUS - dead_mob_list -= src - living_mob_list |= src - mob_list |= src - setEarDamage(-1,0) - timeofdeath = 0 - /mob/living/proc/rejuvenate() var/mob/living/carbon/human/human_mob = null //Get this declared for use later. @@ -341,25 +320,33 @@ setBrainLoss(0) setStaminaLoss(0) SetSleeping(0) - SetParalysis(0) - SetStunned(0) - SetWeakened(0) - slowed = 0 - losebreath = 0 - dizziness = 0 - jitteriness = 0 - confused = 0 - drowsyness = 0 + SetParalysis(0, 1, 1) + SetStunned(0, 1, 1) + SetWeakened(0, 1, 1) + SetSlowed(0) + SetLoseBreath(0) + SetDizzy(0) + SetJitter(0) + SetConfused(0) + SetDrowsy(0) radiation = 0 - druggy = 0 - hallucination = 0 + SetDruggy(0) + SetHallucinate(0) + blinded = 0 nutrition = 400 bodytemperature = 310 - disabilities = 0 - blinded = 0 - eye_blind = 0 - eye_blurry = 0 - setEarDamage(0,0) + CureBlind() + CureNearsighted() + CureMute() + CureDeaf() + CureTourettes() + CureEpilepsy() + CureCoughing() + CureNervous() + SetEyeBlind(0) + SetEyeBlurry(0) + SetEarDamage(0) + SetEarDeaf(0) heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c142c8d28d1..c3dab651906 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -15,8 +15,6 @@ var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot. var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this. - var/hallucination = 0 //Directly affects how long a mob will hallucinate for - var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. @@ -32,7 +30,6 @@ var/update_slimes = 1 var/implanting = 0 //Used for the mind-slave implant - var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. var/floating = 0 var/mob_size = MOB_SIZE_HUMAN var/nightvision = 0 diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 71e26e60858..10ba19b4302 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -4,6 +4,6 @@ if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts. mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. //This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD. - if(sleeping < 2 && mind.active) - sleeping = 2 - player_logged = 1 \ No newline at end of file + if(mind.active) + Sleeping(2) + player_logged = 1 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e534d67ee72..3987b709e3e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -80,9 +80,6 @@ proc/get_radio_key_from_channel(var/channel) verb = "stammers" speech_problem_flag = 1 - if(COMIC in mutations) - message = "[message]" - if(!IsVocal()) message = "" speech_problem_flag = 1 @@ -283,8 +280,14 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/GetVoice() return name -/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't - if(stat) return 0 //already snowflaked to shit can call the parent and handle emoting sanely +/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely + if(client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot speak in IC (Muted).") + return + + if(stat) + return 0 if(..(act, type, message)) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c0800a2413d..95f9362684b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -97,12 +97,7 @@ var/list/ai_verbs_default = list( var/obj/machinery/camera/portable/builtInCamera - //var/obj/item/borg/sight/hud/sec/sechud = null - //var/obj/item/borg/sight/hud/med/healthhud = null - var/arrivalmsg = "$name, $rank, has arrived on the station." - med_hud = DATA_HUD_MEDICAL_BASIC - sec_hud = DATA_HUD_SECURITY_BASIC /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 8cf6863eafb..2a3b39c1c9b 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -82,7 +82,7 @@ var/const/VOX_PATH = "sound/vox_fem/" for(var/mob/M in player_list) if(M.client) var/turf/T = get_turf(M) - if(T && T.z == z_level && !isdeaf(M)) + if(T && T.z == z_level && M.can_hear()) M << voice else only_listener << voice diff --git a/code/modules/mob/living/silicon/ai/update_status.dm b/code/modules/mob/living/silicon/ai/update_status.dm new file mode 100644 index 00000000000..4fa060abf39 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/update_status.dm @@ -0,0 +1,10 @@ +/mob/living/silicon/ai/update_stat() + if(status_flags & GODMODE) + return + if(stat != DEAD) + if(health <= config.health_threshold_dead) + death() + return + else if(stat == UNCONSCIOUS) + WakeUp() + //diag_hud_set_status() diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index cc2cb3e8435..01240adf942 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,8 +1,12 @@ /mob/living/silicon/Login() - sleeping = 0 + SetSleeping(0) if(mind && ticker && ticker.mode) - ticker.mode.remove_cultist(mind, 1) ticker.mode.remove_revolutionary(mind, 1) - ticker.mode.remove_thrall(mind,0) + ticker.mode.remove_cultist(mind, 1) + ticker.mode.remove_wizard(mind) + ticker.mode.remove_changeling(mind) + ticker.mode.remove_vampire(mind) + ticker.mode.remove_thrall(mind, 0) ticker.mode.remove_shadowling(mind) - ..() \ No newline at end of file + ticker.mode.remove_abductor(mind) + ..() diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index dfa79a0d0d1..104c2746d16 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -547,8 +547,7 @@ else var/datum/gas_mixture/env = T.return_air() data["reading"] = 1 - var/pres = env.return_pressure() * 10 - data["pressure"] = "[round(pres/10)].[pres%10]" + data["pressure"] = env.return_pressure() data["temperature"] = round(env.temperature) data["temperatureC"] = round(env.temperature-T0C) diff --git a/code/modules/mob/living/silicon/pai/update_status.dm b/code/modules/mob/living/silicon/pai/update_status.dm new file mode 100644 index 00000000000..155ecc84a28 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/update_status.dm @@ -0,0 +1,3 @@ +/mob/living/silicon/pai/update_stat() + if(health <= 0) + death(gibbed = 0) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 974f0d1a0e9..fdc1ace289c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -13,9 +13,10 @@ lawupdate = 0 density = 0 req_access = list(access_engine, access_robotics) - local_transmit = 1 ventcrawler = 2 magpulse = 1 + + default_language = "Drone" // We need to keep track of a few module items so we don't need to do list operations // every time we need them. These get set in New() after the module is chosen. @@ -39,7 +40,13 @@ ..() remove_language("Robot Talk") + remove_language("Galactic Common") add_language("Drone Talk", 1) + add_language("Drone", 1) + + // Disable the microphone wire on Drones + if(radio) + radio.wires.CutWireIndex(WIRE_TRANSMIT) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") @@ -285,7 +292,7 @@ full_law_reset() to_chat(src, "
You are a maintenance drone, a tiny-brained robotic repair machine.") to_chat(src, "You have no individual will, no personality, and no drives or urges other than your laws.") - to_chat(src, "Use ; to talk to other drones, and say to speak silently to your nearby fellows.") + to_chat(src, "Use :d to talk to other drones, and say to speak silently in a language only your fellows understand.") to_chat(src, "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI.") to_chat(src, "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets.") to_chat(src, "Make sure crew members do not notice you..") diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 5d00d45f97c..053384baba5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -1,43 +1,14 @@ -/mob/living/silicon/robot/drone/say(var/message) - if(local_transmit) - if(src.client) - if(client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot send IC messages (muted).") - return 0 - if(src.client.handle_spam_prevention(message,MUTE_IC)) - return 0 - - message = sanitize(message) - - if(stat == 2) - return say_dead(message) - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - if(copytext(message,1,2) == ";") - var/datum/language/L = all_languages["Drone Talk"] - if(istype(L)) - return L.broadcast(src,trim(copytext(message,2))) - - //Must be concious to speak - if(stat) - return 0 - - var/list/listeners = hearers(5,src) - listeners |= src - - for(var/mob/living/silicon/D in listeners) - if(D.client && D.local_transmit) - to_chat(D, "[src] transmits, \"[message]\"") - - for(var/mob/M in player_list) - if(istype(M, /mob/new_player)) - continue - else if(M.stat == 2 && M.client && M.client.prefs.toggles & CHAT_GHOSTEARS) - to_chat(M, "[src] transmits, \"[message]\"") - return 1 - return ..(message, 0) +/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null) + if(copytext(message, 1, 2) == "*") + return emote(copytext(message, 2)) + + if(!speaking) + speaking = parse_language(message) + if(!speaking) + speaking = istype(get_default_language(), /datum/language) ? get_default_language() : all_languages[get_default_language()] + message = speaking.key + " " + message; // Prepend key to prevent the message from getting trimmed + if(speaking) + return ..() /mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") say(message) //drones do not get to whisper, only speak normally diff --git a/code/modules/mob/living/silicon/robot/drone/update_status.dm b/code/modules/mob/living/silicon/robot/drone/update_status.dm new file mode 100644 index 00000000000..97d2214c2e2 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/update_status.dm @@ -0,0 +1,10 @@ +//Easiest to check this here, then check again in the robot proc. +//Standard robots use config for crit, which is somewhat excessive for these guys. +//Drones killed by damage will gib. +/mob/living/silicon/robot/drone/update_stat() + if(status_flags & GODMODE) + return + if(health <= -35 && stat != DEAD) + gib() + return + return ..() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index b2c8857f040..ca480d987f8 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -62,7 +62,7 @@ if(sleeping) Paralyse(3) - sleeping-- + AdjustSleeping(-1) if(resting) Weaken(5) @@ -90,7 +90,7 @@ stat = UNCONSCIOUS if(!paralysis > 0) - eye_blind = 0 + SetEyeBlind(0) else stat = CONSCIOUS @@ -98,7 +98,7 @@ diag_hud_set_health() diag_hud_set_status() else //dead - eye_blind = 1 + SetEyeBlind(0) //update the state of modules and components here if(stat != CONSCIOUS) diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 84fcd64f849..2dd61d9a2ce 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -4,9 +4,3 @@ client.hotkeytype = "Cyborg" regenerate_icons() show_laws(0) - if(mind) ticker.mode.remove_cultist(mind) - if(mind) ticker.mode.remove_revolutionary(mind) - if(mind) ticker.mode.remove_thrall(mind,0) - if(mind) ticker.mode.remove_shadowling(mind) - if(mind) ticker.mode.remove_changeling(mind) - return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index afae06678d2..335ecbcd1f6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -78,16 +78,13 @@ var/list/robot_verbs_default = list( var/updating = 0 //portable camera camerachunk update - hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD,NATIONS_HUD) + hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, NATIONS_HUD) var/magpulse = 0 var/ionpulse = 0 // Jetpack-like effect. var/ionpulse_on = 0 // Jetpack-like effect. var/datum/effect/system/ion_trail_follow/ion_trail // Ionpulse effect. - - var/obj/item/borg/sight/hud/sec/sechud = null - var/obj/item/borg/sight/hud/med/healthhud = null - + var/datum/action/item_action/toggle_research_scanner/scanner = null /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0) @@ -733,18 +730,18 @@ var/list/robot_verbs_default = list( else to_chat(user, "Unable to locate a radio.") - else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card + else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover - to_chat(user, "The interface seems slightly damaged") + to_chat(user, "The interface seems slightly damaged.") if(opened) to_chat(user, "You must close the cover to swipe an ID card.") else - if(allowed(usr)) + if(allowed(W)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.") update_icons() else - to_chat(user, "\red Access denied.") + to_chat(user, "Access denied.") else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W @@ -960,29 +957,15 @@ var/list/robot_verbs_default = list( user.visible_message("[user] pets [src]!", \ "You pet [src]!") -/mob/living/silicon/robot/proc/allowed(mob/M) - //check if it doesn't require any access at all - if(check_access(null)) +/mob/living/silicon/robot/proc/allowed(obj/item/I) + var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob + dummy.req_access = req_access + + if(dummy.check_access(I)) + qdel(dummy) return 1 - 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(check_access(H.get_active_hand()) || check_access(H.wear_id)) - return 1 - return 0 - -/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) - if(!istype(req_access, /list)) //something's very wrong - return 1 - - var/list/L = 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 req_access) - if(req in I.access) //have one of the required accesses - return 1 + + qdel(dummy) return 0 /mob/living/silicon/robot/update_icons() diff --git a/code/modules/mob/living/silicon/robot/update_status.dm b/code/modules/mob/living/silicon/robot/update_status.dm new file mode 100644 index 00000000000..a28aae28278 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/update_status.dm @@ -0,0 +1,21 @@ +// No args for restraints because robots don't have those +/mob/living/silicon/robot/incapacitated() + if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator")) + return 1 + +/mob/living/silicon/robot/update_stat() + if(status_flags & GODMODE) + return + if(stat != DEAD) + if(health <= -maxHealth) //die only once + death() + return + if(!is_component_functioning("actuator") || paralysis || sleeping || stunned || weakened || getOxyLoss() > maxHealth * 0.5) + if(stat == CONSCIOUS) + KnockOut() + else + if(stat == UNCONSCIOUS) + WakeUp() + // diag_hud_set_status() + // diag_hud_set_health() + // update_health_hud() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index fcc5c5dcbdd..469b6e86574 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -32,7 +32,6 @@ var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud - var/local_transmit //If set, can only speak to others of the same type within a short range. var/obj/item/device/radio/common_radio /mob/living/silicon/New() @@ -153,7 +152,7 @@ //Silicon mob language procs -/mob/living/silicon/can_speak(datum/language/speaking) +/mob/living/silicon/can_speak_language(datum/language/speaking) return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language /mob/living/silicon/add_language(var/language, var/can_speak=1) @@ -356,8 +355,8 @@ /////////////////////////////////// EAR DAMAGE //////////////////////////////////// -/mob/living/silicon/adjustEarDamage() +/mob/living/silicon/SetEarDamage() return -/mob/living/silicon/setEarDamage() - return \ No newline at end of file +/mob/living/silicon/SetEarDeaf() + return diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index fdad2a9e37b..d713c6dcf23 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -95,11 +95,6 @@ construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) force_threshold = 11 - -/mob/living/simple_animal/construct/armoured/Life() - weakened = 0 - return ..() - /mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 80 - round(P.damage/3) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 4c974c46c16..47c243e970e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -466,6 +466,9 @@ return if(istype(target, /obj/mecha/working/ripley)) var/obj/mecha/D = target + if(D.icon_state != "ripley-open") + to_chat(user, "You can't add armour onto the mech while someone is inside!") + return var/list/damage_absorption = D.damage_absorption if(damage_absorption["brute"] > 0.3) damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) @@ -474,17 +477,11 @@ damage_absorption["laser"] = damage_absorption["laser"] - 0.025 to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") qdel(src) - if(D.icon_state == "ripley-open") - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") - D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - else - to_chat(user, "You can't add armour onto the mech while someone is inside!") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") + D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." if(damage_absorption.["brute"] == 0.3) - if(D.icon_state == "ripley-open") - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") - D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." - else - to_chat(user, "You can't add armour onto the mech while someone is inside!") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") + D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else to_chat(user, "You can't improve [D] any further!") return diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm index c59cdf0570a..64469bb87ef 100644 --- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm +++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm @@ -154,7 +154,7 @@ if(istype(noms, /turf/simulated/wall)) W = noms nomDelay *= 2 - if(W.walltype == "rwall") + if(istype(W, /turf/simulated/wall/r_wall)) nomDelay *= 2 else return diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index cb48c63b66f..d749db16bf5 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -118,11 +118,11 @@ for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) - if(!M.eye_blind) + if(M.has_vision()) return M for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you if(M.occupant && M.occupant.client) - if(!M.occupant.eye_blind) + if(M.occupant.has_vision()) return M.occupant return null @@ -185,7 +185,7 @@ continue var/turf/T = get_turf(L.loc) if(T && T in targets) - L.eye_blind = max(L.eye_blind, 4) + L.EyeBlind(4) return //Toggle Night Vision diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 06160dca1fd..cc5b319c84f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -706,8 +706,8 @@ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion return -/mob/living/simple_animal/adjustEarDamage() +/mob/living/simple_animal/SetEarDamage() return -/mob/living/simple_animal/setEarDamage() - return \ No newline at end of file +/mob/living/simple_animal/SetEarDeaf() + return diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index b21c3110b1d..6a18da90aaa 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -212,9 +212,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, //||Fur and Fur Products || -/obj - var/f_amt = 0 // registers fur amount as an object variable - /obj/item/stack/sheet/fur //basic fur sheets (very lumpy furry piles of sheets) name = "pile of fur" @@ -223,38 +220,40 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, icon = 'icons/mob/tribbles.dmi' icon_state = "sheet-fur" origin_tech = "materials=2" - f_amt = 1000 max_amount = 50 + /obj/item/clothing/ears/earmuffs/tribblemuffs //earmuffs but with tribbles name = "earmuffs" desc = "Protects your hearing from loud noises, and quiet ones as well." icon = 'icons/mob/tribbles.dmi' icon_state = "tribblemuffs" item_state = "tribblemuffs" - f_amt = 2000 +/* The advanced cold protection of the non-coat items has been removed, so as not + to give patreon donors an unfair advantage - the winter coat provides equivalent + cold protection +*/ /obj/item/clothing/gloves/furgloves desc = "These gloves are warm and furry." name = "fur gloves" icon = 'icons/mob/tribbles.dmi' icon_state = "furglovesico" item_state = "furgloves" - f_amt = 3000 - - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + transfer_prints = TRUE + transfer_blood = TRUE + siemens_coefficient = 0 +// Equivalent to a winter coat's hood /obj/item/clothing/head/furcap name = "fur cap" desc = "A warm furry cap." icon = 'icons/mob/tribbles.dmi' icon_state = "furcap" item_state = "furcap" - f_amt = 5000 cold_protection = HEAD - min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT /obj/item/clothing/shoes/furboots name = "fur boots" @@ -262,11 +261,8 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, icon = 'icons/mob/tribbles.dmi' icon_state = "furboots" item_state = "furboots" - f_amt = 4000 - - cold_protection = FEET - min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT +// As a donator piece of clothing, this is now in line with the winter coat /obj/item/clothing/suit/furcoat name = "fur coat" desc = "A trenchcoat made from fur. You could put an oxygen tank in one of the pockets." @@ -274,11 +270,10 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, icon_state = "furcoat" item_state = "furcoat" blood_overlay_type = "armor" - f_amt = 15000 - body_parts_covered = UPPER_TORSO|LEGS|ARMS|LOWER_TORSO + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO allowed = list (/obj/item/weapon/tank/emergency_oxygen) - cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | ARMS - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + cold_protection = UPPER_TORSO | LOWER_TORSO | ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT /obj/item/clothing/suit/furcape name = "fur cape" @@ -287,7 +282,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, icon_state = "furcape" item_state = "furcape" blood_overlay_type = "armor" - f_amt = 10000 - body_parts_covered = UPPER_TORSO|LEGS|ARMS - cold_protection = UPPER_TORSO | LEGS | ARMS - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + body_parts_covered = UPPER_TORSO|ARMS + cold_protection = UPPER_TORSO | ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm new file mode 100644 index 00000000000..f04196f9fc9 --- /dev/null +++ b/code/modules/mob/living/stat_states.dm @@ -0,0 +1,51 @@ +// There, now `stat` is a proper state-machine + +/mob/living/proc/KnockOut(updating = 1) + if(stat == DEAD) + log_runtime(EXCEPTION("KnockOut called on a dead mob."), src) + return 0 + else if(stat == UNCONSCIOUS) + return 0 + add_logs(src, null, "fallen unconscious at [atom_loc_line(get_turf(src))]", admin=0) + stat = UNCONSCIOUS + if(updating) + // update_blind_effects() + update_canmove() + return 1 + +/mob/living/proc/WakeUp(updating = 1) + if(stat == DEAD) + log_runtime(EXCEPTION("WakeUp called on a dead mob."), src) + return 0 + else if(stat == CONSCIOUS) + return 0 + add_logs(src, null, "woken up at [atom_loc_line(get_turf(src))]", admin=0) + stat = CONSCIOUS + if(updating) + // update_blind_effects() + update_canmove() + return 1 + +/mob/living/proc/can_be_revived() + . = TRUE + // if(health <= min_health) + if(health <= config.health_threshold_dead) + return FALSE + +// death() is used to make a mob die + +// handles revival through other means than cloning or adminbus (defib, IPC repair) +/mob/living/proc/update_revive(updating = TRUE) + if(stat != DEAD) + return + if(!can_be_revived()) + return + add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0) + stat = CONSCIOUS + dead_mob_list -= src + living_mob_list += src + timeofdeath = null + if(updating) + update_canmove() + // update_blind_effects() + updatehealth() diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm new file mode 100644 index 00000000000..45207fd5426 --- /dev/null +++ b/code/modules/mob/living/status_procs.dm @@ -0,0 +1,513 @@ +//Here are the procs used to modify status effects of a mob. + +// We use these to automatically apply their effects when they are changed, as +// opposed to setting them manually and having to either wait for the next `Life` +// or update by hand + +// The `updating` argument is only available on effects that cause a visual/physical effect on the mob itself +// when applied, such as Stun, Weaken, and Jitter - stuff like Blindness, which has a client-side effect, +// lacks this argument. + +// Ideally, code should only read the vars in this file, and not ever directly +// modify them + +// If you want a mob type to ignore a given status effect, just override the corresponding +// `SetSTATE` proc - since all of the other procs are wrappers around that, +// calling them will have no effect + +// BOOLEAN STATES + +/* + * EyesBlocked + Your eyes are covered somehow + * EarsBlocked + Your ears are covered somehow + * Resting + You are lying down of your own volition + * Flying + For some reason or another you can move while not touching the ground +*/ + + +// STATUS EFFECTS +// All of these decrement over time - at a rate of 1 per life cycle unless otherwise noted +// Status effects sorted alphabetically: +/* + * Confused * + Movement is scrambled + * Dizzy * + The screen goes all warped + * Drowsy + You begin to yawn, and have a chance of incrementing "Paralysis" + * Druggy * + A trippy overlay appears. + * Drunk * + Essentially what your "BAC" is - the higher it is, the more alcohol you have in you + * EarDamage * + Doesn't do much, but if it's 25+, you go deaf. Heals much slower than other statuses - 0.05 normally + * EarDeaf * + You cannot hear. Prevents EarDamage from healing naturally. + * EyeBlind * + You cannot see. Prevents EyeBlurry from healing naturally. + * EyeBlurry * + A hazy overlay appears on your screen. + * Hallucination * + Your character will imagine various effects happening to them, vividly. + * Jitter * + Your character will visibly twitch. Higher values amplify the effect. + * LoseBreath * + Your character is unable to breathe. + * Paralysis * + Your character is knocked out. + * Silent * + Your character is unable to speak. + * Sleeping * + Your character is asleep. + * Slowed * + Your character moves slower. + * Slurring * + Your character cannot enunciate clearly. + * Stunned * + Your character is unable to move, and drops stuff in their hands. They keep standing, though. + * Stuttering * + Your character stutters parts of their messages. + * Weakened * + Your character collapses, but is still conscious. +*/ + +// DISABILITIES +// These are more permanent than the above. +// Disabilities sorted alphabetically +/* + * Blind (32) + Can't see. EyeBlind does not heal when this is active. + * Coughing (4) + Cough occasionally, causing you to drop your items + * Deaf (128) + Can't hear. EarDeaf does not heal when this is active + * Epilepsy (2) + Occasionally go "Epileptic", causing you to become very twitchy, drop all items, and fall to the floor + * Mute (64) + Cannot talk. + * Nearsighted (1) + My glasses! I can't see without my glasses! (Nearsighted overlay when not wearing prescription eyewear) + * Nervous (16) + Occasionally begin to stutter. + * Tourettes (8) + SHIT (say bad words, and drop stuff occasionally) +*/ + +/mob/living + + // Booleans + var/resting = FALSE + + /* + STATUS EFFECTS + */ + +/mob // On `/mob` for now, to support legacy code + var/confused = 0 + var/dizziness = 0 + var/drowsyness = 0 + var/druggy = 0 + var/drunk = 0 + var/ear_damage = 0 + var/ear_deaf = 0 + var/eye_blind = 0 + var/eye_blurry = 0 + var/hallucination = 0 + var/jitteriness = 0 + var/losebreath = 0 + var/paralysis = 0 + var/silent = 0 + var/sleeping = 0 + var/slowed = 0 + var/slurring = 0 + var/stunned = 0 + var/stuttering = 0 + var/weakened = 0 + +/mob/living + // Bitfields + var/disabilities = 0 + +// RESTING + +/mob/living/proc/StartResting(updating = 1) + var/val_change = !resting + resting = TRUE + if(updating && val_change) + update_canmove() + +/mob/living/proc/StopResting(updating = 1) + var/val_change = !!resting + resting = FALSE + if(updating && val_change) + update_canmove() + +/mob/living/proc/StartFlying() + var/val_change = !flying + flying = TRUE + if(val_change) + update_animations() + +/mob/living/proc/StopFlying() + var/val_change = !!flying + flying = FALSE + if(val_change) + update_animations() + + +// SCALAR STATUS EFFECTS + +// CONFUSED + +/mob/living/Confused(amount) + SetConfused(max(confused, amount)) + +/mob/living/SetConfused(amount) + confused = max(amount, 0) + +/mob/living/AdjustConfused(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(confused, amount, bound_lower, bound_upper) + SetConfused(new_value) + +// DIZZY + +/mob/living/Dizzy(amount) + SetDizzy(max(dizziness, amount)) + +/mob/living/SetDizzy(amount) + dizziness = max(amount, 0) + +/mob/living/AdjustDizzy(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(dizziness, amount, bound_lower, bound_upper) + SetDizzy(new_value) + +// DROWSY + +/mob/living/Drowsy(amount) + SetDrowsy(max(drowsyness, amount)) + +/mob/living/SetDrowsy(amount) + drowsyness = max(amount, 0) + +/mob/living/AdjustDrowsy(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(drowsyness, amount, bound_lower, bound_upper) + SetDrowsy(new_value) + +// DRUNK + +/mob/living/Drunk(amount) + SetDrunk(max(drunk, amount)) + +/mob/living/SetDrunk(amount) + drunk = max(amount, 0) + +/mob/living/AdjustDrunk(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(drunk, amount, bound_lower, bound_upper) + SetDrunk(new_value) + +// DRUGGY + +/mob/living/Druggy(amount) + SetDruggy(max(druggy, amount)) + +/mob/living/SetDruggy(amount) + var/old_val = druggy + druggy = max(amount, 0) + // We transitioned to/from 0, so update the druggy overlays + if((old_val == 0 || druggy == 0) && (old_val != druggy)) + update_druggy_effects() + +/mob/living/AdjustDruggy(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(druggy, amount, bound_lower, bound_upper) + SetDruggy(new_value) + +// EAR_DAMAGE + +/mob/living/EarDamage(amount) + SetEarDamage(max(ear_damage, amount)) + +/mob/living/SetEarDamage(amount) + ear_damage = max(amount, 0) + +/mob/living/AdjustEarDamage(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(ear_damage, amount, bound_lower, bound_upper) + SetEarDamage(new_value) + +// EAR_DEAF + +/mob/living/EarDeaf(amount) + SetEarDeaf(max(ear_deaf, amount)) + +/mob/living/SetEarDeaf(amount) + ear_deaf = max(amount, 0) + +/mob/living/AdjustEarDeaf(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(ear_deaf, amount, bound_lower, bound_upper) + SetEarDeaf(new_value) + +// EYE_BLIND + +/mob/living/EyeBlind(amount) + SetEyeBlind(max(eye_blind, amount)) + +/mob/living/SetEyeBlind(amount) + var/old_val = eye_blind + eye_blind = max(amount, 0) + // We transitioned to/from 0, so update the eye blind overlays + if((old_val == 0 || eye_blind == 0) && (old_val != eye_blind)) + update_blind_effects() + +/mob/living/AdjustEyeBlind(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(eye_blind, amount, bound_lower, bound_upper) + SetEyeBlind(new_value) + +// EYE_BLURRY + +/mob/living/EyeBlurry(amount) + SetEyeBlurry(max(eye_blurry, amount)) + +/mob/living/SetEyeBlurry(amount) + var/old_val = eye_blurry + eye_blurry = max(amount, 0) + // We transitioned to/from 0, so update the eye blur overlays + if((old_val == 0 || eye_blurry == 0) && (old_val != eye_blurry)) + update_blurry_effects() + +/mob/living/AdjustEyeBlurry(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(eye_blurry, amount, bound_lower, bound_upper) + SetEyeBlurry(new_value) + +// HALLUCINATION + +/mob/living/Hallucinate(amount) + SetHallucinate(max(hallucination, amount)) + +/mob/living/SetHallucinate(amount) + hallucination = max(amount, 0) + +/mob/living/AdjustHallucinate(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(hallucination, amount, bound_lower, bound_upper) + SetHallucinate(new_value) + +// JITTER + +/mob/living/Jitter(amount, force = 0) + SetJitter(max(jitteriness, amount), force) + +/mob/living/SetJitter(amount, force = 0) + // Jitter is also associated with stun + if(status_flags & CANSTUN || force) + jitteriness = max(amount, 0) + +/mob/living/AdjustJitter(amount, bound_lower = 0, bound_upper = INFINITY, force = 0) + var/new_value = directional_bounded_sum(jitteriness, amount, bound_lower, bound_upper) + SetJitter(new_value, force) + +// LOSE_BREATH + +/mob/living/LoseBreath(amount) + SetLoseBreath(max(losebreath, amount)) + +/mob/living/SetLoseBreath(amount) + losebreath = max(amount, 0) + +/mob/living/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(losebreath, amount, bound_lower, bound_upper) + SetLoseBreath(new_value) + +// PARALYSE + +/mob/living/Paralyse(amount, updating = 1, force = 0) + SetParalysis(max(paralysis, amount), updating, force) + +/mob/living/SetParalysis(amount, updating = 1, force = 0) + if(status_flags & CANPARALYSE || force) + paralysis = max(amount, 0) + if(updating) + update_canmove() + update_stat() + +/mob/living/AdjustParalysis(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0) + var/new_value = directional_bounded_sum(paralysis, amount, bound_lower, bound_upper) + SetParalysis(new_value, updating, force) + +// SILENT + +/mob/living/Silence(amount) + SetSilence(max(silent, amount)) + +/mob/living/SetSilence(amount) + silent = max(amount, 0) + +/mob/living/AdjustSilence(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(silent, amount, bound_lower, bound_upper) + SetSilence(new_value) + +// SLEEPING + +/mob/living/Sleeping(amount, updating = 1) + SetSleeping(max(sleeping, amount), updating) + +/mob/living/SetSleeping(amount, updating = 1) + sleeping = max(amount, 0) + update_sleeping_effects() + if(updating) + update_stat() + update_canmove() + +/mob/living/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1) + var/new_value = directional_bounded_sum(sleeping, amount, bound_lower, bound_upper) + SetSleeping(new_value, updating) + +// SLOWED + +/mob/living/Slowed(amount, updating = 1) + SetSlowed(max(slowed, amount), updating) + +/mob/living/SetSlowed(amount, updating = 1) + slowed = max(amount, 0) + +/mob/living/AdjustSlowed(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1) + var/new_value = directional_bounded_sum(slowed, amount, bound_lower, bound_upper) + SetSlowed(new_value, updating) + +// SLURRING + +/mob/living/Slur(amount) + SetSlur(max(slurring, amount)) + +/mob/living/SetSlur(amount) + slurring = max(amount, 0) + +/mob/living/AdjustSlur(amount, bound_lower = 0, bound_upper = INFINITY) + var/new_value = directional_bounded_sum(slurring, amount, bound_lower, bound_upper) + SetSlur(new_value) + +// STUN + +/mob/living/Stun(amount, updating = 1, force = 0) + SetStunned(max(stunned, amount), updating, force) + +/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" + if(status_flags & CANSTUN || force) + stunned = max(amount, 0) + if(updating) + update_canmove() + +/mob/living/AdjustStunned(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0) + var/new_value = directional_bounded_sum(stunned, amount, bound_lower, bound_upper) + SetStunned(new_value, updating, force) + +// STUTTERING + + +/mob/living/Stuttering(amount, force = 0) + SetStuttering(max(stuttering, amount), force) + +/mob/living/SetStuttering(amount, force = 0) + //From mob/living/apply_effect: "Stuttering is often associated with Stun" + if(status_flags & CANSTUN || force) + stuttering = max(amount, 0) + +/mob/living/AdjustStuttering(amount, bound_lower = 0, bound_upper = INFINITY, force = 0) + var/new_value = directional_bounded_sum(stuttering, amount, bound_lower, bound_upper) + SetStuttering(new_value, force) + +// WEAKEN + +/mob/living/Weaken(amount, updating = 1, force = 0) + SetWeakened(max(weakened, amount), updating, force) + +/mob/living/SetWeakened(amount, updating = 1, force = 0) + if(status_flags & CANWEAKEN || force) + weakened = max(amount, 0) + if(updating) + update_canmove() //updates lying, canmove and icons + +/mob/living/AdjustWeakened(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0) + var/new_value = directional_bounded_sum(weakened, amount, bound_lower, bound_upper) + SetWeakened(new_value, updating, force) + +// +// DISABILITIES +// + +// Blind + +/mob/living/proc/BecomeBlind() + var/val_change = !(disabilities & BLIND) + disabilities |= BLIND + if(val_change) + update_blind_effects() + +/mob/living/proc/CureBlind() + var/val_change = !!(disabilities & BLIND) + disabilities &= ~BLIND + if(val_change) + update_blind_effects() + +// Coughing + +/mob/living/proc/BecomeCoughing() + disabilities |= COUGHING + +/mob/living/proc/CureCoughing() + disabilities &= ~COUGHING + +// Deaf + +/mob/living/proc/BecomeDeaf() + disabilities |= DEAF + +/mob/living/proc/CureDeaf() + disabilities &= ~DEAF + +// Epilepsy + +/mob/living/proc/BecomeEpilepsy() + disabilities |= EPILEPSY + +/mob/living/proc/CureEpilepsy() + disabilities &= ~EPILEPSY + +// Mute + +/mob/living/proc/BecomeMute() + disabilities |= MUTE + +/mob/living/proc/CureMute() + disabilities &= ~MUTE + +// Nearsighted + +/mob/living/proc/BecomeNearsighted() + var/val_change = !(disabilities & NEARSIGHTED) + disabilities |= NEARSIGHTED + if(val_change) + update_nearsighted_effects() + +/mob/living/proc/CureNearsighted() + var/val_change = !!(disabilities & NEARSIGHTED) + disabilities &= ~NEARSIGHTED + if(val_change) + update_nearsighted_effects() + +// Nervous + +/mob/living/proc/BecomeNervous() + disabilities |= NERVOUS + +/mob/living/proc/CureNervous() + disabilities &= ~NERVOUS + +// Tourettes + +/mob/living/proc/BecomeTourettes() + disabilities |= TOURETTES + +/mob/living/proc/CureTourettes() + disabilities &= ~TOURETTES diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm new file mode 100644 index 00000000000..f817b03482e --- /dev/null +++ b/code/modules/mob/living/update_status.dm @@ -0,0 +1,97 @@ +/mob/living/update_blind_effects() + if(!has_vision()) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /obj/screen/alert/blind) + return 1 + else + clear_fullscreen("blind") + clear_alert("blind") + return 0 + +/mob/living/update_blurry_effects() + if(eyes_blurred()) + overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry) + return 1 + else + clear_fullscreen("blurry") + return 0 + +/mob/living/update_druggy_effects() + if(druggy) + overlay_fullscreen("high", /obj/screen/fullscreen/high) + throw_alert("high", /obj/screen/alert/high) + else + clear_fullscreen("high") + clear_alert("high") + +/mob/living/update_nearsighted_effects() + if(disabilities & NEARSIGHTED) + overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + else + clear_fullscreen("nearsighted") + +/mob/living/update_sleeping_effects() + if(sleeping) + throw_alert("asleep", /obj/screen/alert/asleep) + else + clear_alert("asleep") + +// Querying status of the mob + +// Whether the mob can hear things +/mob/living/can_hear() + return !(ear_deaf || (disabilities & DEAF)) + +// Whether the mob is able to see +/mob/living/has_vision() + return !(eye_blind || (disabilities & BLIND) || stat) + +// Whether the mob is capable of talking +/mob/living/can_speak() + return !(silent || (disabilities & MUTE) || is_muzzled()) + +// Whether the mob is capable of standing or not +/mob/living/proc/can_stand() + return !(weakened || paralysis || stat || (status_flags & FAKEDEATH)) + +// Whether the mob is capable of actions or not +/mob/living/incapacitated(ignore_restraints = 0, ignore_grab = 0, ignore_lying = 0) + if(stat || paralysis || stunned || (weakened && lying) || (!ignore_restraints && restrained()) || (!ignore_lying && lying)) + return 1 + +// wonderful proc names, I know - used to check whether the blur overlay +// should show or not +/mob/living/proc/eyes_blurred() + return eye_blurry + +//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. +/mob/living/update_canmove(delay_action_updates = 0) + var/fall_over = !can_stand() + var/buckle_lying = !(buckled && !buckled.buckle_lying) + if(fall_over || resting || stunned) + drop_r_hand() + drop_l_hand() + else + lying = 0 + canmove = 1 + if(buckled) + lying = 90 * buckle_lying + else if((fall_over || resting) && !lying) + fall(fall_over) + + canmove = !(fall_over || resting || stunned || buckled) + density = !lying + if(lying) + if(layer == initial(layer)) + layer = MOB_LAYER - 0.2 + else + if(layer == MOB_LAYER - 0.2) + layer = initial(layer) + + update_transform() + if(!delay_action_updates) + update_action_buttons_icon() + return canmove + +/mob/living/proc/update_stamina() + return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4a292328fb6..6415d077cf0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -62,22 +62,22 @@ if(!client) return if(type) - if(type & 1 && (disabilities & BLIND || blinded || paralysis) )//Vision related + if(type & 1 && !has_vision())//Vision related if(!( alt )) return else msg = alt type = alt_type - if(type & 2 && (disabilities & DEAF || ear_deaf))//Hearing related + if(type & 2 && !can_hear())//Hearing related if(!( alt )) return else msg = alt type = alt_type - if((type & 1 && disabilities & BLIND)) + if(type & 1 && !has_vision()) return // Added voice muffling for Issue 41. - if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2)) + if(stat == UNCONSCIOUS || (sleeping > 0 && stat != DEAD)) to_chat(src, "... You can almost hear someone talking ...") else to_chat(src, msg) @@ -163,13 +163,6 @@ // handle_typing_indicator() return - -/mob/proc/restrained() - return - -/mob/proc/incapacitated() - return - //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() @@ -1031,36 +1024,6 @@ var/list/slot_equipment_priority = list( \ 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. -/mob/proc/update_canmove(delay_action_updates = 0) - var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH) - var/buckle_lying = !(buckled && !buckled.buckle_lying) - if(ko || resting || stunned) - drop_r_hand() - drop_l_hand() - else - lying = 0 - canmove = 1 - if(buckled) - lying = 90 * buckle_lying - else - if((ko || resting) && !lying) - fall(ko) - - canmove = !(ko || resting || stunned || buckled) - density = !lying - if(lying) - if(layer == initial(layer)) - layer = MOB_LAYER - 0.2 - else - if(layer == MOB_LAYER - 0.2) - layer = initial(layer) - - update_transform() - if(!delay_action_updates) - update_action_buttons_icon() - return canmove - /mob/proc/fall(var/forced) drop_l_hand() drop_r_hand() @@ -1101,77 +1064,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/activate_hand(selhand) return -/mob/proc/Jitter(amount) - jitteriness = max(jitteriness, amount, 0) - -/mob/proc/Dizzy(amount) - dizziness = max(dizziness, amount, 0) - -/mob/proc/AdjustDrunk(amount) - drunk = max(drunk + amount, 0) - -/mob/proc/Stun(amount) - SetStunned(max(stunned, amount)) - -/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" - if(status_flags & CANSTUN) - stunned = max(amount, 0) - update_canmove() - else if(stunned) - stunned = 0 - update_canmove() - -/mob/proc/AdjustStunned(amount) - SetStunned(stunned + amount) - -/mob/proc/Weaken(amount) - SetWeakened(max(weakened, amount)) - -/mob/proc/SetWeakened(amount) - if(status_flags & CANWEAKEN) - weakened = max(amount, 0) - update_canmove() //updates lying, canmove and icons - else if(weakened) - weakened = 0 - update_canmove() - -/mob/proc/AdjustWeakened(amount) - SetWeakened(weakened + amount) - -/mob/proc/Paralyse(amount) - SetParalysis(max(paralysis, amount)) - -/mob/proc/SetParalysis(amount) - if(status_flags & CANPARALYSE) - paralysis = max(amount, 0) - update_canmove() - else if(paralysis) - paralysis = 0 - update_canmove() - -/mob/proc/AdjustParalysis(amount) - SetParalysis(paralysis + amount) - -/mob/proc/Sleeping(amount) - SetSleeping(max(sleeping, amount)) - -/mob/proc/SetSleeping(amount) - sleeping = max(amount, 0) - update_canmove() - -/mob/proc/AdjustSleeping(amount) - SetSleeping(sleeping + amount) - -/mob/proc/Resting(amount) - SetResting(max(resting, amount)) - -/mob/proc/SetResting(amount) - resting = max(amount, 0) - update_canmove() - -/mob/proc/AdjustResting(amount) - SetResting(resting + amount) - /mob/proc/get_species() return "" @@ -1365,13 +1257,6 @@ mob/proc/yank_out_object() location.add_vomit_floor(src, 1) playsound(location, 'sound/effects/splat.ogg', 50, 1) - -/mob/proc/adjustEarDamage() - return - -/mob/proc/setEarDamage() - return - /mob/proc/AddSpell(obj/effect/proc_holder/spell/S) mob_spell_list += S S.action.Grant(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f7bd04906ea..6cb582e94c1 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -33,18 +33,11 @@ var/obj/machinery/machine = null var/other_mobs = null var/memory = "" - var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/next_move = null var/notransform = null //Carbon var/other = 0.0 var/hand = null - var/eye_blind = 0 //Carbon - var/eye_blurry = 0 //Carbon - var/ear_deaf = 0 //Carbon - var/ear_damage = 0 //Carbon - var/stuttering = 0 //Carbon - var/slurring = 0 //Carbon var/real_name = null var/flavor_text = "" var/med_record = "" @@ -53,11 +46,6 @@ var/blinded = null var/bhunger = 0 //Carbon var/ajourn = 0 - var/druggy = 0 //Carbon - var/confused = 0 //Carbon - var/drunk = 0 - var/sleeping = 0 //Carbon - var/resting = 0 //Carbon var/lying = 0 var/lying_prev = 0 var/canmove = 1 @@ -77,19 +65,11 @@ var/bodytemperature = 310.055 //98.7 F - var/drowsyness = 0.0//Carbon - var/dizziness = 0//Carbon - var/jitteriness = 0//Carbon var/flying = 0 var/charges = 0.0 var/nutrition = 400.0//Carbon var/overeatduration = 0 // How long this guy is overeating //Carbon - var/paralysis = 0 - var/stunned = 0 - var/weakened = 0 - var/slowed = 0 - var/losebreath = 0 //Carbon var/intent = null//Living var/shakecamera = 0 var/a_intent = I_HELP//Living diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 90f84b7fc74..a22d9bf3c6b 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -175,9 +175,9 @@ if(state >= GRAB_KILL) //affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason. - affecting.stuttering = max(affecting.stuttering, 5) //It will hamper your voice, being choked and all. + affecting.Stuttering(5) //It will hamper your voice, being choked and all. affecting.Weaken(5) //Should keep you down unless you get help. - affecting.losebreath = max(affecting.losebreath + 2, 3) + affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) adjust_position() @@ -290,7 +290,7 @@ msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") assailant.next_move = world.time + 10 - affecting.losebreath += 1 + affecting.AdjustLoseBreath(1) affecting.set_dir(WEST) adjust_position() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a8025091a05..b03b9562949 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -75,12 +75,6 @@ proc/iscuffed(A) return 1 return 0 -proc/isdeaf(A) - if(istype(A, /mob)) - var/mob/M = A - return (M.disabilities & DEAF) || M.ear_deaf - return 0 - proc/hassensorlevel(A, var/level) var/mob/living/carbon/human/H = A if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under)) @@ -456,11 +450,15 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) A.jump_target = source if(!alert_overlay) var/old_layer = source.layer + var/old_plane = source.plane source.layer = FLOAT_LAYER + source.plane = FLOAT_PLANE A.overlays += source source.layer = old_layer + source.plane = old_plane else alert_overlay.layer = FLOAT_LAYER + alert_overlay.plane = FLOAT_PLANE A.overlays += alert_overlay /mob/proc/switch_to_camera(var/obj/machinery/camera/C) @@ -510,11 +508,11 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) search_pda = 0 //Fixes renames not being reflected in objective text - var/list/O = subtypesof(/datum/objective) var/length var/pos - for(var/datum/objective/objective in O) - if(objective.target != mind) continue + for(var/datum/objective/objective in all_objectives) + if(!mind || objective.target != mind) + continue length = lentext(oldname) pos = findtextEx(objective.explanation_text, oldname) objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 4c210f6f8f8..d434ab633f7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -162,11 +162,6 @@ if(!mob) return - if(locate(/obj/effect/stop/, mob.loc)) - for(var/obj/effect/stop/S in mob.loc) - if(S.victim == mob) - return - if(mob.stat==DEAD) return // handle possible spirit movement diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ac5b58e011d..3c5e3ac0130 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -567,3 +567,7 @@ /mob/new_player/is_ready() return ready && ..() + +// No hearing announcements +/mob/new_player/can_hear() + return 0 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index cf8a7f05574..f0bcbfe0312 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,6 +1,10 @@ /datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H /datum/preferences/proc/random_character(gender_override) + var/datum/robolimb/robohead + if(species == "Machine") + var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" + robohead = all_robolimbs[head_model] if(gender_override) gender = gender_override else @@ -8,18 +12,41 @@ underwear = random_underwear(gender, species) undershirt = random_undershirt(gender, species) socks = random_socks(gender, species) - if(species in list("Human", "Drask")) - s_tone = random_skin_tone() - h_style = random_hair_style(gender, species) - f_style = random_facial_hair_style(gender, species) - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin") + if(species == "Vulpkanin") + body_accessory = random_body_accessory(species) + if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed. + body_accessory = null + if(species in list("Human", "Drask", "Vox")) + s_tone = random_skin_tone(species) + h_style = random_hair_style(gender, species, robohead) + f_style = random_facial_hair_style(gender, species, robohead) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) randomize_hair_color("hair") - randomize_hair_color("facial") - randomize_eyes_color() - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin") + randomize_hair_color("facial") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) + ha_style = random_head_accessory(species) + var/list/colours = randomize_skin_color(1) + r_headacc = colours["red"] + g_headacc = colours["green"] + b_headacc = colours["blue"] + if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) + m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) + var/list/colours = randomize_skin_color(1) + m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"]) + if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) + m_styles["body"] = random_marking_style("body", species) + var/list/colours = randomize_skin_color(1) + m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"]) + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) + var/list/colours = randomize_skin_color(1) + m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"]) + if(species != "Machine") + randomize_eyes_color() + if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin")) randomize_skin_color() backbag = 2 - age = rand(AGE_MIN,AGE_MAX) + age = rand(AGE_MIN, AGE_MAX) /datum/preferences/proc/randomize_hair_color(var/target = "hair") @@ -130,7 +157,7 @@ g_eyes = green b_eyes = blue -/datum/preferences/proc/randomize_skin_color() +/datum/preferences/proc/randomize_skin_color(var/pass_to_list) var/red var/green var/blue @@ -174,9 +201,17 @@ green = max(min(green + rand (-25, 25), 255), 0) blue = max(min(blue + rand (-25, 25), 255), 0) - r_skin = red - g_skin = green - b_skin = blue + if(pass_to_list) + var/list/colours = list( + "red" = red, + "blue" = blue, + "green" = green + ) + return colours + else + r_skin = red + g_skin = green + b_skin = blue /datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack") switch(backbag) @@ -222,26 +257,12 @@ fat="_fat" preview_icon = new /icon(icobase, "torso_[g][fat]") preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY) - preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY) - - //Tail - if(current_species && (current_species.bodyflags & HAS_TAIL)) - var/tail_icon - var/tail_icon_state - - if(body_accessory) - var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory] - tail_icon = accessory.icon - tail_icon_state = accessory.icon_state - else - tail_icon = "icons/effects/species.dmi" - if(coloured_tail) - tail_icon_state = "[coloured_tail]_s" - else - tail_icon_state = "[current_species.tail]_s" - - var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state) - preview_icon.Blend(temp, ICON_OVERLAY) + var/head = "head" + if(alt_head && current_species.bodyflags & HAS_ALT_HEADS) + var/datum/sprite_accessory/alt_heads/H = alt_heads_list[alt_head] + if(H.icon_state) + head = H.icon_state + preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY) for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand")) if(organ_data[name] == "amputated") continue @@ -266,13 +287,53 @@ else preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - //Body Markings - if(current_species && (current_species.bodyflags & HAS_MARKINGS)) - var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] - if(marking_style && marking_style.species_allowed) - var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") - markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) - preview_icon.Blend(markings_s, ICON_OVERLAY) + //Tail + if(current_species && (current_species.bodyflags & HAS_TAIL)) + var/tail_icon + var/tail_icon_state + + if(body_accessory) + var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory] + tail_icon = accessory.icon + tail_icon_state = accessory.icon_state + else + tail_icon = "icons/effects/species.dmi" + if(coloured_tail) + tail_icon_state = "[coloured_tail]_s" + else + tail_icon_state = "[current_species.tail]_s" + + var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state) + + if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR)) + temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS)) + var/tail_marking = m_styles["tail"] + var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking] + if(tail_marking_style && tail_marking_style.species_allowed) + var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s") + t_marking_s.Blend(m_colours["tail"], ICON_ADD) + temp.Blend(t_marking_s, ICON_OVERLAY) + + preview_icon.Blend(temp, ICON_OVERLAY) + + //Markings + if(current_species && ((current_species.bodyflags & HAS_HEAD_MARKINGS) || (current_species.bodyflags & HAS_BODY_MARKINGS))) + if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings. + var/body_marking = m_styles["body"] + var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking] + if(body_marking_style && body_marking_style.species_allowed) + var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") + b_marking_s.Blend(m_colours["body"], ICON_ADD) + preview_icon.Blend(b_marking_s, ICON_OVERLAY) + if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings. + var/head_marking = m_styles["head"] + var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking] + if(head_marking_style && head_marking_style.species_allowed) + var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") + h_marking_s.Blend(m_colours["head"], ICON_ADD) + preview_icon.Blend(h_marking_s, ICON_OVERLAY) var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s") @@ -289,6 +350,13 @@ hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) else hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + + if(hair_style.secondary_theme) + var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") + if(!hair_style.no_sec_colour) + hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD) + hair_s.Blend(hair_secondary_s, ICON_OVERLAY) + face_s.Blend(hair_s, ICON_OVERLAY) //Head Accessory @@ -306,6 +374,13 @@ facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) else facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + + if(facial_hair_style.secondary_theme) + var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") + if(!facial_hair_style.no_sec_colour) + facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD) + facial_s.Blend(facial_secondary_s, ICON_OVERLAY) + face_s.Blend(facial_s, ICON_OVERLAY) var/icon/underwear_s = null diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 3ade5970d03..0e8f3456335 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -25,14 +25,15 @@ for(var/path in subtypesof(prototype)) var/datum/sprite_accessory/D = new path() - L[D.name] = D + if(D.name) + L[D.name] = D - switch(D.gender) - if(MALE) male[D.name] = D - if(FEMALE) female[D.name] = D - else - male[D.name] = D - female[D.name] = D + switch(D.gender) + if(MALE) male[D.name] = D + if(FEMALE) female[D.name] = D + else + male[D.name] = D + female[D.name] = D return L /datum/sprite_accessory @@ -43,8 +44,12 @@ // Restrict some styles to specific species var/list/species_allowed = list("Human", "Slime People") - var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. + var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. + var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with. + var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with. var/marking_location //Specifies which bodypart a body marking is located on. + var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this. + var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme. // Whether or not the accessory can be affected by colouration var/do_colouration = 1 @@ -61,492 +66,762 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs - bald - name = "Bald" - icon_state = "bald" - gender = MALE - species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton") +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = "bald" + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") - short - name = "Short Hair" // try to capatilize the names please~ - icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you +/datum/sprite_accessory/hair/short + name = "Short Hair" // try to capatilize the names please~ + icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you - cut - name = "Cut Hair" - icon_state = "hair_c" +/datum/sprite_accessory/hair/cut + name = "Cut Hair" + icon_state = "hair_c" - long - name = "Shoulder-length Hair" - icon_state = "hair_b" +/datum/sprite_accessory/hair/long + name = "Shoulder-length Hair" + icon_state = "hair_b" - longalt - name = "Shoulder-length Hair Alt" - icon_state = "hair_longfringe" +/datum/sprite_accessory/hair/longalt + name = "Shoulder-length Hair Alt" + icon_state = "hair_longfringe" - /*longish - name = "Longer Hair" - icon_state = "hair_b2"*/ +/*/datum/sprite_accessory/hair/longish + name = "Longer Hair" + icon_state = "hair_b2"*/ - longer - name = "Long Hair" - icon_state = "hair_vlong" +/datum/sprite_accessory/hair/longer + name = "Long Hair" + icon_state = "hair_vlong" - longeralt - name = "Long Hair Alt" - icon_state = "hair_vlongfringe" +/datum/sprite_accessory/hair/longeralt + name = "Long Hair Alt" + icon_state = "hair_vlongfringe" - longest - name = "Very Long Hair" - icon_state = "hair_longest" +/datum/sprite_accessory/hair/longest + name = "Very Long Hair" + icon_state = "hair_longest" - longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" - longestalt - name = "Longer Fringe" - icon_state = "hair_vlongfringe" +/datum/sprite_accessory/hair/longestalt + name = "Longer Fringe" + icon_state = "hair_vlongfringe" - halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" - halfbangalt - name = "Half-banged Hair Alt" - icon_state = "hair_halfbang_alt" +/datum/sprite_accessory/hair/halfbangalt + name = "Half-banged Hair Alt" + icon_state = "hair_halfbang_alt" - ponytail1 - name = "Ponytail male" - icon_state = "hair_ponytailm" - gender = MALE +/datum/sprite_accessory/hair/ponytail1 + name = "Ponytail male" + icon_state = "hair_ponytailm" + gender = MALE - ponytail2 - name = "Ponytail female" - icon_state = "hair_ponytailf" - gender = FEMALE +/datum/sprite_accessory/hair/ponytail2 + name = "Ponytail female" + icon_state = "hair_ponytailf" + gender = FEMALE - ponytail3 - name = "Ponytail alt" - icon_state = "hair_ponytail3" +/datum/sprite_accessory/hair/ponytail3 + name = "Ponytail alt" + icon_state = "hair_ponytail3" - sideponytail - name = "Side Ponytail" - icon_state = "hair_stail" - gender = FEMALE +/datum/sprite_accessory/hair/sideponytail + name = "Side Ponytail" + icon_state = "hair_stail" + gender = FEMALE - highponytail - name = "High Ponytail" - icon_state = "hair_highponytail" - gender = FEMALE +/datum/sprite_accessory/hair/highponytail + name = "High Ponytail" + icon_state = "hair_highponytail" + gender = FEMALE +/datum/sprite_accessory/hair/wisp + name = "Wisp" + icon_state = "hair_wisp" + gender = FEMALE - wisp - name = "Wisp" - icon_state = "hair_wisp" - gender = FEMALE +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "hair_parted" - parted - name = "Parted" - icon_state = "hair_parted" +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" + gender = MALE + species_allowed = list("Human", "Slime People", "Unathi") - pompadour - name = "Pompadour" - icon_state = "hair_pompadour" - gender = MALE - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" + gender = MALE - quiff - name = "Quiff" - icon_state = "hair_quiff" - gender = MALE +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" - bedhead - name = "Bedhead" - icon_state = "hair_bedhead" +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" - bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" - bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") - beehive - name = "Beehive" - icon_state = "hair_beehive" - gender = FEMALE - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") - bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - gender = FEMALE - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/bob + name = "Bob" + icon_state = "hair_bobcut" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") - bob - name = "Bob" - icon_state = "hair_bobcut" - gender = FEMALE - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "hair_bowlcut" + gender = MALE - bowl - name = "Bowl" - icon_state = "hair_bowlcut" - gender = MALE +/datum/sprite_accessory/hair/braid2 + name = "Long Braid" + icon_state = "hair_hbraid" + gender = FEMALE - braid2 - name = "Long Braid" - icon_state = "hair_hbraid" - gender = FEMALE +/datum/sprite_accessory/hair/braid_hip + name = "Hippie Braid" + icon_state = "hair_hipbraid" + secondary_theme = "beads" - buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - gender = MALE - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/braid_hip_una + name = "Unathi Hippie Braid" + icon_state = "hair_ubraid" + species_allowed = list("Unathi") + secondary_theme = "beads" - crew - name = "Crewcut" - icon_state = "hair_crewcut" - gender = MALE +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" + gender = MALE + species_allowed = list("Human", "Slime People", "Unathi") - combover - name = "Combover" - icon_state = "hair_combover" - gender = MALE +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" + gender = MALE - devillock - name = "Devil Lock" - icon_state = "hair_devilock" +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" + gender = MALE - dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" - curls - name = "Curls" - icon_state = "hair_curls" +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" - afro - name = "Afro" - icon_state = "hair_afro" +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" - afro2 - name = "Afro 2" - icon_state = "hair_afro2" +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "hair_afro" - afro_large - name = "Big Afro" - icon_state = "hair_bigafro" - gender = MALE +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" - sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - gender = MALE +/datum/sprite_accessory/hair/afro_large + name = "Big Afro" + icon_state = "hair_bigafro" + gender = MALE - emo - name = "Emo" - icon_state = "hair_emo" +/datum/sprite_accessory/hair/sergeant + name = "Flat Top" + icon_state = "hair_sergeant" + gender = MALE - fag - name = "Flow Hair" - icon_state = "hair_f" +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" - feather - name = "Feather" - icon_state = "hair_feather" +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "hair_f" - hitop - name = "Hitop" - icon_state = "hair_hitop" - gender = MALE +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" - mohawk - name = "Mohawk" - icon_state = "hair_d" - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" + gender = MALE - jensen - name = "Adam Jensen Hair" - icon_state = "hair_jensen" - gender = MALE +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" + species_allowed = list("Human", "Slime People", "Unathi") - cia - name = "CIA" - icon_state = "hair_cia" - gender = MALE +/datum/sprite_accessory/hair/jensen + name = "Adam Jensen Hair" + icon_state = "hair_jensen" + gender = MALE - mulder - name = "Mulder" - icon_state = "hair_mulder" - gender = MALE +/datum/sprite_accessory/hair/cia + name = "CIA" + icon_state = "hair_cia" + gender = MALE - gelled - name = "Gelled Back" - icon_state = "hair_gelled" - gender = FEMALE +/datum/sprite_accessory/hair/mulder + name = "Mulder" + icon_state = "hair_mulder" + gender = MALE - gentle - name = "Gentle" - icon_state = "hair_gentle" - gender = FEMALE +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" + gender = FEMALE - spiky - name = "Spiky" - icon_state = "hair_spikey" - species_allowed = list("Human", "Unathi") +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" + gender = FEMALE - kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" +/datum/sprite_accessory/hair/spiky + name = "Spiky" + icon_state = "hair_spikey" + species_allowed = list("Human", "Slime People", "Unathi") - kagami - name = "Pigtails" - icon_state = "hair_kagami" - gender = FEMALE +/datum/sprite_accessory/hair/kusanagi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" - himecut - name = "Hime Cut" - icon_state = "hair_himecut" - gender = FEMALE +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" + gender = FEMALE - braid - name = "Floorlength Braid" - icon_state = "hair_braid" - gender = FEMALE +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" + gender = FEMALE - odango - name = "Odango" - icon_state = "hair_odango" - gender = FEMALE +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon_state = "hair_braid" + gender = FEMALE - ombre - name = "Ombre" - icon_state = "hair_ombre" - gender = FEMALE +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + gender = FEMALE - updo - name = "Updo" - icon_state = "hair_updo" - gender = FEMALE +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + gender = FEMALE - skinhead - name = "Skinhead" - icon_state = "hair_skinhead" +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" + gender = FEMALE - balding - name = "Balding Hair" - icon_state = "hair_e" - gender = MALE // turnoff! +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" - longemo - name = "Long Emo" - icon_state = "hair_emolong" - gender = FEMALE +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + gender = MALE // turnoff! + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_emolong" + gender = FEMALE ////////////////////////////// //////START VG HAIRSTYLES///// ////////////////////////////// - birdnest - name = "Bird Nest" - icon_state = "hair_birdnest" +/datum/sprite_accessory/hair/birdnest + name = "Bird Nest" + icon_state = "hair_birdnest" - unkept - name = "Unkempt" - icon_state = "hair_unkept" +/datum/sprite_accessory/hair/unkept + name = "Unkempt" + icon_state = "hair_unkept" - duelist - name = "Duelist" - icon_state = "hair_duelist" - gender = MALE +/datum/sprite_accessory/hair/duelist + name = "Duelist" + icon_state = "hair_duelist" + gender = MALE - modern - name = "Modern" - icon_state = "hair_modern" - gender = FEMALE +/datum/sprite_accessory/hair/modern + name = "Modern" + icon_state = "hair_modern" + gender = FEMALE - unshavenmohawk - name = "Unshaven Mohawk" - icon_state = "hair_unshavenmohawk" - gender = MALE +/datum/sprite_accessory/hair/unshavenmohawk + name = "Unshaven Mohawk" + icon_state = "hair_unshavenmohawk" + gender = MALE - drills - name = "Twincurls" - icon_state = "hair_twincurl" - gender = FEMALE +/datum/sprite_accessory/hair/drills + name = "Twincurls" + icon_state = "hair_twincurl" + gender = FEMALE - minidrills - name = "Twincurls 2" - icon_state = "hair_twincurl2" - gender = FEMALE +/datum/sprite_accessory/hair/minidrills + name = "Twincurls 2" + icon_state = "hair_twincurl2" + gender = FEMALE ////////////////////////////// //////END VG HAIRSTYLES/////// ////////////////////////////// +/datum/sprite_accessory/hair/ipc + species_allowed = list("Machine") - ipc_screen_pink - name = "Pink IPC Screen" - icon_state = "ipc_pink" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_pink + name = "Pink IPC Screen" + icon_state = "ipc_pink" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_red - name = "Red IPC Screen" - icon_state = "ipc_red" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_red + name = "Red IPC Screen" + icon_state = "ipc_red" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_green - name = "Green IPC Screen" - icon_state = "ipc_green" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_green + name = "Green IPC Screen" + icon_state = "ipc_green" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_blue - name = "Blue IPC Screen" - icon_state = "ipc_blue" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_blue + name = "Blue IPC Screen" + icon_state = "ipc_blue" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_breakout - name = "Breakout IPC Screen" - icon_state = "ipc_breakout" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_breakout + name = "Breakout IPC Screen" + icon_state = "ipc_breakout" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_eight - name = "Eight IPC Screen" - icon_state = "ipc_eight" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_eight + name = "Eight IPC Screen" + icon_state = "ipc_eight" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_rainbow - name = "Rainbow IPC Screen" - icon_state = "ipc_rainbow" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow + name = "Rainbow IPC Screen" + icon_state = "ipc_rainbow" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_goggles - name = "Goggles IPC Screen" - icon_state = "ipc_goggles" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_goggles + name = "Goggles IPC Screen" + icon_state = "ipc_goggles" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_heart - name = "Heart IPC Screen" - icon_state = "ipc_heart" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_heart + name = "Heart IPC Screen" + icon_state = "ipc_heart" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_monoeye - name = "Monoeye IPC Screen" - icon_state = "ipc_monoeye" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye + name = "Monoeye IPC Screen" + icon_state = "ipc_monoeye" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_nature - name = "Nature IPC Screen" - icon_state = "ipc_nature" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_nature + name = "Nature IPC Screen" + icon_state = "ipc_nature" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_orange - name = "Orange IPC Screen" - icon_state = "ipc_orange" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_orange + name = "Orange IPC Screen" + icon_state = "ipc_orange" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_purple - name = "Purple IPC Screen" - icon_state = "ipc_purple" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_purple + name = "Purple IPC Screen" + icon_state = "ipc_purple" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_shower - name = "Shower IPC Screen" - icon_state = "ipc_shower" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_shower + name = "Shower IPC Screen" + icon_state = "ipc_shower" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_static - name = "Static IPC Screen" - icon_state = "ipc_static" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_static + name = "Static IPC Screen" + icon_state = "ipc_static" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_yellow - name = "Yellow IPC Screen" - icon_state = "ipc_yellow" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_yellow + name = "Yellow IPC Screen" + icon_state = "ipc_yellow" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_scrolling - name = "Scanline IPC Screen" - icon_state = "ipc_scroll" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling + name = "Scanline IPC Screen" + icon_state = "ipc_scroll" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_console - name = "Console IPC Screen" - icon_state = "ipc_console" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_console + name = "Console IPC Screen" + icon_state = "ipc_console" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_rgb - name = "RGB IPC Screen" - icon_state = "ipc_rgb" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_rgb + name = "RGB IPC Screen" + icon_state = "ipc_rgb" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - ipc_screen_glider - name = "Glider IPC Screen" - icon_state = "ipc_gol_glider" - species_allowed = list("Machine") - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") +/datum/sprite_accessory/hair/ipc/ipc_screen_glider + name = "Glider IPC Screen" + icon_state = "ipc_gol_glider" + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.") - hesphiastos_alt_off - name = "Dark Hesphiastos Screen" - icon_state = "hesphiastos_alt_off" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off + name = "Dark Hesphiastos Screen" + icon_state = "hesphiastos_alt_off" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_pink - name = "Pink Hesphiastos Screen" - icon_state = "hesphiastos_alt_pink" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink + name = "Pink Hesphiastos Screen" + icon_state = "hesphiastos_alt_pink" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_orange - name = "Orange Hesphiastos Screen" - icon_state = "hesphiastos_alt_orange" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange + name = "Orange Hesphiastos Screen" + icon_state = "hesphiastos_alt_orange" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_goggle - name = "Goggles Hesphiastos Screen" - icon_state = "hesphiastos_alt_goggles" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle + name = "Goggles Hesphiastos Screen" + icon_state = "hesphiastos_alt_goggles" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_scroll - name = "Scrolling Hesphiastos Screen" - icon_state = "hesphiastos_alt_scroll" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll + name = "Scrolling Hesphiastos Screen" + icon_state = "hesphiastos_alt_scroll" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_rgb - name = "RGB Hesphiastos Screen" - icon_state = "hesphiastos_alt_rgb" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb + name = "RGB Hesphiastos Screen" + icon_state = "hesphiastos_alt_rgb" + models_allowed = list("Hesphiastos Industries alt.") - hesphiastos_alt_rainbow - name = "Rainbow Hesphiastos Screen" - icon_state = "hesphiastos_alt_rainbow" - species_allowed = list("Machine") - models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow + name = "Rainbow Hesphiastos Screen" + icon_state = "hesphiastos_alt_rainbow" + models_allowed = list("Hesphiastos Industries alt.") + +/* +/////////////////////////////////// +/ =---------------------------= / +/ == Alien Style Definitions == / +/ =---------------------------= / +/////////////////////////////////// +*/ + +/datum/sprite_accessory/hair/unathi + species_allowed = list("Unathi") + +/datum/sprite_accessory/hair/unathi/una_horns + name = "Unathi Horns" + icon_state = "soghun_horns" + +/datum/sprite_accessory/hair/skrell + species_allowed = list("Skrell") + +/datum/sprite_accessory/hair/skrell/skr_tentacle_m + name = "Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + +/datum/sprite_accessory/hair/skrell/skr_tentacle_f + name = "Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + +/datum/sprite_accessory/hair/skrell/skr_gold_m + name = "Gold plated Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "gold" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_gold_f + name = "Gold chained Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "gold" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m + name = "Cloth draped Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "cloth" + +/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f + name = "Cloth draped Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "cloth" + +/datum/sprite_accessory/hair/tajara + species_allowed = list("Tajaran") + +/datum/sprite_accessory/hair/tajara/taj_hair_clean + name = "Tajara Clean" + icon_state = "hair_clean" + +/datum/sprite_accessory/hair/tajara/taj_hair_bangs + name = "Tajara Bangs" + icon_state = "hair_bangs" + +/datum/sprite_accessory/hair/tajara/taj_hair_braid + name = "Tajara Braid" + icon_state = "hair_tbraid" + secondary_theme = "beads" + +/datum/sprite_accessory/hair/tajara/taj_hair_shaggy + name = "Tajara Shaggy" + icon_state = "hair_shaggy" + +/datum/sprite_accessory/hair/tajara/taj_hair_mohawk + name = "Tajaran Mohawk" + icon_state = "hair_mohawk" + +/datum/sprite_accessory/hair/tajara/taj_hair_plait + name = "Tajara Plait" + icon_state = "hair_plait" + +/datum/sprite_accessory/hair/tajara/taj_hair_straight + name = "Tajara Straight" + icon_state = "hair_straight" + +/datum/sprite_accessory/hair/tajara/taj_hair_long + name = "Tajara Long" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/tajara/taj_hair_rattail + name = "Tajara Rat Tail" + icon_state = "hair_rattail" + +/datum/sprite_accessory/hair/tajara/taj_hair_spiky + name = "Tajara Spikey" + icon_state = "hair_tajspikey" + +/datum/sprite_accessory/hair/tajara/taj_hair_messy + name = "Tajara Messy" + icon_state = "hair_messy" + +/datum/sprite_accessory/hair/tajara/taj_hair_curls + name = "Tajara Curly" + icon_state = "hair_curly" + +/datum/sprite_accessory/hair/tajara/taj_hair_retro + name = "Tajaran Ladies' Retro" + icon_state = "hair_ladies_retro" + +/datum/sprite_accessory/hair/tajara/taj_hair_victory + name = "Tajara Victory Curls" + icon_state = "hair_victory" + +/datum/sprite_accessory/hair/tajara/taj_hair_bob + name = "Tajara Bob" + icon_state = "hair_tbob" + +/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl + name = "Tajara Finger Curls" + icon_state = "hair_fingerwave" + +/datum/sprite_accessory/hair/vulpkanin + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam + name = "Kajam" + icon_state = "kajam" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid + name = "Keid" + icon_state = "keid" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara + name = "Adhara" + icon_state = "adhara" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia + name = "Kleeia" + icon_state = "kleeia" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar + name = "Mizar" + icon_state = "mizar" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo + name = "Apollo" + icon_state = "apollo" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle + name = "Belle" + icon_state = "belle" + secondary_theme = "bands" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun + name = "Bun" + icon_state = "bun" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged + name = "Jagged" + icon_state = "jagged" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl + name = "Curl" + icon_state = "curl" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk + name = "Hawk" + icon_state = "hawk" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita + name = "Anita" + icon_state = "anita" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike + name = "Spike" + icon_state = "spike" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided + name = "Braided" + icon_state = "braided" + secondary_theme = "beads" + +/datum/sprite_accessory/hair/vox + species_allowed = list("Vox") + +/datum/sprite_accessory/hair/vox/vox_quills_short + name = "Short Vox Quills" + icon_state = "vox_shortquills" + +/datum/sprite_accessory/hair/vox/vox_crestedquills + name = "Crested Vox Quills" + icon_state = "vox_crestedquills" + +/datum/sprite_accessory/hair/vox/vox_tielquills + name = "Vox Tiel Quills" + icon_state = "vox_tielquills" + +/datum/sprite_accessory/hair/vox/vox_emperorquills + name = "Vox Emperor Quills" + icon_state = "vox_emperorquills" + +/datum/sprite_accessory/hair/vox/vox_keelquills + name = "Vox Keel Quills" + icon_state = "vox_keelquills" + +/datum/sprite_accessory/hair/vox/vox_keetquills + name = "Vox Keet Quills" + icon_state = "vox_keetquills" + +/datum/sprite_accessory/hair/vox/vox_quills_kingly + name = "Kingly Vox Quills" + icon_state = "vox_kingly" + +/datum/sprite_accessory/hair/vox/vox_quills_fluff + name = "Fluffy Vox Quills" + icon_state = "vox_afro" + +/datum/sprite_accessory/hair/vox/vox_quills_mohawk + name = "Vox Quill Mohawk" + icon_state = "vox_mohawk" + +/datum/sprite_accessory/hair/vox/vox_quills_long + name = "Long Vox Quills" + icon_state = "vox_yasu" + +/datum/sprite_accessory/hair/vox/vox_horns + name = "Vox Spikes" + icon_state = "vox_horns" + +/datum/sprite_accessory/hair/vox/vox_nights + name = "Vox Pigtails" + icon_state = "vox_nights" + +/datum/sprite_accessory/hair/vox/vox_razor + name = "Vox Razorback" + icon_state = "vox_razor" + +/datum/sprite_accessory/hair/vox/vox_razor_clipped + name = "Clipped Vox Razorback" + icon_state = "vox_razor_clipped" + +// Apollo-specific + +/datum/sprite_accessory/hair/wryn + species_allowed = list("Wryn") + +/datum/sprite_accessory/hair/wryn/wry_antennae_default + name = "Antennae" + icon_state = "wryn_antennae" + +/datum/sprite_accessory/hair/nucleation + species_allowed = list("Nucleation") + +/datum/sprite_accessory/hair/nucleation/nuc_crystals + name = "Nucleation Crystals" + icon_state = "nuc_crystal" + +/datum/sprite_accessory/hair/nucleation/nuc_betaburns + name = "Nucleation Beta Burns" + icon_state = "nuc_betaburns" + +/datum/sprite_accessory/hair/nucleation/nuc_fallout + name = "Nucleation Fallout" + icon_state = "nuc_fallout" + +/datum/sprite_accessory/hair/nucleation/nuc_frission + name = "Nucleation Frission" + icon_state = "nuc_frission" + +/datum/sprite_accessory/hair/nucleation/nuc_radical + name = "Nucleation Free Radical" + icon_state = "nuc_radical" + +/datum/sprite_accessory/hair/nucleation/nuc_gammaray + name = "Nucleation Gamma Ray" + icon_state = "nuc_gammaray" + +/datum/sprite_accessory/hair/nucleation/nuc_neutron + name = "Nucleation Neutron Bomb" + icon_state = "nuc_neutron" /* @@ -558,559 +833,232 @@ */ /datum/sprite_accessory/facial_hair - icon = 'icons/mob/human_face.dmi' gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P) - shaved - name = "Shaved" - icon_state = "bald" - gender = NEUTER - species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") +/datum/sprite_accessory/facial_hair/shaved + name = "Shaved" + icon_state = "bald" + gender = NEUTER + species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") - watson - name = "Watson Mustache" - icon_state = "facial_watson" +/datum/sprite_accessory/facial_hair/watson + name = "Watson Mustache" + icon_state = "facial_watson" - hogan - name = "Hulk Hogan Mustache" - icon_state = "facial_hogan" //-Neek +/datum/sprite_accessory/facial_hair/hogan + name = "Hulk Hogan Mustache" + icon_state = "facial_hogan" //-Neek - vandyke - name = "Van Dyke Mustache" - icon_state = "facial_vandyke" +/datum/sprite_accessory/facial_hair/vandyke + name = "Van Dyke Mustache" + icon_state = "facial_vandyke" - chaplin - name = "Square Mustache" - icon_state = "facial_chaplin" +/datum/sprite_accessory/facial_hair/chaplin + name = "Square Mustache" + icon_state = "facial_chaplin" - selleck - name = "Selleck Mustache" - icon_state = "facial_selleck" +/datum/sprite_accessory/facial_hair/selleck + name = "Selleck Mustache" + icon_state = "facial_selleck" - neckbeard - name = "Neckbeard" - icon_state = "facial_neckbeard" +/datum/sprite_accessory/facial_hair/neckbeard + name = "Neckbeard" + icon_state = "facial_neckbeard" - fullbeard - name = "Full Beard" - icon_state = "facial_fullbeard" +/datum/sprite_accessory/facial_hair/fullbeard + name = "Full Beard" + icon_state = "facial_fullbeard" - longbeard - name = "Long Beard" - icon_state = "facial_longbeard" +/datum/sprite_accessory/facial_hair/longbeard + name = "Long Beard" + icon_state = "facial_longbeard" - vlongbeard - name = "Very Long Beard" - icon_state = "facial_wise" +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Very Long Beard" + icon_state = "facial_wise" - elvis - name = "Elvis Sideburns" - icon_state = "facial_elvis" - species_allowed = list("Human","Unathi") +/datum/sprite_accessory/facial_hair/elvis + name = "Elvis Sideburns" + icon_state = "facial_elvis" + species_allowed = list("Human", "Slime People", "Unathi") - abe - name = "Abraham Lincoln Beard" - icon_state = "facial_abe" +/datum/sprite_accessory/facial_hair/abe + name = "Abraham Lincoln Beard" + icon_state = "facial_abe" - chinstrap - name = "Chinstrap" - icon_state = "facial_chin" +/datum/sprite_accessory/facial_hair/chinstrap + name = "Chinstrap" + icon_state = "facial_chin" - hip - name = "Hipster Beard" - icon_state = "facial_hip" +/datum/sprite_accessory/facial_hair/hip + name = "Hipster Beard" + icon_state = "facial_hip" - gt - name = "Goatee" - icon_state = "facial_gt" +/datum/sprite_accessory/facial_hair/gt + name = "Goatee" + icon_state = "facial_gt" - jensen - name = "Adam Jensen Beard" - icon_state = "facial_jensen" +/datum/sprite_accessory/facial_hair/jensen + name = "Adam Jensen Beard" + icon_state = "facial_jensen" - dwarf - name = "Dwarf Beard" - icon_state = "facial_dwarf" +/datum/sprite_accessory/facial_hair/dwarf + name = "Dwarf Beard" + icon_state = "facial_dwarf" ////////////////////////////// //////START VG HAIRSTYLES///// ////////////////////////////// - britstache - name = "Brit Stache" - icon_state = "facial_britstache" +/datum/sprite_accessory/facial_hair/britstache + name = "Brit Stache" + icon_state = "facial_britstache" - martialartist - name = "Martial Artist" - icon_state = "facial_martialartist" +/datum/sprite_accessory/facial_hair/martialartist + name = "Martial Artist" + icon_state = "facial_martialartist" - moonshiner - name = "Moonshiner" - icon_state = "facial_moonshiner" +/datum/sprite_accessory/facial_hair/moonshiner + name = "Moonshiner" + icon_state = "facial_moonshiner" - tribeard - name = "Tri-beard" - icon_state = "facial_tribeard" +/datum/sprite_accessory/facial_hair/tribeard + name = "Tri-beard" + icon_state = "facial_tribeard" - unshaven - name = "Unshaven" - icon_state = "facial_unshaven" +/datum/sprite_accessory/facial_hair/unshaven + name = "Unshaven" + icon_state = "facial_unshaven" ////////////////////////////// //////END VG HAIRSTYLES/////// ////////////////////////////// -/* -/////////////////////////////////// -/ =---------------------------= / -/ == Alien Style Definitions == / -/ =---------------------------= / -/////////////////////////////////// -*/ +/datum/sprite_accessory/facial_hair/tajara + species_allowed = list("Tajaran") -/datum/sprite_accessory/hair +/datum/sprite_accessory/facial_hair/tajara/taj_sideburns + name = "Tajara Sideburns" + icon_state = "facial_sideburns" - una_horns - name = "Unathi Horns" - icon_state = "soghun_horns" - species_allowed = list("Unathi") +/datum/sprite_accessory/facial_hair/tajara/taj_mutton + name = "Tajara Mutton" + icon_state = "facial_mutton" - skr_tentacle_m - name = "Skrell Male Tentacles" - icon_state = "skrell_hair_m" - species_allowed = list("Skrell") - gender = MALE +/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache + name = "Tajara Pencilstache" + icon_state = "facial_pencilstache" - skr_tentacle_f - name = "Skrell Female Tentacles" - icon_state = "skrell_hair_f" - species_allowed = list("Skrell") - gender = FEMALE +/datum/sprite_accessory/facial_hair/tajara/taj_moustache + name = "Tajara Moustache" + icon_state = "facial_moustache" - skr_gold_m - name = "Gold plated Skrell Male Tentacles" - icon_state = "skrell_goldhair_m" - species_allowed = list("Skrell") - gender = MALE +/datum/sprite_accessory/facial_hair/tajara/taj_goatee + name = "Tajara Goatee" + icon_state = "facial_goatee" - skr_gold_f - name = "Gold chained Skrell Female Tentacles" - icon_state = "skrell_goldhair_f" - species_allowed = list("Skrell") - gender = FEMALE +/datum/sprite_accessory/facial_hair/tajara/taj_smallstache + name = "Tajara Smallstache" + icon_state = "facial_smallstache" + +/datum/sprite_accessory/facial_hair/vox + species_allowed = list("Vox") + gender = NEUTER + +/datum/sprite_accessory/facial_hair/vox/vox_colonel + name = "Vox Colonel Beard" + icon_state = "vox_colonel" + +/datum/sprite_accessory/facial_hair/vox/vox_long + name = "Long Mustache" + icon_state = "vox_fu" + +/datum/sprite_accessory/facial_hair/vox/vox_neck + name = "Neck Quills" + icon_state = "vox_neck" + +/datum/sprite_accessory/facial_hair/vox/vox_beard + name = "Vox Quill Beard" + icon_state = "vox_beard" + +/datum/sprite_accessory/facial_hair/vulpkanin + species_allowed = list("Vulpkanin") + gender = NEUTER + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze + name = "Blaze" + icon_state = "vulp_facial_blaze" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine + name = "Vulpine" + icon_state = "vulp_facial_vulpine" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows + name = "Vulpine and Brows" + icon_state = "vulp_facial_vulpine_brows" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff + name = "Vulpine and Earfluff" + icon_state = "vulp_facial_vulpine_fluff" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask + name = "Mask" + icon_state = "vulp_facial_mask" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch + name = "Patch" + icon_state = "vulp_facial_patch" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff + name = "Ruff" + icon_state = "vulp_facial_ruff" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita + name = "Kita" + icon_state = "vulp_facial_kita" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift + name = "Swift" + icon_state = "vulp_facial_swift" + +/datum/sprite_accessory/facial_hair/unathi + species_allowed = list("Unathi") + gender = NEUTER + +/datum/sprite_accessory/facial_hair/unathi/una_spines_long + name = "Long Spines" + icon_state = "soghun_longspines" + +/datum/sprite_accessory/facial_hair/unathi/una_spines_short + name = "Short Spines" + icon_state = "soghun_shortspines" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic + name = "Aquatic Frills" + icon_state = "soghun_aquaticfrills" - skr_clothtentacle_m - name = "Cloth draped Skrell Male Tentacles" - icon_state = "skrell_clothhair_m" - species_allowed = list("Skrell") - gender = MALE +/datum/sprite_accessory/facial_hair/unathi/una_frills_long + name = "Long Frills" + icon_state = "soghun_longfrills" - skr_clothtentacle_f - name = "Cloth draped Skrell Female Tentacles" - icon_state = "skrell_clothhair_f" - species_allowed = list("Skrell") - gender = FEMALE - - taj_ears - name = "Tajaran Ears" - icon_state = "ears_plain" - species_allowed = list("Tajaran") - - taj_ears_clean - name = "Tajara Clean" - icon_state = "hair_clean" - species_allowed = list("Tajaran") - - taj_ears_bangs - name = "Tajara Bangs" - icon_state = "hair_bangs" - species_allowed = list("Tajaran") - - taj_ears_braid - name = "Tajara Braid" - icon_state = "hair_tbraid" - species_allowed = list("Tajaran") - - taj_ears_shaggy - name = "Tajara Shaggy" - icon_state = "hair_shaggy" - species_allowed = list("Tajaran") - - taj_ears_mohawk - name = "Tajaran Mohawk" - icon_state = "hair_mohawk" - species_allowed = list("Tajaran") - - taj_ears_plait - name = "Tajara Plait" - icon_state = "hair_plait" - species_allowed = list("Tajaran") - - taj_ears_straight - name = "Tajara Straight" - icon_state = "hair_straight" - species_allowed = list("Tajaran") - - taj_ears_long - name = "Tajara Long" - icon_state = "hair_long" - species_allowed = list("Tajaran") - - taj_ears_rattail - name = "Tajara Rat Tail" - icon_state = "hair_rattail" - species_allowed = list("Tajaran") - - taj_ears_spiky - name = "Tajara Spiky" - icon_state = "hair_tajspiky" - species_allowed = list("Tajaran") - - taj_ears_messy - name = "Tajara Messy" - icon_state = "hair_messy" - species_allowed = list("Tajaran") - -//Vulpkanin - - vulp_hair_none - name = "None" - icon_state = "bald" - species_allowed = list("Vulpkanin") - - vulp_hair_kajam - name = "Kajam" - icon_state = "kajam" - species_allowed = list("Vulpkanin") - - vulp_hair_keid - name = "Keid" - icon_state = "keid" - species_allowed = list("Vulpkanin") - - vulp_hair_adhara - name = "Adhara" - icon_state = "adhara" - species_allowed = list("Vulpkanin") - - vulp_hair_kleeia - name = "Kleeia" - icon_state = "kleeia" - species_allowed = list("Vulpkanin") - - vulp_hair_mizar - name = "Mizar" - icon_state = "mizar" - species_allowed = list("Vulpkanin") - - vulp_hair_apollo - name = "Apollo" - icon_state = "apollo" - species_allowed = list("Vulpkanin") - - vulp_hair_belle - name = "Belle" - icon_state = "belle" - species_allowed = list("Vulpkanin") - - vulp_hair_bun - name = "Bun" - icon_state = "bun" - species_allowed = list("Vulpkanin") - - vulp_hair_jagged - name = "Jagged" - icon_state = "jagged" - species_allowed = list("Vulpkanin") - - vulp_hair_curl - name = "Curl" - icon_state = "curl" - species_allowed = list("Vulpkanin") - - vulp_hair_hawk - name = "Hawk" - icon_state = "hawk" - species_allowed = list("Vulpkanin") - - vulp_hair_anita - name = "Anita" - icon_state = "anita" - species_allowed = list("Vulpkanin") - - vulp_hair_short - name = "Short" - icon_state = "short" - species_allowed = list("Vulpkanin") - - vulp_hair_spike - name = "Spike" - icon_state = "spike" - species_allowed = list("Vulpkanin") - -//Vox - - vox_quills_short - name = "Short Vox Quills" - icon_state = "vox_shortquills" - species_allowed = list("Vox") - - vox_crestedquills - name = "Crested Vox Quills" - icon_state = "vox_crestedquills" - species_allowed = list("Vox") - - vox_tielquills - name = "Vox Tiel Quills" - icon_state = "vox_tielquills" - species_allowed = list("Vox") - - vox_emperorquills - name = "Vox Emperor Quills" - icon_state = "vox_emperorquills" - species_allowed = list("Vox") - - vox_keelquills - name = "Vox Keel Quills" - icon_state = "vox_keelquills" - species_allowed = list("Vox") - - vox_keetquills - name = "Vox Keet Quills" - icon_state = "vox_keetquills" - species_allowed = list("Vox") - - vox_quills_kingly - name = "Kingly Vox Quills" - icon_state = "vox_kingly" - species_allowed = list("Vox") - - vox_quills_fluff - name = "Fluffy Vox Quills" - icon_state = "vox_afro" - species_allowed = list("Vox") - - vox_quills_mohawk - name = "Vox Quill Mohawk" - icon_state = "vox_mohawk" - species_allowed = list("Vox") - - vox_quills_long - name = "Long Vox Quills" - icon_state = "vox_yasu" - species_allowed = list("Vox") - - vox_horns - name = "Vox Spikes" - icon_state = "vox_horns" - species_allowed = list("Vox") - - vox_nights - name = "Vox Pigtails" - icon_state = "vox_nights" - species_allowed = list("Vox") - - vox_razor - name = "Vox Razorback" - icon_state = "vox_razor" - species_allowed = list("Vox") - -// Apollo-specific - - //Wryn antennae - - wry_antennae_default - name = "Antennae" - icon_state = "wryn_antennae" - species_allowed = list("Wryn") - - //Nucleation "hairstyles" - - nuc_crystals - name = "Nucleation Crystals" - icon_state = "nuc_crystal" - species_allowed = list("Nucleation") - - nuc_betaburns - name = "Nucleation Beta Burns" - icon_state = "nuc_betaburns" - species_allowed = list("Nucleation") - - nuc_fallout - name = "Nucleation Fallout" - icon_state = "nuc_fallout" - species_allowed = list("Nucleation") - - nuc_frission - name = "Nucleation Frission" - icon_state = "nuc_frission" - species_allowed = list("Nucleation") - - nuc_radical - name = "Nucleation Free Radical" - icon_state = "nuc_radical" - species_allowed = list("Nucleation") - - nuc_gammaray - name = "Nucleation Gamma Ray" - icon_state = "nuc_gammaray" - species_allowed = list("Nucleation") - - nuc_neutron - name = "Nucleation Neutron Bomb" - icon_state = "nuc_neutron" - species_allowed = list("Nucleation") - -/datum/sprite_accessory/facial_hair - -//Tajara - - taj_sideburns - name = "Tajara Sideburns" - icon_state = "facial_sideburns" - species_allowed = list("Tajaran") - - taj_mutton - name = "Tajara Mutton" - icon_state = "facial_mutton" - species_allowed = list("Tajaran") - - taj_pencilstache - name = "Tajara Pencilstache" - icon_state = "facial_pencilstache" - species_allowed = list("Tajaran") - - taj_moustache - name = "Tajara Moustache" - icon_state = "facial_moustache" - species_allowed = list("Tajaran") - - taj_goatee - name = "Tajara Goatee" - icon_state = "facial_goatee" - species_allowed = list("Tajaran") - - taj_smallstache - name = "Tajara Smallstache" - icon_state = "facial_smallstache" - species_allowed = list("Tajaran") - -//Vox - - vox_colonel - name = "Vox Colonel Beard" - icon_state = "vox_colonel" - species_allowed = list("Vox") - - vox_long - name = "Long Mustache" - icon_state = "vox_fu" - species_allowed = list("Vox") - - vox_neck - name = "Neck Quills" - icon_state = "vox_neck" - species_allowed = list("Vox") - - vox_beard - name = "Vox Quill Beard" - icon_state = "vox_beard" - species_allowed = list("Vox") - -//Vulpkanin - - vulp_blaze - name = "Blaze" - icon_state = "vulp_facial_blaze" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_vulpine - name = "Vulpine" - icon_state = "vulp_facial_vulpine" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_vulpine_fluff - name = "Vulpine and Earfluff" - icon_state = "vulp_facial_vulpine_fluff" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_mask - name = "Mask" - icon_state = "vulp_facial_mask" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_patch - name = "Patch" - icon_state = "vulp_facial_patch" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_ruff - name = "Ruff" - icon_state = "vulp_facial_ruff" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_kita - name = "Kita" - icon_state = "vulp_facial_kita" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_swift - name = "Swift" - icon_state = "vulp_facial_swift" - species_allowed = list("Vulpkanin") - gender = NEUTER - -//Unathi - - una_spines_long - name = "Long Spines" - icon_state = "soghun_longspines" - species_allowed = list("Unathi") - gender = NEUTER - - una_spines_short - name = "Short Spines" - icon_state = "soghun_shortspines" - species_allowed = list("Unathi") - gender = NEUTER - - una_frills_long - name = "Long Frills" - icon_state = "soghun_longfrills" - species_allowed = list("Unathi") - gender = NEUTER - - una_frills_short - name = "Short Frills" - icon_state = "soghun_shortfrills" - species_allowed = list("Unathi") - gender = NEUTER - - una_frills_webbed_long - name = "Long Webbed Frills" - icon_state = "soghun_longfrills_webbed" - species_allowed = list("Unathi") - gender = NEUTER - - una_frills_webbed_short - name = "Short Webbed Frills" - icon_state = "soghun_shortfrills_webbed" - species_allowed = list("Unathi") - gender = NEUTER - - una_frills_webbed_aquatic - name = "Aquatic Frills" - icon_state = "soghun_aquaticfrills_webbed" - species_allowed = list("Unathi") - gender = NEUTER +/datum/sprite_accessory/facial_hair/unathi/una_frills_short + name = "Short Frills" + icon_state = "soghun_shortfrills" +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic + name = "Aquatic Webbed Frills" + icon_state = "soghun_aquaticfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long + name = "Long Webbed Frills" + icon_state = "soghun_longfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short + name = "Short Webbed Frills" + icon_state = "soghun_shortfrills" + secondary_theme = "webbing" //skin styles - WIP //going to have to re-integrate this with surgery @@ -1118,420 +1066,355 @@ /datum/sprite_accessory/skin icon = 'icons/mob/human_races/r_human.dmi' - human - name = "Default human skin" - icon_state = "default" - species_allowed = list("Human") +/datum/sprite_accessory/skin/human + name = "Default human skin" + icon_state = "default" + species_allowed = list("Human") - human_tatt01 - name = "Tatt01 human skin" - icon_state = "tatt1" - species_allowed = list("Human") +/datum/sprite_accessory/skin/human/human_tatt01 + name = "Tatt01 human skin" + icon_state = "tatt1" - tajaran - name = "Default tajaran skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_tajaran.dmi' - species_allowed = list("Tajaran") +/datum/sprite_accessory/skin/tajaran + name = "Default tajaran skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_tajaran.dmi' + species_allowed = list("Tajaran") - vulpkanin - name = "Default Vulpkanin skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_vulpkanin.dmi' - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/skin/vulpkanin + name = "Default Vulpkanin skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_vulpkanin.dmi' + species_allowed = list("Vulpkanin") - unathi - name = "Default Unathi skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_lizard.dmi' - species_allowed = list("Unathi") +/datum/sprite_accessory/skin/unathi + name = "Default Unathi skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_lizard.dmi' + species_allowed = list("Unathi") - skrell - name = "Default skrell skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_skrell.dmi' - species_allowed = list("Skrell") +/datum/sprite_accessory/skin/skrell + name = "Default skrell skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_skrell.dmi' + species_allowed = list("Skrell") /////////////////////////// // Underwear Definitions // /////////////////////////// /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask") + gender = NEUTER - species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") +/datum/sprite_accessory/underwear/nude + name = "Nude" + icon_state = null + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox") - nude - name = "Nude" - icon_state = null - gender = NEUTER +/datum/sprite_accessory/underwear/male + gender = MALE - male_white - name = "Mens White" - icon_state = "male_white" - gender = MALE +/datum/sprite_accessory/underwear/male/male_white + name = "Mens White" + icon_state = "male_white" - male_grey - name = "Mens Grey" - icon_state = "male_grey" - gender = MALE +/datum/sprite_accessory/underwear/male/male_grey + name = "Mens Grey" + icon_state = "male_grey" - male_grey - name = "Mens Grey Alt" - icon_state = "male_greyalt" - gender = MALE +/datum/sprite_accessory/underwear/male/male_grey + name = "Mens Grey Alt" + icon_state = "male_greyalt" - male_green - name = "Mens Green" - icon_state = "male_green" - gender = MALE +/datum/sprite_accessory/underwear/male/male_green + name = "Mens Green" + icon_state = "male_green" - male_blue - name = "Mens Blue" - icon_state = "male_blue" - gender = MALE +/datum/sprite_accessory/underwear/male/male_blue + name = "Mens Blue" + icon_state = "male_blue" - male_red - name = "Mens Red" - icon_state = "male_red" - gender = MALE +/datum/sprite_accessory/underwear/male/male_red + name = "Mens Red" + icon_state = "male_red" - male_black - name = "Mens Black" - icon_state = "male_black" - gender = MALE +/datum/sprite_accessory/underwear/male/male_black + name = "Mens Black" + icon_state = "male_black" - male_black_alt - name = "Mens Black Alt" - icon_state = "male_blackalt" - gender = MALE +/datum/sprite_accessory/underwear/male/male_black_alt + name = "Mens Black Alt" + icon_state = "male_blackalt" - male_striped - name = "Mens Striped" - icon_state = "male_stripe" - gender = MALE +/datum/sprite_accessory/underwear/male/male_striped + name = "Mens Striped" + icon_state = "male_stripe" - male_heart - name = "Mens Hearts" - icon_state = "male_hearts" - gender = MALE +/datum/sprite_accessory/underwear/male/male_heart + name = "Mens Hearts" + icon_state = "male_hearts" - male_kinky - name = "Mens Kinky" - icon_state = "male_kinky" - gender = MALE +/datum/sprite_accessory/underwear/male/male_kinky + name = "Mens Kinky" + icon_state = "male_kinky" - male_mankini - name = "Mankini" - icon_state = "male_mankini" - gender = MALE +/datum/sprite_accessory/underwear/male/male_mankini + name = "Mankini" + icon_state = "male_mankini" - female_red - name = "Ladies Red" - icon_state = "female_red" - gender = FEMALE +/datum/sprite_accessory/underwear/female + gender = FEMALE - female_green - name = "Ladies Green" - icon_state = "female_green" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_red + name = "Ladies Red" + icon_state = "female_red" - female_white - name = "Ladies White" - icon_state = "female_white" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_green + name = "Ladies Green" + icon_state = "female_green" - female_whiter - name = "Ladies Whiter" - icon_state = "female_whiter" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_white + name = "Ladies White" + icon_state = "female_white" - female_whitealt - name = "Ladies White Alt" - icon_state = "female_whitealt" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_whiter + name = "Ladies Whiter" + icon_state = "female_whiter" - female_yellow - name = "Ladies Yellow" - icon_state = "female_yellow" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_whitealt + name = "Ladies White Alt" + icon_state = "female_whitealt" - female_blue - name = "Ladies Blue" - icon_state = "female_blue" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_yellow + name = "Ladies Yellow" + icon_state = "female_yellow" - female_babyblue - name = "Ladies Baby Blue" - icon_state = "female_babyblue" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_blue + name = "Ladies Blue" + icon_state = "female_blue" +/datum/sprite_accessory/underwear/female/female_babyblue + name = "Ladies Baby Blue" + icon_state = "female_babyblue" - female_black - name = "Ladies Black" - icon_state = "female_black" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_black + name = "Ladies Black" + icon_state = "female_black" - female_blacker - name = "Ladies Blacker" - icon_state = "female_blacker" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_blacker + name = "Ladies Blacker" + icon_state = "female_blacker" - female_blackalt - name = "Ladies Black Alt" - icon_state = "female_blackalt" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_blackalt + name = "Ladies Black Alt" + icon_state = "female_blackalt" - female_kinky - name = "Ladies Kinky" - icon_state = "female_kinky" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_kinky + name = "Ladies Kinky" + icon_state = "female_kinky" - female_babydoll - name = "Ladies Full Grey" - icon_state = "female_babydoll" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_babydoll + name = "Ladies Full Grey" + icon_state = "female_babydoll" - female_pink - name = "Ladies Pink" - icon_state = "female_pink" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_pink + name = "Ladies Pink" + icon_state = "female_pink" - female_thong - name = "Ladies Thong" - icon_state = "female_thong" - gender = FEMALE +/datum/sprite_accessory/underwear/female/female_thong + name = "Ladies Thong" + icon_state = "female_thong" //////////////////////////// // Undershirt Definitions // //////////////////////////// /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - - species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask") + gender = NEUTER /datum/sprite_accessory/undershirt/nude name = "Nude" icon_state = null - gender = NEUTER + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox") //plain color shirts /datum/sprite_accessory/undershirt/shirt_white name = "White Shirt" icon_state = "shirt_white" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_black name = "Black Shirt" icon_state = "shirt_black" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_blacker name = "Blacker Shirt" icon_state = "shirt_blacker" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_grey name = "Grey Shirt" icon_state = "shirt_grey" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_red name = "Red Shirt" icon_state = "shirt_red" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_blue name = "Blue Shirt" icon_state = "shirt_blue" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_yellow name = "Yellow Shirt" icon_state = "shirt_yellow" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_green name = "Green Shirt" icon_state = "shirt_green" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_darkblue name = "Dark Blue Shirt" icon_state = "shirt_darkblue" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_darkred name = "Dark Red Shirt" icon_state = "shirt_darkred" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_darkgreen name = "Dark Green Shirt" icon_state = "shirt_darkgreen" - gender = NEUTER //end plain color shirts +//graphic shirts /datum/sprite_accessory/undershirt/shirt_heart name = "Heart Shirt" icon_state = "shirt_heart" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_corgi name = "Corgi Shirt" icon_state = "shirt_corgi" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_clown name = "Clown Shirt" icon_state = "shirt_clown" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_alien name = "Alien Shirt" icon_state = "shirt_alien" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_jack name = "Union Jack Shirt" icon_state = "shirt_jack" - gender = NEUTER /datum/sprite_accessory/undershirt/love_nt name = "I Love NT Shirt" icon_state = "shirt_lovent" - gender = NEUTER /datum/sprite_accessory/undershirt/peace name = "Peace Shirt" icon_state = "shirt_peace" - gender = NEUTER /datum/sprite_accessory/undershirt/mondmondjaja name = "Band Shirt" icon_state = "shirt_band" - gender = NEUTER /datum/sprite_accessory/undershirt/pacman name = "Pogoman Shirt" icon_state = "shirt_pogoman" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_ss13 name = "SS13 Shirt" icon_state = "shirt_ss13" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_question name = "Question Mark Shirt" icon_state = "shirt_question" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_skull name = "Skull Shirt" icon_state = "shirt_skull" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_commie name = "Communist Shirt" icon_state = "shirt_commie" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_nano name = "Nanotrasen Shirt" icon_state = "shirt_nano" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_meat name = "Meat Shirt" icon_state = "shirt_meat" - gender = NEUTER /datum/sprite_accessory/undershirt/shirt_tiedie name = "Tiedie Shirt" icon_state = "shirt_tiedie" - gender = NEUTER /datum/sprite_accessory/undershirt/blue_striped name = "Striped Blue Shirt" icon_state = "shirt_bluestripe" - gender = NEUTER /datum/sprite_accessory/undershirt/brightblue_striped name = "Striped Bright Blue Shirt" icon_state = "shirt_brightbluestripe" - gender = NEUTER - +//end graphic shirts //short sleeved /datum/sprite_accessory/undershirt/short_white name = "White Short-sleeved Shirt" icon_state = "short_white" - gender = NEUTER /datum/sprite_accessory/undershirt/short_purple name = "Purple Short-sleeved Shirt" icon_state = "short_purple" - gender = NEUTER /datum/sprite_accessory/undershirt/short_blue name = "Blue Short-sleeved Shirt" icon_state = "short_blue" - gender = NEUTER /datum/sprite_accessory/undershirt/short_green name = "Green Short-sleeved Shirt" icon_state = "short_green" - gender = NEUTER /datum/sprite_accessory/undershirt/short_black name = "Black Short-sleeved Shirt" icon_state = "short_black" - gender = NEUTER //end short sleeved //polo shirts /datum/sprite_accessory/undershirt/polo_blue name = "Blue Polo Shirt" icon_state = "polo_blue" - gender = NEUTER /datum/sprite_accessory/undershirt/polo_red name = "Red Polo Shirt" icon_state = "polo_red" - gender = NEUTER /datum/sprite_accessory/undershirt/polo_greyelllow name = "Grey-Yellow Polo Shirt" icon_state = "polo_greyellow" - gender = NEUTER //end polo shirts //sport shirts /datum/sprite_accessory/undershirt/sport_green name = "Green Sports Shirt" icon_state = "sport_green" - gender = NEUTER /datum/sprite_accessory/undershirt/sport_red name = "Red Sports Shirt" icon_state = "sport_red" - gender = NEUTER /datum/sprite_accessory/undershirt/sport_blue name = "Blue Sports Shirt" icon_state = "sport_blue" - gender = NEUTER -//end sport shirts /datum/sprite_accessory/undershirt/jersey_red name = "Red Jersey" icon_state = "jersey_red" - gender = NEUTER /datum/sprite_accessory/undershirt/jersey_blue name = "Blue Jersey" icon_state = "jersey_blue" - gender = NEUTER - +//end sport shirts //tanktops /datum/sprite_accessory/undershirt/tank_redtop @@ -1552,39 +1435,30 @@ /datum/sprite_accessory/undershirt/tank_white name = "White Tank-Top" icon_state = "tank_white" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_black name = "Black Tank-Top" icon_state = "tank_black" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_blacker name = "Blacker Tank-Top" icon_state = "tank_blacker" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_grey name = "Grey Tank-Top" icon_state = "tank_grey" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_red name = "Red Tank-Top" icon_state = "tank_red" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_fire name = "Fire Tank-Top" icon_state = "tank_fire" - gender = NEUTER /datum/sprite_accessory/undershirt/tank_stripes name = "Striped Tank-Top" icon_state = "tank_stripes" - gender = NEUTER - - //end tanktops /////////////////////// @@ -1592,174 +1466,127 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask") + gender = NEUTER /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null - gender = NEUTER - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") - + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox") /datum/sprite_accessory/socks/white_norm name = "Normal White" icon_state = "white_norm" - gender = NEUTER - /datum/sprite_accessory/socks/black_norm name = "Normal Black" icon_state = "black_norm" - gender = NEUTER - /datum/sprite_accessory/socks/white_short name = "Short White" icon_state = "white_short" - gender = NEUTER - /datum/sprite_accessory/socks/black_short name = "Short Black" icon_state = "black_short" - gender = NEUTER - /datum/sprite_accessory/socks/white_knee name = "Knee-high White" icon_state = "white_knee" - gender = NEUTER - /datum/sprite_accessory/socks/black_knee name = "Knee-high Black" icon_state = "black_knee" - gender = NEUTER - /datum/sprite_accessory/socks/thin_knee name = "Knee-high Thin" icon_state = "thin_knee" gender = FEMALE - /datum/sprite_accessory/socks/striped_knee name = "Knee-high Striped" icon_state = "striped_knee" - gender = NEUTER - /datum/sprite_accessory/socks/rainbow_knee name = "Knee-high Rainbow" icon_state = "rainbow_knee" - gender = NEUTER - /datum/sprite_accessory/socks/white_thigh name = "Thigh-high White" icon_state = "white_thigh" - gender = NEUTER /datum/sprite_accessory/socks/black_thigh name = "Thigh-high Black" icon_state = "black_thigh" - gender = NEUTER - /datum/sprite_accessory/socks/thin_thigh name = "Thigh-high Thin" icon_state = "thin_thigh" gender = FEMALE - /datum/sprite_accessory/socks/striped_thigh name = "Thigh-high Striped" icon_state = "striped_thigh" - gender = NEUTER - /datum/sprite_accessory/socks/rainbow_thigh name = "Thigh-high Rainbow" icon_state = "rainbow_thigh" - gender = NEUTER - /datum/sprite_accessory/socks/pantyhose name = "Pantyhose" icon_state = "pantyhose" gender = FEMALE - /datum/sprite_accessory/socks/black_fishnet name = "Black Fishnet" icon_state = "black_fishnet" - gender = NEUTER -/datum/sprite_accessory/socks/vox_white +/datum/sprite_accessory/socks/vox + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox/vox_white name = "Vox White" icon_state = "vox_white" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_black +/datum/sprite_accessory/socks/vox/vox_black name = "Vox Black" icon_state = "vox_black" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_thin +/datum/sprite_accessory/socks/vox/vox_thin name = "Vox Black Thin" icon_state = "vox_blackthin" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_rainbow +/datum/sprite_accessory/socks/vox/vox_rainbow name = "Vox Rainbow" icon_state = "vox_rainbow" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_stripped +/datum/sprite_accessory/socks/vox/vox_stripped name = "Vox Striped" icon_state = "vox_white" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_white_thigh +/datum/sprite_accessory/socks/vox/vox_white_thigh name = "Vox Thigh-high White" icon_state = "vox_whiteTH" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_black_thigh +/datum/sprite_accessory/socks/vox/vox_black_thigh name = "Vox Thigh-high Black" icon_state = "vox_blackTH" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_thin_thigh +/datum/sprite_accessory/socks/vox/vox_thin_thigh name = "Vox Thigh-high Thin" icon_state = "vox_blackthinTH" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_rainbow_thigh +/datum/sprite_accessory/socks/vox/vox_rainbow_thigh name = "Vox Thigh-high Rainbow" icon_state = "vox_rainbowTH" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_striped_thigh +/datum/sprite_accessory/socks/vox/vox_striped_thigh name = "Vox Thigh-high Striped" icon_state = "vox_stripedTH" - gender = NEUTER - species_allowed = list("Vox") -/datum/sprite_accessory/socks/vox_fishnet +/datum/sprite_accessory/socks/vox/vox_fishnet name = "Vox Fishnets" icon_state = "vox_fishnet" - gender = NEUTER - species_allowed = list("Vox") /* HEAD ACCESSORY */ @@ -1773,185 +1600,494 @@ species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" -/datum/sprite_accessory/head_accessory/simple - name = "Simple" +/datum/sprite_accessory/head_accessory/unathi species_allowed = list("Unathi") + +/datum/sprite_accessory/head_accessory/unathi/simple + name = "Simple" icon_state = "horns_simple" -/datum/sprite_accessory/head_accessory/short +/datum/sprite_accessory/head_accessory/unathi/short name = "Short" - species_allowed = list("Unathi") icon_state = "horns_short" -/datum/sprite_accessory/head_accessory/curled +/datum/sprite_accessory/head_accessory/unathi/curled name = "Curled" - species_allowed = list("Unathi") icon_state = "horns_curled" -/datum/sprite_accessory/head_accessory/ram +/datum/sprite_accessory/head_accessory/unathi/ram name = "Ram" - species_allowed = list("Unathi") icon_state = "horns_ram" -/datum/sprite_accessory/head_accessory/vulp_earfluff - icon = 'icons/mob/human_face.dmi' - name = "Vulpkanin Earfluff" - icon_state = "vulp_facial_earfluff" - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/tajara + species_allowed = list("Tajaran") -/datum/sprite_accessory/head_accessory/vulp_blaze - icon = 'icons/mob/human_face.dmi' - name = "Blaze" - icon_state = "vulp_facial_blaze" - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/tajara/outears_taj + name = "Tajaran Outer Ears" + icon_state = "markings_face_outears_taj" -/datum/sprite_accessory/head_accessory/vulp_vulpine - icon = 'icons/mob/human_face.dmi' - name = "Vulpine" - icon_state = "vulp_facial_vulpine" - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/tajara/inears_taj + name = "Tajaran Inner Ears" + icon_state = "markings_face_inears_taj" -/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff - icon = 'icons/mob/human_face.dmi' - name = "Vulpine and Earfluff" - icon_state = "vulp_facial_vulpine_fluff" - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/tajara/muzzle_taj + name = "Tajaran Muzzle" + icon_state = "markings_face_muzzle_taj" -/datum/sprite_accessory/head_accessory/vulp_mask - icon = 'icons/mob/human_face.dmi' - name = "Mask" - icon_state = "vulp_facial_mask" - species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj + name = "Tajaran Muzzle and Inner Ears" + icon_state = "markings_face_muzzle_and_inears_taj" -/datum/sprite_accessory/head_accessory/vulp_patch - icon = 'icons/mob/human_face.dmi' - name = "Patch" - icon_state = "vulp_facial_patch" - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/head_accessory/vulp_ruff - icon = 'icons/mob/human_face.dmi' - name = "Ruff" - icon_state = "vulp_facial_ruff" - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/head_accessory/vulp_kita - icon = 'icons/mob/human_face.dmi' - name = "Kita" - icon_state = "vulp_facial_kita" - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/head_accessory/vulp_swift - icon = 'icons/mob/human_face.dmi' - name = "Swift" - icon_state = "vulp_facial_swift" - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/head_accessory/taj_ears +/datum/sprite_accessory/head_accessory/tajara/taj_ears icon = 'icons/mob/human_face.dmi' name = "Tajaran Ears" icon_state = "ears_plain" - species_allowed = list("Tajaran") -/datum/sprite_accessory/head_accessory/ipc_antennae +/datum/sprite_accessory/head_accessory/tajara/taj_nose + name = "Tajaran Nose" + icon_state = "markings_face_nose_taj" + +/datum/sprite_accessory/head_accessory/vulpkanin + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff + icon = 'icons/mob/human_face.dmi' + name = "Vulpkanin Earfluff" + icon_state = "vulp_facial_earfluff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze + icon = 'icons/mob/human_face.dmi' + name = "Blaze" + icon_state = "vulp_facial_blaze" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine + icon = 'icons/mob/human_face.dmi' + name = "Vulpine" + icon_state = "vulp_facial_vulpine" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff + icon = 'icons/mob/human_face.dmi' + name = "Vulpine and Earfluff" + icon_state = "vulp_facial_vulpine_fluff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask + icon = 'icons/mob/human_face.dmi' + name = "Mask" + icon_state = "vulp_facial_mask" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch + icon = 'icons/mob/human_face.dmi' + name = "Patch" + icon_state = "vulp_facial_patch" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff + icon = 'icons/mob/human_face.dmi' + name = "Ruff" + icon_state = "vulp_facial_ruff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita + icon = 'icons/mob/human_face.dmi' + name = "Kita" + icon_state = "vulp_facial_kita" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift + icon = 'icons/mob/human_face.dmi' + name = "Swift" + icon_state = "vulp_facial_swift" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose + name = "Vulpkanin Nose" + icon_state = "markings_face_nose_vulp" + +/datum/sprite_accessory/head_accessory/ipc + species_allowed = list("Machine") + +/datum/sprite_accessory/head_accessory/ipc/ipc_antennae name = "Antennae" icon_state = "antennae" - species_allowed = list("Machine") -/datum/sprite_accessory/head_accessory/ipc_tv_antennae +/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae name = "T.V. Antennae" icon_state = "tvantennae" - species_allowed = list("Machine") -/datum/sprite_accessory/head_accessory/ipc_tesla_antennae +/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae name = "Tesla Antennae" icon_state = "tesla" - species_allowed = list("Machine") -/datum/sprite_accessory/head_accessory/ipc_light +/datum/sprite_accessory/head_accessory/ipc/ipc_light name = "Head Light" icon_state = "light" - species_allowed = list("Machine") /* BODY MARKINGS */ /datum/sprite_accessory/body_markings icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine") + species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox") icon_state = "accessory_none" + marking_location = "body" /datum/sprite_accessory/body_markings/none name = "None" species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" -/datum/sprite_accessory/body_markings/stripe - name = "Stripe" - species_allowed = list("Unathi") - icon_state = "markings_stripe" - /datum/sprite_accessory/body_markings/tiger name = "Tiger Body" species_allowed = list("Unathi", "Tajaran", "Vulpkanin") icon_state = "markings_tiger" -/datum/sprite_accessory/body_markings/tigerhead - name = "Tiger Body and Head" - species_allowed = list("Unathi", "Tajaran", "Vulpkanin") - icon_state = "markings_tigerhead" - -/datum/sprite_accessory/body_markings/tigerheadface_taj - name = "Tajaran Tiger Body, Head and Face" - species_allowed = list("Tajaran") - icon_state = "markings_tigerheadface_taj" - -/datum/sprite_accessory/body_markings/tigerheadface_vulp - name = "Vulpkanin Tiger Body, Head and Face" - species_allowed = list("Vulpkanin") - icon_state = "markings_tigerheadface_vulp" - -/datum/sprite_accessory/body_markings/tigerheadface_una - name = "Unathi Tiger Body, Head and Face" +/datum/sprite_accessory/body_markings/unathi species_allowed = list("Unathi") - icon_state = "markings_tigerheadface_una" -/datum/sprite_accessory/body_markings/optics +/datum/sprite_accessory/body_markings/unathi/stripe_una + name = "Unathi Stripe" + icon_state = "markings_stripe_una" + +/datum/sprite_accessory/body_markings/unathi/belly_narrow_una + name = "Unathi Belly" + icon_state = "markings_belly_narrow_una" + +/datum/sprite_accessory/body_markings/unathi/banded_una + name = "Unathi Banded" + icon_state = "markings_banded_una" + +/datum/sprite_accessory/body_markings/unathi/points_una + name = "Unathi Points" + icon_state = "markings_points_una" + +/datum/sprite_accessory/body_markings/tajara + species_allowed = list("Tajaran") + +/datum/sprite_accessory/body_markings/tajara/belly_flat_taj + name = "Tajaran Belly" + icon_state = "markings_belly_flat_taj" + +/datum/sprite_accessory/body_markings/tajara/belly_crest_taj + name = "Tajaran Chest Crest" + icon_state = "markings_belly_crest_taj" + +/datum/sprite_accessory/body_markings/tajara/belly_full_taj + name = "Tajaran Belly 2" + icon_state = "markings_belly_full_taj" + +/datum/sprite_accessory/body_markings/tajara/points_taj + name = "Tajaran Points" + icon_state = "markings_points_taj" + +/datum/sprite_accessory/body_markings/tajara/patchy_taj + name = "Tajaran Patches" + icon_state = "markings_patch_taj" + +/datum/sprite_accessory/body_markings/vulpkanin + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp + name = "Vulpkanin Belly" + icon_state = "markings_belly_fox_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp + name = "Vulpkanin Belly 2" + icon_state = "markings_belly_full_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp + name = "Vulpkanin Belly Crest" + icon_state = "markings_belly_crest_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp + name = "Vulpkanin Points" + icon_state = "markings_points_fade_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp + name = "Vulpkanin Points and Belly" + icon_state = "markings_points_fade_belly_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp + name = "Vulpkanin Points and Belly Alt." + icon_state = "markings_points_fade_belly_alt_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp + name = "Vulpkanin Points 2" + icon_state = "markings_points_sharp_vulp" + +/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp + name = "Vulpkanin Points and Crest" + icon_state = "markings_points_crest_vulp" + +/datum/sprite_accessory/body_markings/drask + species_allowed = list("Drask") + +/datum/sprite_accessory/body_markings/drask/arm_spines_drask + name = "Drask Arm Spines" + icon_state = "markings_armspines_drask" + +/datum/sprite_accessory/body_markings/head + marking_location = "head" + species_allowed = list() + +/datum/sprite_accessory/body_markings/head/tajara + species_allowed = list("Tajaran") + +/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj + name = "Tajaran Tiger Head" + icon_state = "markings_head_tiger_taj" + +/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj + name = "Tajaran Tiger Head and Face" + icon_state = "markings_face_tiger_taj" + +/datum/sprite_accessory/body_markings/head/tajara/outears_taj + name = "Tajaran Outer Ears" + icon_state = "markings_face_outears_taj" + +/datum/sprite_accessory/body_markings/head/tajara/inears_taj + name = "Tajaran Inner Ears" + icon_state = "markings_face_inears_taj" + +/datum/sprite_accessory/body_markings/head/tajara/nose_taj + name = "Tajaran Nose" + icon_state = "markings_face_nose_taj" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj + name = "Tajaran Muzzle" + icon_state = "markings_face_muzzle_taj" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj + name = "Tajaran Muzzle and Inner Ears" + icon_state = "markings_face_muzzle_and_inears_taj" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2. + name = "Tajaran Muzzle 2" + icon_state = "markings_face_full_taj" + +/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points. + name = "Tajaran Points Head" + icon_state = "markings_face_points_taj" + +/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches. + name = "Tajaran Patches Head" + icon_state = "markings_face_patch_taj" + +/datum/sprite_accessory/body_markings/head/vulpkanin + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp + name = "Vulpkanin Tiger Head" + icon_state = "markings_head_tiger_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp + name = "Vulpkanin Tiger Head and Face" + icon_state = "markings_face_tiger_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp + name = "Vulpkanin Nose" + icon_state = "markings_face_nose_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt.. + name = "Vulpkanin Muzzle" + icon_state = "markings_face_full_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt.. + name = "Vulpkanin Muzzle and Ears" + icon_state = "markings_face_full_ears_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade. + name = "Vulpkanin Points Head" + icon_state = "markings_face_points_fade_vulp" + +/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp. + name = "Vulpkanin Points Head 2" + icon_state = "markings_face_points_sharp_vulp" + +/datum/sprite_accessory/body_markings/head/unathi + species_allowed = list("Unathi") + +/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una + name = "Unathi Tiger Head" + icon_state = "markings_head_tiger_una" + heads_allowed = list("All") + +/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una + name = "Unathi Tiger Head and Face" + icon_state = "markings_face_tiger_una" + +/datum/sprite_accessory/body_markings/head/unathi/snout_una_round + name = "Unathi Round Snout" + icon_state = "markings_face_snout_una_round" + +/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round + name = "Unathi Lower Round Snout" + icon_state = "markings_face_snout_lower_una" + +/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded. + name = "Unathi Banded Head" + icon_state = "markings_face_banded_una" + heads_allowed = list("All") + +/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly. + name = "Unathi Snout 2" + icon_state = "markings_face_narrow_una" + +/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points. + name = "Unathi Points Head" + icon_state = "markings_face_points_una" + +/datum/sprite_accessory/body_markings/head/unathi/sharp + heads_allowed = list("Unathi Sharp Snout") + +/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp + name = "Unathi Sharp Tiger Head and Face" + icon_state = "markings_face_tiger_una_sharp" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp + name = "Unathi Sharp Snout" + icon_state = "markings_face_snout_una_sharp" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly. + name = "Unathi Sharp Snout 2" + icon_state = "markings_face_narrow_una_sharp" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points. + name = "Unathi Sharp Points Head" + icon_state = "markings_face_points_una" + +/datum/sprite_accessory/body_markings/head/optics name = "Humanoid Optics" species_allowed = list("Machine") icon_state = "optics" models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm - marking_location = "head" -/datum/sprite_accessory/body_markings/optics/bishop_alt +/datum/sprite_accessory/body_markings/head/optics/bishop_alt name = "Bishop Alt. Optics" - species_allowed = list("Machine") icon_state = "bishop_alt_optics" models_allowed = list("Bishop Cybernetics alt.") -/datum/sprite_accessory/body_markings/optics/morpheus_alt +/datum/sprite_accessory/body_markings/head/optics/morpheus_alt name = "Morpheus Alt. Optics" - species_allowed = list("Machine") icon_state = "morpheus_alt_optics" models_allowed = list("Morpheus Cyberkinetics alt.") -/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt +/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt name = "Ward-Takahashi Alt. Optics" - species_allowed = list("Machine") icon_state = "wardtakahashi_alt_optics" models_allowed = list("Ward-Takahashi alt.") -/datum/sprite_accessory/body_markings/optics/xion_alt +/datum/sprite_accessory/body_markings/head/optics/xion_alt name = "Xion Alt. Optics" - species_allowed = list("Machine") icon_state = "xion_alt_optics" models_allowed = list("Xion Manufacturing Group alt.") /datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm - name = "base tattoo" - species_allowed = list() + species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/tattoo/elliot name = "Elliot Circuit Tattoo" - icon_state = "campbell_tattoo" \ No newline at end of file + icon_state = "campbell_tattoo" + species_allowed = null + +/datum/sprite_accessory/body_markings/tattoo/tiger_body + name = "Tiger-stripe Tattoo" + species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + icon_state = "markings_tiger" + +/datum/sprite_accessory/body_markings/tattoo/heart + name = "Heart Tattoo" + icon_state = "markings_tattoo_heart" + +/datum/sprite_accessory/body_markings/tattoo/hive + name = "Hive Tattoo" + icon_state = "markings_tattoo_hive" + +/datum/sprite_accessory/body_markings/tattoo/nightling + name = "Nightling Tattoo" + icon_state = "markings_tattoo_nightling" + +/datum/sprite_accessory/body_markings/tattoo/vox + species_allowed = list("Vox") + +/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox + name = "Vox Heart Tattoo" + icon_state = "markings_tattoo_heart_vox" + +/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox + name = "Vox Hive Tattoo" + icon_state = "markings_tattoo_hive_vox" + +/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox + name = "Vox Nightling Tattoo" + icon_state = "markings_tattoo_nightling_vox" + +/datum/sprite_accessory/body_markings/tail + species_allowed = list() + icon_state = "accessory_none" + marking_location = "tail" + tails_allowed = null + +/datum/sprite_accessory/body_markings/tail/vox + species_allowed = list("Vox") + +/datum/sprite_accessory/body_markings/tail/vox/vox_band + name = "Vox Tail Band" + icon_state = "markings_voxtail_band" + +/datum/sprite_accessory/body_markings/tail/vox/vox_tip + name = "Vox Tail Tip" + icon_state = "markings_voxtail_tip" + +/datum/sprite_accessory/body_markings/tail/vox/vox_stripe + name = "Vox Tail Stripe" + icon_state = "markings_voxtail_stripe" + +/datum/sprite_accessory/body_markings/tail/vulpkanin + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip + name = "Vulpkanin Default Tail Tip" + icon_state = "markings_vulptail_tip" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade + name = "Vulpkanin Default Tail Fade" + icon_state = "markings_vulptail_fade" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff + name = "Vulpkanin Bushy Tail Fluff" + tails_allowed = list("Vulpkanin Alt 1 (Bushy)") + icon_state = "markings_vulptail2_fluff" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip + name = "Vulpkanin Short Tail Tip" + tails_allowed = list("Vulpkanin Alt 4 (Short)") + icon_state = "markings_vulptail5_tip" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip + name = "Vulpkanin Bushy Straight Tail Tip" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "markings_vulptail6_tip" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade + name = "Vulpkanin Bushy Straight Tail Fade" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "markings_vulptail6_fade" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf + name = "Vulpkanin Bushy Straight Tail Black Fade White Tip" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "markings_vulptail6_silverf" + +/* ALT HEADS */ + +/datum/sprite_accessory/alt_heads + icon = null + icon_state = null + species_allowed = null + var/suffix = null + +/datum/sprite_accessory/alt_heads/none + name = "None" + +/datum/sprite_accessory/alt_heads/una_sharp_snout + name = "Unathi Sharp Snout" + species_allowed = list("Unathi") + icon_state = "head_sharp" + suffix = "sharp" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index f280bec0ce1..d010bdfa135 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -142,7 +142,7 @@ if(length(message) >= 2) var/language_prefix = trim_right(lowertext(copytext(message, 1 ,4))) var/datum/language/L = language_keys[language_prefix] - if(can_speak(L)) + if(can_speak_language(L)) return L return null diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm new file mode 100644 index 00000000000..7358486deee --- /dev/null +++ b/code/modules/mob/status_procs.dm @@ -0,0 +1,202 @@ +// A bunch of empty procs for all the status procs in living/status_procs.dm, because +// I can't be bothered to deal with all the merge conflicts it would cause to +// typecast every mob in the codebase correctly + +/mob/proc/Confused() + return + +/mob/proc/SetConfused() + return + +/mob/proc/AdjustConfused() + return + + +/mob/proc/Dizzy() + return + +/mob/proc/SetDizzy() + return + +/mob/proc/AdjustDizzy() + return + + +/mob/proc/Drowsy() + return + +/mob/proc/SetDrowsy() + return + +/mob/proc/AdjustDrowsy() + return + + +/mob/proc/Drunk() + return + +/mob/proc/SetDrunk() + return + +/mob/proc/AdjustDrunk() + return + + +/mob/proc/Druggy() + return + +/mob/proc/SetDruggy() + return + +/mob/proc/AdjustDruggy() + return + + +/mob/proc/EarDamage() + return + +/mob/proc/SetEarDamage() + return + +/mob/proc/AdjustEarDamage() + return + + +/mob/proc/EarDeaf() + return + +/mob/proc/SetEarDeaf() + return + +/mob/proc/AdjustEarDeaf() + return + + +/mob/proc/EyeBlind() + return + +/mob/proc/SetEyeBlind() + return + +/mob/proc/AdjustEyeBlind() + return + + +/mob/proc/EyeBlurry() + return + +/mob/proc/SetEyeBlurry() + return + +/mob/proc/AdjustEyeBlurry() + return + + +/mob/proc/Hallucinate() + return + +/mob/proc/SetHallucinate() + return + +/mob/proc/AdjustHallucinate() + return + + +/mob/proc/Jitter() + return + +/mob/proc/SetJitter() + return + +/mob/proc/AdjustJitter() + return + + +/mob/proc/LoseBreath() + return + +/mob/proc/SetLoseBreath() + return + +/mob/proc/AdjustLoseBreath() + return + + +/mob/proc/Paralyse() + return + +/mob/proc/SetParalysis() + return + +/mob/proc/AdjustParalysis() + return + + +/mob/proc/Silence() + return + +/mob/proc/SetSilence() + return + +/mob/proc/AdjustSilence() + return + + +/mob/proc/Sleeping() + return + +/mob/proc/SetSleeping() + return + +/mob/proc/AdjustSleeping() + return + + +/mob/proc/Slowed() + return + +/mob/proc/SetSlowed() + return + +/mob/proc/AdjustSlowed() + return + + +/mob/proc/Slur() + return + +/mob/proc/SetSlur() + return + +/mob/proc/AdjustSlur() + return + + +/mob/proc/Stun() + return + +/mob/proc/SetStunned() + return + +/mob/proc/AdjustStunned() + return + + +/mob/proc/Stuttering() + return + +/mob/proc/SetStuttering() + return + +/mob/proc/AdjustStuttering() + return + + +/mob/proc/Weaken() + return + +/mob/proc/SetWeakened() + return + +/mob/proc/AdjustWeakened() + return diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm new file mode 100644 index 00000000000..b9245fc1b6e --- /dev/null +++ b/code/modules/mob/update_status.dm @@ -0,0 +1,65 @@ +// These are procs that cause immediate updates to features of the mob - prefixed with `update_` +// Procs that have a stacking effect depending on how many times they are called +// do not belong in this file - those go in `life.dm` instead, with the prefix `handle_` + +// OVERLAY/SIGHT PROCS + +// These return 0 if they are not applying an overlay, and 1 if they are + +// Call this to immediately apply blindness effects, instead of +// waiting for the next `Life` tick +/mob/proc/update_blind_effects() + // No handling for this on the mob level + return 0 + +/mob/proc/update_blurry_effects() + // No handling for this on the mob level + return 0 + +/mob/proc/update_druggy_effects() + // No handling for this on the mob level + return 0 + +/mob/proc/update_nearsighted_effects() + // No handling for this on the mob level + return 0 + +/mob/proc/update_sleeping_effects() + // No handling for this on the mob level + return 0 + +/mob/proc/update_tint_effects() + // No handling for this on the mob level + return 0 + +// Procs that give information about the status of the mob + +/mob/proc/can_hear() + return 1 + +/mob/proc/has_vision() + return 1 + +/mob/proc/can_speak() + return 1 + +/mob/proc/incapacitated(ignore_restraints, ignore_grab) + return 0 + +/mob/proc/restrained(ignore_grab) + // All are created free + return 0 + +// Procs that update other things about the mob + +// Does various animations - Jitter, Flying, Spinning +/mob/proc/update_animations() + if(flying) + animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) + animate(pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING) + +/mob/proc/update_stat() + return + +/mob/proc/update_canmove() + return 1 diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index 113c9e2878b..e4e5dd1a33b 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -14,10 +14,10 @@ /mob/proc/shared_nano_interaction() if(stat || !client) return STATUS_CLOSE // no updates, close the interface - else if(restrained() || lying || stunned || weakened) + else if(incapacitated()) return STATUS_UPDATE // update only (orange visibility) return STATUS_INTERACTIVE - + /mob/dead/observer/shared_nano_interaction() if(check_rights(R_ADMIN, 0, src)) return STATUS_INTERACTIVE // Admins are more equal diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 8606dafbd31..21c14077886 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -7,8 +7,11 @@ var/list/valid_hairstyles = list() var/list/valid_facial_hairstyles = list() var/list/valid_head_accessories = list() - var/list/valid_marking_styles = list() + var/list/valid_head_marking_styles = list() + var/list/valid_body_marking_styles = list() + var/list/valid_tail_marking_styles = list() var/list/valid_body_accessories = list() + var/list/valid_alt_head_styles = list() var/check_whitelist var/list/whitelist @@ -48,7 +51,7 @@ else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE) var/const/MAX_LINE_ENTRIES = 4 var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n(" - for(var/i = 1; i <= owner.species.icon_skin_tones.len; i++) + for(var/i = 1 to owner.species.icon_skin_tones.len) if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES)) prompt += "\n" prompt += "[i] = [owner.species.icon_skin_tones[i]]" @@ -66,9 +69,9 @@ if(can_change_skin_color()) var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null if(new_skin && can_still_topic(state)) - var/r_skin = hex2num(copytext(new_skin, 2, 4)) - var/g_skin = hex2num(copytext(new_skin, 4, 6)) - var/b_skin = hex2num(copytext(new_skin, 6, 8)) + var/r_skin = color2R(new_skin) + var/g_skin = color2G(new_skin) + var/b_skin = color2B(new_skin) if(owner.change_skin_color(r_skin, g_skin, b_skin)) update_dna() return 1 @@ -81,12 +84,22 @@ if(can_change(APPEARANCE_HAIR_COLOR)) var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null if(new_hair && can_still_topic(state)) - var/r_hair = hex2num(copytext(new_hair, 2, 4)) - var/g_hair = hex2num(copytext(new_hair, 4, 6)) - var/b_hair = hex2num(copytext(new_hair, 6, 8)) + var/r_hair = color2R(new_hair) + var/g_hair = color2G(new_hair) + var/b_hair = color2B(new_hair) if(owner.change_hair_color(r_hair, g_hair, b_hair)) update_dna() return 1 + if(href_list["secondary_hair_color"]) + if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR)) + var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null + if(new_hair && can_still_topic(state)) + var/r_hair_sec = color2R(new_hair) + var/g_hair_sec = color2G(new_hair) + var/b_hair_sec = color2B(new_hair) + if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1)) + update_dna() + return 1 if(href_list["facial_hair"]) if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles)) if(owner.change_facial_hair(href_list["facial_hair"])) @@ -96,12 +109,22 @@ if(can_change(APPEARANCE_FACIAL_HAIR_COLOR)) var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null if(new_facial && can_still_topic(state)) - var/r_facial = hex2num(copytext(new_facial, 2, 4)) - var/g_facial = hex2num(copytext(new_facial, 4, 6)) - var/b_facial = hex2num(copytext(new_facial, 6, 8)) + var/r_facial = color2R(new_facial) + var/g_facial = color2G(new_facial) + var/b_facial = color2B(new_facial) if(owner.change_facial_hair_color(r_facial, g_facial, b_facial)) update_dna() return 1 + if(href_list["secondary_facial_hair_color"]) + if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)) + var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null + if(new_facial && can_still_topic(state)) + var/r_facial_sec = color2R(new_facial) + var/g_facial_sec = color2G(new_facial) + var/b_facial_sec = color2B(new_facial) + if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1)) + update_dna() + return 1 if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes) @@ -114,9 +137,9 @@ eyes_blue = eyes_organ.eye_colour[3] var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null if(new_eyes && can_still_topic(state)) - var/r_eyes = hex2num(copytext(new_eyes, 2, 4)) - var/g_eyes = hex2num(copytext(new_eyes, 4, 6)) - var/b_eyes = hex2num(copytext(new_eyes, 6, 8)) + var/r_eyes = color2R(new_eyes) + var/g_eyes = color2G(new_eyes) + var/b_eyes = color2B(new_eyes) if(owner.change_eye_color(r_eyes, g_eyes, b_eyes)) update_dna() return 1 @@ -129,31 +152,60 @@ if(can_change_head_accessory()) var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null if(new_head_accessory && can_still_topic(state)) - var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) - var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) - var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) + var/r_headacc = color2R(new_head_accessory) + var/g_headacc = color2G(new_head_accessory) + var/b_headacc = color2B(new_head_accessory) if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc)) update_dna() return 1 - if(href_list["marking"]) - if(can_change_markings() && (href_list["marking"] in valid_marking_styles)) - if(owner.change_markings(href_list["marking"])) + if(href_list["head_marking"]) + if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles)) + if(owner.change_markings(href_list["head_marking"], "head")) update_dna() return 1 - if(href_list["marking_color"]) - if(can_change_markings()) - var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null + if(href_list["head_marking_color"]) + if(can_change_markings("head")) + var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null if(new_markings && can_still_topic(state)) - var/r_markings = hex2num(copytext(new_markings, 2, 4)) - var/g_markings = hex2num(copytext(new_markings, 4, 6)) - var/b_markings = hex2num(copytext(new_markings, 6, 8)) - if(owner.change_marking_color(r_markings, g_markings, b_markings)) + if(owner.change_marking_color(new_markings, "head")) + update_dna() + return 1 + if(href_list["body_marking"]) + if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles)) + if(owner.change_markings(href_list["body_marking"], "body")) + update_dna() + return 1 + if(href_list["body_marking_color"]) + if(can_change_markings("body")) + var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null + if(new_markings && can_still_topic(state)) + if(owner.change_marking_color(new_markings, "body")) + update_dna() + return 1 + if(href_list["tail_marking"]) + if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles)) + if(owner.change_markings(href_list["tail_marking"], "tail")) + update_dna() + return 1 + if(href_list["tail_marking_color"]) + if(can_change_markings("tail")) + var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null + if(new_markings && can_still_topic(state)) + if(owner.change_marking_color(new_markings, "tail")) update_dna() return 1 if(href_list["body_accessory"]) if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories)) if(owner.change_body_accessory(href_list["body_accessory"])) update_dna() + cut_and_generate_data() + return 1 + if(href_list["alt_head"]) + if(can_change_alt_head() && (href_list["alt_head"] in valid_alt_head_styles)) + if(owner.change_alt_head(href_list["alt_head"])) + update_dna() + head_organ = owner.get_organ("head") //Update the head with the new information. + cut_and_generate_data() return 1 return 0 @@ -199,13 +251,32 @@ data["facial_hair_styles"] = facial_hair_styles data["facial_hair_style"] = (head_organ ? head_organ.f_style : "Shaved") - data["change_markings"] = can_change_markings() - if(data["change_markings"]) - var/marking_styles[0] - for(var/marking_style in valid_marking_styles) - marking_styles[++marking_styles.len] = list("markingstyle" = marking_style) - data["marking_styles"] = marking_styles - data["marking_style"] = owner.m_style + data["change_head_markings"] = can_change_markings("head") + if(data["change_head_markings"]) + var/m_style = owner.m_styles["head"] + var/head_marking_styles[0] + for(var/head_marking_style in valid_head_marking_styles) + head_marking_styles[++head_marking_styles.len] = list("headmarkingstyle" = head_marking_style) + data["head_marking_styles"] = head_marking_styles + data["head_marking_style"] = m_style + + data["change_body_markings"] = can_change_markings("body") + if(data["change_body_markings"]) + var/m_style = owner.m_styles["body"] + var/body_marking_styles[0] + for(var/body_marking_style in valid_body_marking_styles) + body_marking_styles[++body_marking_styles.len] = list("bodymarkingstyle" = body_marking_style) + data["body_marking_styles"] = body_marking_styles + data["body_marking_style"] = m_style + + data["change_tail_markings"] = can_change_markings("tail") + if(data["change_tail_markings"]) + var/m_style = owner.m_styles["tail"] + var/tail_marking_styles[0] + for(var/tail_marking_style in valid_tail_marking_styles) + tail_marking_styles[++tail_marking_styles.len] = list("tailmarkingstyle" = tail_marking_style) + data["tail_marking_styles"] = tail_marking_styles + data["tail_marking_style"] = m_style data["change_body_accessory"] = can_change_body_accessory() if(data["change_body_accessory"]) @@ -213,15 +284,24 @@ for(var/body_accessory_style in valid_body_accessories) body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style) data["body_accessory_styles"] = body_accessory_styles - var/datum/body_accessory/BA - if(owner.body_accessory) - BA = owner.body_accessory.name - data["body_accessory_style"] = BA + data["body_accessory_style"] = (owner.body_accessory ? owner.body_accessory.name : "None") + + data["change_alt_head"] = can_change_alt_head() + if(data["change_alt_head"]) + var/alt_head_styles[0] + for(var/alt_head_style in valid_alt_head_styles) + alt_head_styles[++alt_head_styles.len] = list("altheadstyle" = alt_head_style) + data["alt_head_styles"] = alt_head_styles + data["alt_head_style"] = head_organ.alt_head data["change_head_accessory_color"] = can_change_head_accessory() data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) + data["change_secondary_hair_color"] = can_change(APPEARANCE_SECONDARY_HAIR_COLOR) data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) - data["change_marking_color"] = can_change_markings() + data["change_secondary_facial_hair_color"] = can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR) + data["change_head_marking_color"] = can_change_markings("head") + data["change_body_marking_color"] = can_change_markings("body") + data["change_tail_marking_color"] = can_change_markings("tail") ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state) @@ -248,19 +328,41 @@ return 0 return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY) -/datum/nano_module/appearance_changer/proc/can_change_markings() - return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS) +/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body") + var/marking_flag = HAS_BODY_MARKINGS + var/body_flags = owner.species.bodyflags + if(location == "head") + if(!head_organ) + log_debug("Missing head!") + return 0 + body_flags = head_organ.species.bodyflags + marking_flag = HAS_HEAD_MARKINGS + if(location == "body") + marking_flag = HAS_BODY_MARKINGS + if(location == "tail") + marking_flag = HAS_TAIL_MARKINGS + + return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag) /datum/nano_module/appearance_changer/proc/can_change_body_accessory() return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL) +/datum/nano_module/appearance_changer/proc/can_change_alt_head() + if(!head_organ) + log_debug("Missing head!") + return 0 + return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS) + /datum/nano_module/appearance_changer/proc/cut_and_generate_data() // Making the assumption that the available species remain constant valid_hairstyles.Cut() valid_facial_hairstyles.Cut() valid_head_accessories.Cut() - valid_marking_styles.Cut() + valid_head_marking_styles.Cut() + valid_body_marking_styles.Cut() + valid_tail_marking_styles.Cut() valid_body_accessories.Cut() + valid_alt_head_styles.Cut() generate_data() /datum/nano_module/appearance_changer/proc/generate_data() @@ -273,7 +375,13 @@ valid_facial_hairstyles = owner.generate_valid_facial_hairstyles() if(!valid_head_accessories.len) valid_head_accessories = owner.generate_valid_head_accessories() - if(!valid_marking_styles.len) - valid_marking_styles = owner.generate_valid_markings() + if(!valid_head_marking_styles.len) + valid_head_marking_styles = owner.generate_valid_markings("head") + if(!valid_body_marking_styles.len) + valid_body_marking_styles = owner.generate_valid_markings("body") + if(!valid_tail_marking_styles.len) + valid_tail_marking_styles = owner.generate_valid_markings("tail") if(!valid_body_accessories.len) valid_body_accessories = owner.generate_valid_body_accessories() + if(!valid_alt_head_styles.len) + valid_alt_head_styles = owner.generate_valid_alt_heads() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index f0af50d8d9e..9de96b73129 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -8,6 +8,7 @@ gender = PLURAL icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" + item_state = "paper" throwforce = 0 w_class = 1 throw_range = 1 diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index f86b17eaab7..0ff6289ea66 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -1,211 +1,241 @@ - /obj/machinery/power/generator name = "thermoelectric generator" desc = "It's a high efficiency thermoelectric generator." icon_state = "teg" - density = 1 anchored = 0 + density = 1 + use_power = 0 - use_power = 1 - idle_power_usage = 100 //Watts, I hope. Just enough to do the computer and display things. - - var/obj/machinery/atmospherics/binary/circulator/circ1 - var/obj/machinery/atmospherics/binary/circulator/circ2 + var/obj/machinery/atmospherics/binary/circulator/cold_circ + var/obj/machinery/atmospherics/binary/circulator/hot_circ + var/cold_dir = WEST + var/hot_dir = EAST + var/lastgen = 0 var/lastgenlev = -1 - - var/image/overlay_image - - var/power_multiplier = 1 // This is so admins can tweak how good it is to find a good balance for effort -> power - var/powercap = 500000 //Not a hard cap, but outputs above this have a 10% chance to cause the TeG to lose half it's power. - + var/lastcirc = "00" + /obj/machinery/power/generator/New() ..() + update_desc() + +/obj/machinery/power/generator/proc/update_desc() + desc = initial(desc) + " Its cold circulator is located on the [dir2text(cold_dir)] side, and its heat circulator is located on the [dir2text(hot_dir)] side." + +/obj/machinery/power/generator/Destroy() + disconnect() + return ..() + +/obj/machinery/power/generator/proc/disconnect() + if(cold_circ) + cold_circ.generator = null + if(hot_circ) + hot_circ.generator = null + if(powernet) + disconnect_from_network() - spawn(1) - reconnect() +/obj/machinery/power/generator/initialize() + ..() + connect() + +/obj/machinery/power/generator/proc/connect() + connect_to_network() + + var/obj/machinery/atmospherics/binary/circulator/circpath = /obj/machinery/atmospherics/binary/circulator + cold_circ = locate(circpath) in get_step(src, cold_dir) + hot_circ = locate(circpath) in get_step(src, hot_dir) -//generators connect in dir and reverse_dir(dir) directions -//mnemonic to determine circulator/generator directions: the cirulators orbit clockwise around the generator -//so a circulator to the NORTH of the generator connects first to the EAST, then to the WEST -//and a circulator to the WEST of the generator connects first to the NORTH, then to the SOUTH -//note that the circulator's outlet dir is it's always facing dir, and it's inlet is always the reverse -/obj/machinery/power/generator/proc/reconnect() - circ1 = null - circ2 = null - if(src.loc && anchored) - if(src.dir & (EAST|WEST)) - circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST) - circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST) + if(cold_circ && cold_circ.side == cold_dir) + cold_circ.generator = src + cold_circ.update_icon() + else + cold_circ = null - if(circ1 && circ2) - if(circ1.dir != SOUTH || circ2.dir != NORTH) - circ1 = null - circ2 = null + if(hot_circ && hot_circ.side == hot_dir) + hot_circ.generator = src + hot_circ.update_icon() + else + hot_circ = null - else if(src.dir & (NORTH|SOUTH)) - circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,NORTH) - circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,SOUTH) - - if(circ1 && circ2 && (circ1.dir != EAST || circ2.dir != WEST)) - circ1 = null - circ2 = null - -/obj/machinery/power/generator/proc/updateicon() - if(isnull(src.overlay_image)) - src.overlay_image = image('icons/obj/power.dmi') - - overlays.Cut() - if(!(stat & (NOPOWER|BROKEN))) + power_change() + update_icon() + updateDialog() + +/obj/machinery/power/generator/power_change() + if(!anchored) + stat |= NOPOWER + else + ..() + +/obj/machinery/power/generator/update_icon() + if(stat & (NOPOWER|BROKEN)) + overlays.Cut() + else + overlays.Cut() if(lastgenlev != 0) - src.overlay_image.icon_state = "teg-op[lastgenlev]" - overlays += src.overlay_image + overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") -/obj/machinery/power/generator/process() - if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER)) + overlays += image('icons/obj/power.dmi', "teg-oc[lastcirc]") + +/obj/machinery/power/generator/process() + if(stat & (NOPOWER|BROKEN)) return + if(!cold_circ || !hot_circ) + return + + lastgen = 0 + + if(powernet) + + //log_debug("cold_circ and hot_circ pass") + + var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() + var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() + + //log_debug("hot_air = [hot_air]; cold_air = [cold_air];") + + if(cold_air && hot_air) + + //log_debug("hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];") + + //log_debug("coldair and hotair pass") + var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() + + var/delta_temperature = hot_air.temperature - cold_air.temperature + + //log_debug("delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]") + + if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) + var/efficiency = 0.65 + + var/energy_transfer = delta_temperature * hot_air_heat_capacity * cold_air_heat_capacity / (hot_air_heat_capacity + cold_air_heat_capacity) + + var/heat = energy_transfer * (1 - efficiency) + lastgen = energy_transfer * efficiency + + //log_debug("lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") + + hot_air.temperature = hot_air.temperature - energy_transfer / hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat / cold_air_heat_capacity + + //log_debug("POWER: [lastgen] W generated at [efficiency * 100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") + + add_avail(lastgen) + // update icon overlays only if displayed level has changed + + if(hot_air) + var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1 + hot_circ_air1.merge(hot_air) + + if(cold_air) + var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1 + cold_circ_air1.merge(cold_air) + + var/genlev = max(0, min( round(11 * lastgen / 100000), 11)) + var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" + if((genlev != lastgenlev) || (circ != lastcirc)) + lastgenlev = genlev + lastcirc = circ + update_icon() + updateDialog() - var/datum/gas_mixture/air1 = circ1.return_transfer_air() - var/datum/gas_mixture/air2 = circ2.return_transfer_air() - lastgen = 0 - - if(air1 && air2) - var/air1_heat_capacity = air1.heat_capacity() - var/air2_heat_capacity = air2.heat_capacity() - var/delta_temperature = abs(air2.temperature - air1.temperature) - - if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0) - var/efficiency = 0.65 - var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity) - var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency*0.05*power_multiplier - - if(air2.temperature > air1.temperature) - air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity - air1.temperature = air1.temperature + heat/air1_heat_capacity - else - air2.temperature = air2.temperature + heat/air2_heat_capacity - air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity - - //Transfer the air - if(air1) - circ1.air2.merge(air1) - if(air2) - circ2.air2.merge(air2) - - //Update the gas networks - if(circ1.parent2) - circ1.parent2.update = 1 - if(circ2.parent2) - circ2.parent2.update = 1 - - // update icon overlays and power usage only if displayed level has changed - if(lastgen > powercap && prob(10)) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - lastgen *= 0.5 - var/genlev = max(0, min( round(11*lastgen / powercap), 11)) - if(lastgen > 100 && genlev == 0) - genlev = 1 - if(genlev != lastgenlev) - lastgenlev = genlev - updateicon() - add_avail(lastgen) - /obj/machinery/power/generator/attack_ai(mob/user) - if(stat & (BROKEN|NOPOWER)) return + return attack_hand(user) + +/obj/machinery/power/generator/attack_ghost(mob/user) + if(stat & (NOPOWER|BROKEN)) + return + interact(user) + +/obj/machinery/power/generator/attack_hand(mob/user) + if(..()) + user << browse(null, "window=teg") + return interact(user) /obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) anchored = !anchored - to_chat(user, "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.") - use_power = anchored - reconnect() + if(!anchored) + disconnect() + power_change() + else + connect() + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.") + else if(istype(W, /obj/item/device/multitool)) + if(cold_dir == WEST) + cold_dir = EAST + hot_dir = WEST + else + cold_dir = WEST + hot_dir = EAST + connect() + to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.") + update_desc() else - ..() + ..() + +/obj/machinery/power/generator/proc/get_menu(include_link = 1) + var/t = "" + if(!powernet) + t += "Unable to connect to the power network!" + t += "
Retry" + else if(cold_circ && hot_circ) + var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1 + var/datum/gas_mixture/cold_circ_air2 = cold_circ.air2 + var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1 + var/datum/gas_mixture/hot_circ_air2 = hot_circ.air2 -/obj/machinery/power/generator/attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER) || !anchored) return - interact(user) + t += "
" + t += "Output: [round(lastgen)] W" + + t += "
" + + t += "Cold loop
" + t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
" + t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
" + + t += "Hot loop
" + t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
" + t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" + + t += "
" + else + t += "Unable to locate all parts!" + t += "
Retry" + if(include_link) + t += "
Close" + + return t /obj/machinery/power/generator/interact(mob/user) - if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) - user.unset_machine() - user << browse(null, "window=teg") - return - user.set_machine(src) - var/t = "
Thermo-Electric Generator
" - - if(circ1 && circ2) - t += "Output : [round(lastgen)] W

" - - t += "Primary Circulator (top or right)
" - t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa
" - t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K
" - t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa
" - t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K
" - - t += "Secondary Circulator (bottom or left)
" - t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa
" - t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K
" - t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa
" - t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K
" - - else - t += "Unable to connect to circulators.
" - t += "Ensure both are in position and wrenched into place." - - t += "
" - t += "
" - t += "Refresh Close" - - user << browse(t, "window=teg;size=460x300") - onclose(user, "teg") + var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300) + popup.set_content(get_menu()) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() return 1 - /obj/machinery/power/generator/Topic(href, href_list) - ..() + if(..()) + return 0 if( href_list["close"] ) usr << browse(null, "window=teg") usr.unset_machine() return 0 - - updateDialog() + if( href_list["check"] ) + if(!powernet || !cold_circ || !hot_circ) + connect() return 1 - /obj/machinery/power/generator/power_change() ..() - updateicon() - - -/obj/machinery/power/generator/verb/rotate_clock() - set category = "Object" - set name = "Rotate Generator (Clockwise)" - set src in view(1) - - if(usr.stat || usr.restrained() || anchored) - return - - src.dir = turn(src.dir, 90) - -/obj/machinery/power/generator/verb/rotate_anticlock() - set category = "Object" - set name = "Rotate Generator (Counterclockwise)" - set src in view(1) - - if(usr.stat || usr.restrained() || anchored) - return - - src.dir = turn(src.dir, -90) \ No newline at end of file + update_icon() \ No newline at end of file diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm deleted file mode 100644 index d1ff1f1079c..00000000000 --- a/code/modules/power/generator_type2.dm +++ /dev/null @@ -1,143 +0,0 @@ -/obj/machinery/power/generator_type2 - name = "thermoelectric generator" - desc = "It's a high efficiency thermoelectric generator." - icon_state = "teg" - anchored = 1 - density = 1 - use_power = 0 - - var/obj/machinery/atmospherics/unary/generator_input/input1 - var/obj/machinery/atmospherics/unary/generator_input/input2 - - var/lastgen = 0 - var/lastgenlev = -1 - - var/image/overlay_image - -/obj/machinery/power/generator_type2/New() - ..() - spawn(5) - input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90)) - input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90)) - if(!input1 || !input2) - stat |= BROKEN - updateicon() - - -/obj/machinery/power/generator_type2/proc/updateicon() - - if(isnull(src.overlay_image)) - src.overlay_image = image('icons/obj/power.dmi') - - overlays.Cut() - if(!(stat & (NOPOWER|BROKEN))) - - if(lastgenlev != 0) - src.overlay_image.icon_state = "teg-op[lastgenlev]" - overlays += src.overlay_image - -#define GENRATE 800 // generator output coefficient from Q - - -/obj/machinery/power/generator_type2/process() - if(!input1 || !input2) - return - - var/datum/gas_mixture/air1 = input1.return_exchange_air() - var/datum/gas_mixture/air2 = input2.return_exchange_air() - - - lastgen = 0 - - if(air1 && air2) - var/datum/gas_mixture/hot_air = air1 - var/datum/gas_mixture/cold_air = air2 - if(hot_air.temperature < cold_air.temperature) - hot_air = air2 - cold_air = air1 - - var/hot_air_heat_capacity = hot_air.heat_capacity() - var/cold_air_heat_capacity = cold_air.heat_capacity() - - var/delta_temperature = hot_air.temperature - cold_air.temperature - - if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01) - var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency - - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - - var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency - - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - -// to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - - input1.parent.update = 1 - input2.parent.update = 1 - - add_avail(lastgen) - // update icon overlays only if displayed level has changed - - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) - if(genlev != lastgenlev) - lastgenlev = genlev - updateicon() - - src.updateDialog() - - -/obj/machinery/power/generator_type2/attack_ai(mob/user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - -/obj/machinery/power/generator_type2/attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - -/obj/machinery/power/generator_type2/interact(mob/user) - if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) - user.unset_machine() - user << browse(null, "window=teg") - return - - user.set_machine(src) - - var/t = "
Thermo-Electric Generator
" - - t += "Output : [round(lastgen)] W

" - - t += "Cold loop
" - t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
" - - t += "Hot loop
" - t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
" - - t += "

Close" - - t += "
" - user << browse(t, "window=teg;size=460x300") - onclose(user, "teg") - return 1 - - -/obj/machinery/power/generator_type2/Topic(href, href_list) - ..() - - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.unset_machine() - return 0 - - return 1 - - -/obj/machinery/power/generator_type2/power_change() - ..() - updateicon() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm index 8d8e23e9964..411c039d480 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm @@ -1,6 +1,6 @@ /obj/structure/particle_accelerator/fuel_chamber name = "EM Acceleration Chamber" - desc_holder = "This is where the Alpha particles are accelerated to radical speeds." + desc_holder = "This part is where the Alpha particles are accelerated to radical speeds." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "fuel_chamber" reference = "fuel_chamber" diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index ed4d300d7ab..ed2fb257015 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -2,7 +2,7 @@ /obj/machinery/particle_accelerator/control_box name = "Particle Accelerator Control Console" - desc = "This controls the density of the particles." + desc = "This part controls the density of the particles." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "control_box" reference = "control_box" diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index 8e260a1115d..cbfd212e873 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -2,7 +2,7 @@ /obj/structure/particle_accelerator/particle_emitter name = "EM Containment Grid" - desc_holder = "This launchs the Alpha particles, might not want to stand near this end." + desc_holder = "This part launches the Alpha particles. You might not want to stand near this end." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "none" var/fire_delay = 50 @@ -26,16 +26,16 @@ /obj/structure/particle_accelerator/particle_emitter/proc/set_delay(var/delay) if(delay && delay >= 0) - src.fire_delay = delay + fire_delay = delay return 1 return 0 /obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0) - if((src.last_shot + src.fire_delay) <= world.time) - src.last_shot = world.time + if((last_shot + fire_delay) <= world.time) + last_shot = world.time var/obj/effect/accelerated_particle/A = null - var/turf/T = get_step(src,dir) + var/turf/T = get_step(src, dir) switch(strength) if(0) A = new/obj/effect/accelerated_particle/weak(T, dir) @@ -46,6 +46,6 @@ if(3) A = new/obj/effect/accelerated_particle/powerful(T, dir) if(A) - A.dir = src.dir + A.dir = dir return 1 return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm index e6deff37ddf..dafd19917da 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_power.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm @@ -1,6 +1,6 @@ /obj/structure/particle_accelerator/power_box name = "Particle Focusing EM Lens" - desc_holder = "This uses electromagnetic waves to focus the Alpha-Particles." + desc_holder = "This part uses electromagnetic waves to focus the Alpha particles." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "power_box" reference = "power_box" diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 0f6d41fc145..420733f7c76 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -122,7 +122,7 @@ if(ishuman(mob)) //Hilariously enough, running into a closet should make you get hit the hardest. var/mob/living/carbon/human/H = mob - H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) + H.AdjustHallucinate(max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1))))) var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) mob.apply_effect(rads, IRRADIATE) @@ -189,7 +189,7 @@ var/obj/item/organ/internal/eyes/eyes = l.get_int_organ(/obj/item/organ/internal/eyes) if(!istype(eyes)) continue - l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) + l.Hallucinate(min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src))))) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index a5eafacba51..0f587c54bf4 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -269,7 +269,7 @@ /obj/item/ammo_box/magazine/smgm9mm/update_icon() ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),6)]" + icon_state = "[initial(icon_state)]-[round(ammo_count()+1,4)]" /obj/item/ammo_box/magazine/pistolm9mm name = "pistol magazine (9mm)" @@ -373,12 +373,12 @@ /obj/item/ammo_box/magazine/toy/smg name = "foam force SMG magazine" - icon_state = "smg9mm-30" + icon_state = "smg9mm-20" max_ammo = 20 /obj/item/ammo_box/magazine/toy/smg/update_icon() ..() - icon_state = "smg9mm-[round(ammo_count(),5)]" + icon_state = "smg9mm-[round(ammo_count()+1,4)]" /obj/item/ammo_box/magazine/toy/smg/riot ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6ede088c4ce..6cafcce56c3 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -334,7 +334,6 @@ obj/item/weapon/gun/proc/newshot() /obj/item/weapon/gun/proc/rename_gun(mob/M) var/input = stripped_input(M,"What do you want to name the gun?", ,"", MAX_NAME_LEN) - if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove) name = input to_chat(M, "You name the gun [input]. Say hello to your new friend.") diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm index 0307755f3c7..b8f659eb09f 100644 --- a/code/modules/projectiles/guns/dartgun.dm +++ b/code/modules/projectiles/guns/dartgun.dm @@ -302,6 +302,4 @@ density = 0 /obj/effect/syringe_gun_dummy/New() - var/datum/reagents/R = new/datum/reagents(15) - reagents = R - R.my_atom = src + create_reagents(15) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 99a1660ba35..8d920a7e736 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -49,7 +49,7 @@ /obj/item/weapon/gun/energy/gun/hos name = "\improper X-01 MultiPhase Energy Gun" - desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." + desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." icon_state = "hoslaser" force = 10 ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index affc16de296..884b97c8ffb 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -34,10 +34,6 @@ update_icon() chamber_round(0) - if(unique_rename) - if(istype(A, /obj/item/weapon/pen)) - rename_gun(user) - /obj/item/weapon/gun/projectile/revolver/attack_self(mob/living/user) var/num_unloaded = 0 chambered = null diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm index 097f5fb4a58..d36ad1dd2c6 100644 --- a/code/modules/projectiles/guns/projectile/saw.dm +++ b/code/modules/projectiles/guns/projectile/saw.dm @@ -1,6 +1,6 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation." + desc = "A heavily modified 5.56 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation." icon_state = "l6closed100" item_state = "l6closedmag" w_class = 5 diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 4efeb570e0f..809647e4186 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -92,8 +92,8 @@ /obj/item/weapon/gun/projectile/shotgun/toy/tommygun name = "tommy gun" desc = "Looks almost like the real thing! Great for practicing Drive-bys. Ages 8 and up." - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "tommy" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "tommygun" item_state = "shotgun" mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/tommygun w_class = 2 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 88d5946742a..9c3475d2141 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -9,6 +9,7 @@ hitsound_wall = "ricochet" /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage + name = "beanbag slug" damage = 5 stamina = 80 @@ -22,21 +23,22 @@ /obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0) if(..(target, blocked)) var/mob/living/M = target - M.dizziness += 20 - M.slurring += 20 - M.confused += 20 - M.eye_blurry += 20 - M.drowsyness += 20 - for(var/datum/reagent/ethanol/A in M.reagents.reagent_list) + M.AdjustDizzy(20) + M.AdjustSlur(20) + M.AdjustConfused(20) + M.AdjustEyeBlurry(20) + M.AdjustDrowsy(20) + for(var/datum/reagent/consumable/ethanol/A in M.reagents.reagent_list) M.AdjustParalysis(2) - M.dizziness += 10 - M.slurring += 10 - M.confused += 10 - M.eye_blurry += 10 - M.drowsyness += 10 + M.AdjustDizzy(10) + M.AdjustSlur(10) + M.AdjustConfused(10) + M.AdjustEyeBlurry(10) + M.AdjustDrowsy(10) A.volume += 5 //Because we can /obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down + name = "rubber bullet" damage = 5 weaken = 3 stamina = 60 @@ -130,6 +132,7 @@ damage = 35 /obj/item/projectile/bullet/rpellet + name = "rubber pellet" damage = 3 stamina = 25 @@ -213,7 +216,7 @@ ..(target, blocked) if(iscarbon(target)) var/mob/living/carbon/M = target - M.silent = max(M.silent, 10) + M.Silence(10) else if(istype(target, /obj/mecha/combat/honker)) var/obj/mecha/chassis = target chassis.occupant_message("A mimetech anti-honk bullet has hit \the [chassis]!") diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 0e1b7478cc8..bcc4335f66a 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -186,7 +186,7 @@ if(ishuman(target)) var/mob/living/carbon/human/M = target M.adjustBrainLoss(20) - M.hallucination += 20 + M.AdjustHallucinate(20) /obj/item/projectile/clown name = "snap-pop" diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm deleted file mode 100644 index bf107eebd16..00000000000 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ /dev/null @@ -1,1217 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -/obj/machinery/chem_dispenser - name = "chem dispenser" - density = 1 - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "dispenser" - use_power = 0 - idle_power_usage = 40 - var/ui_title = "Chem Dispenser 5000" - var/energy = 100 - var/max_energy = 100 - var/amount = 30 - var/obj/item/weapon/reagent_containers/beaker = null - var/recharged = 0 - var/hackedcheck = 0 - var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", - "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron", - "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver") - var/list/hacked_reagents = list("toxin") - var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." - var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." - var/list/broken_requirements = list() - var/broken_on_spawn = 0 - var/recharge_delay = 5 - var/image/icon_beaker = null //cached overlay - - -/obj/machinery/chem_dispenser/proc/recharge() - if(stat & (BROKEN|NOPOWER)) return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) - use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air) - nanomanager.update_uis(src) // update all UIs attached to src - -/obj/machinery/chem_dispenser/power_change() - if(powered()) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - stat |= NOPOWER - nanomanager.update_uis(src) // update all UIs attached to src - -/obj/machinery/chem_dispenser/process() - - if(recharged < 0) - recharge() - recharged = recharge_delay - else - recharged -= 1 - -/obj/machinery/chem_dispenser/New() - ..() - recharge() - dispensable_reagents = sortList(dispensable_reagents) - - if(broken_on_spawn) - overlays.Cut() - var/amount = pick(3,3,4) - var/list/options = list() - options[/obj/item/weapon/stock_parts/capacitor/adv] = "Add an advanced capacitor to fix it." - options[/obj/item/weapon/stock_parts/console_screen] = "Replace the console screen to fix it." - options[/obj/item/weapon/stock_parts/manipulator/pico] = "Upgrade to a pico manipulator to fix it." - options[/obj/item/weapon/stock_parts/matter_bin/super] = "Give it a super matter bin to fix it." - options[/obj/item/weapon/stock_parts/cell/super] = "Replace the reagent synthesizer with a super capacity cell to fix it." - options[/obj/item/device/mass_spectrometer/adv] = "Replace the reagent scanner with an advanced mass spectrometer to fix it" - options[/obj/item/weapon/stock_parts/micro_laser/high] = "Repair the reagent synthesizer with an high-power micro-laser to fix it" - options[/obj/item/device/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it" - options[/obj/item/stack/nanopaste] = "Apply some nanopaste to the broken nozzles to fix it." - options[/obj/item/stack/sheet/plasteel] = "Surround the outside with a plasteel cover to fix it." - options[/obj/item/stack/sheet/rglass] = "Insert a pane of reinforced glass to fix it." - - while(amount > 0) - amount -= 1 - - var/index = pick(options) - broken_requirements[index] = options[index] - options -= index - - -/obj/machinery/chem_dispenser/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if(prob(50)) - qdel(src) - return - -/obj/machinery/chem_dispenser/blob_act() - if(prob(50)) - qdel(src) - - /** - * The ui_interact proc is used to open and update Nano UIs - * If ui_interact is not used then the UI will not update correctly - * ui_interact is currently defined for /atom/movable - * - * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * - * @return nothing - */ - -/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - if(broken_requirements.len) - to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]") - return - - - // this is the data which will be sent to the ui - var/data[0] - data["amount"] = amount - data["energy"] = round(energy) - data["maxEnergy"] = round(max_energy) - data["isBeakerLoaded"] = beaker ? 1 : 0 - - var beakerContents[0] - var beakerCurrentVolume = 0 - if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) - for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... - beakerCurrentVolume += R.volume - data["beakerContents"] = beakerContents - - if(beaker) - data["beakerCurrentVolume"] = beakerCurrentVolume - data["beakerMaxVolume"] = beaker.volume - else - data["beakerCurrentVolume"] = null - data["beakerMaxVolume"] = null - - var chemicals[0] - for(var/re in dispensable_reagents) - var/datum/reagent/temp = chemical_reagents_list[re] - if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list... - data["chemicals"] = chemicals - - // 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) - // 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 - ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 390, 655) - // when the ui is first opened this is the data it will use - ui.set_initial_data(data) - // open the new ui window - ui.open() - -/obj/machinery/chem_dispenser/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["amount"]) - amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 - if(amount < 0) // Since the user can actually type the commands himself, some sanity checking - amount = 0 - if(amount > 100) - amount = 100 - - if(href_list["dispense"]) - if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null) - var/obj/item/weapon/reagent_containers/glass/B = beaker - var/datum/reagents/R = B.reagents - var/space = R.maximum_volume - R.total_volume - - R.add_reagent(href_list["dispense"], min(amount, energy * 10, space)) - energy = max(energy - min(amount, energy * 10, space) / 10, 0) - overlays.Cut() - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - overlays += icon_beaker - - if(href_list["remove"]) - if(beaker) - if(href_list["removeamount"]) - var/amount = text2num(href_list["removeamount"]) - if(isnum(amount) && (amount > 0)) - var/obj/item/weapon/reagent_containers/glass/B = beaker - var/datum/reagents/R = B.reagents - var/id = href_list["remove"] - R.remove_reagent(id, amount) - - if(href_list["ejectBeaker"]) - if(beaker) - var/obj/item/weapon/reagent_containers/glass/B = beaker - B.forceMove(loc) - beaker = null - overlays.Cut() - add_fingerprint(usr) - return 1 // update UIs attached to this object - -/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/B, mob/user, params) - if(isrobot(user)) - return - - if(broken_requirements.len && B.type == broken_requirements[1]) - if(istype(B,/obj/item/stack)) - var/obj/item/stack/S = B - S.use(1) - else - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") - return - qdel(B) - broken_requirements -= broken_requirements[1] - to_chat(user, "You fix [src].") - return - - if(beaker) - to_chat(user, "Something is already loaded into the machine.") - return - - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) - beaker = B - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") - return - B.forceMove(src) - to_chat(user, "You set [B] on the machine.") - nanomanager.update_uis(src) // update all UIs attached to src - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - overlays += icon_beaker - return - -/obj/machinery/chem_dispenser/attackby(obj/item/weapon/B, mob/user, params) - ..() - if(istype(B, /obj/item/device/multitool)) - if(hackedcheck == 0) - to_chat(user, hack_message) - dispensable_reagents += hacked_reagents - hackedcheck = 1 - return - - else - to_chat(user, unhack_message) - dispensable_reagents -= hacked_reagents - hackedcheck = 0 - return - -/obj/machinery/chem_dispenser/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/chem_dispenser/attack_ghost(mob/user) - return attack_hand(user) - -/obj/machinery/chem_dispenser/attack_hand(mob/user) - if(stat & BROKEN) - return - - ui_interact(user) - -/obj/machinery/chem_dispenser/soda - icon_state = "soda_dispenser" - name = "soda fountain" - desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch." - ui_title = "Soda Dispens-o-matic" - energy = 100 - max_energy = 100 - dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up", - "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana", - "watermelonjuice", "carrotjuice", "potato", "berryjuice") - hack_message = "You change the mode from 'McNano' to 'Pizza King'." - unhack_message = "You change the mode from 'Pizza King' to 'McNano'." - hacked_reagents = list("thirteenloko") - -/obj/machinery/chem_dispenser/beer - icon_state = "booze_dispenser" - name = "booze dispenser" - ui_title = "Booze Portal 9001" - energy = 100 - max_energy = 100 - 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("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol") - hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." - unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." - hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing") - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/machinery/chem_dispenser/constructable - name = "portable chem dispenser" - icon = 'icons/obj/chemical.dmi' - icon_state = "minidispenser" - energy = 5 - max_energy = 5 - amount = 5 - recharge_delay = 10 - dispensable_reagents = list() - var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"), - list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"), - list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"), - list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel")) - -/obj/machinery/chem_dispenser/constructable/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - component_parts += new /obj/item/weapon/stock_parts/capacitor(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/weapon/stock_parts/cell/super(null) - RefreshParts() - -/obj/machinery/chem_dispenser/constructable/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/weapon/stock_parts/cell/hyper(null) - RefreshParts() - -/obj/machinery/chem_dispenser/constructable/RefreshParts() - var/time = 0 - var/temp_energy = 0 - var/i - for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - temp_energy += M.rating - temp_energy-- - max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest - for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) - time += C.rating - for(var/obj/item/weapon/stock_parts/cell/P in component_parts) - time += round(P.maxcharge, 10000) / 10000 - recharge_delay = 10 / (time/2) //delay between recharges, double the usual time on lowest 33% less than usual on highest - for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) - for(i=1, i<=M.rating, i++) - dispensable_reagents = sortList(dispensable_reagents | special_reagents[i]) - -/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/reagent_containers/glass)) - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - ..() - else - ..() - - if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) - return - - if(exchange_parts(user, I)) - return - - if(istype(I, /obj/item/weapon/wrench)) - playsound(src, 'sound/items/Ratchet.ogg', 50, 1) - if(anchored) - anchored = 0 - to_chat(user, "[src] can now be moved.") - else if(!anchored) - anchored = 1 - to_chat(user, "[src] is now secured.") - - if(panel_open) - if(istype(I, /obj/item/weapon/crowbar)) - if(beaker) - var/obj/item/weapon/reagent_containers/glass/B = beaker - B.forceMove(loc) - beaker = null - default_deconstruction_crowbar(I) - return 1 - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/machinery/chem_master - name = "\improper ChemMaster 3000" - density = 1 - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "mixer0" - use_power = 1 - idle_power_usage = 20 - var/obj/item/weapon/reagent_containers/beaker = null - var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null - var/mode = 0 - var/condi = 0 - var/useramount = 30 // Last used amount - var/pillamount = 10 - var/patchamount = 10 - var/bottlesprite = "bottle" - var/pillsprite = "1" - var/client/has_sprites = list() - var/printing = null - -/obj/machinery/chem_master/New() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src - overlays += "waitlight" - -/obj/machinery/chem_master/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if(prob(50)) - qdel(src) - return - -/obj/machinery/chem_master/blob_act() - if(prob(50)) - qdel(src) - -/obj/machinery/chem_master/power_change() - if(powered()) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - stat |= NOPOWER - -/obj/machinery/chem_master/attackby(obj/item/weapon/B, mob/user, params) - - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) - - if(beaker) - to_chat(user, "A beaker is already loaded into the machine.") - return - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") - return - beaker = B - B.forceMove(src) - to_chat(user, "You add the beaker to the machine!") - nanomanager.update_uis(src) - icon_state = "mixer1" - - else if(istype(B, /obj/item/weapon/storage/pill_bottle)) - - if(loaded_pill_bottle) - to_chat(user, "A pill bottle is already loaded into the machine.") - return - - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") - return - loaded_pill_bottle = B - B.forceMove(src) - to_chat(user, "You add the pill bottle into the dispenser slot!") - nanomanager.update_uis(src) - return - -/obj/machinery/chem_master/Topic(href, href_list) - if(..()) - return 1 - - add_fingerprint(usr) - usr.set_machine(src) - - - if(href_list["ejectp"]) - if(loaded_pill_bottle) - loaded_pill_bottle.forceMove(loc) - loaded_pill_bottle = null - else if(href_list["close"]) - usr << browse(null, "window=chem_master") - onclose(usr, "chem_master") - usr.unset_machine() - return - - if(href_list["print_p"]) - if(!(printing)) - printing = 1 - visible_message("[src] rattles and prints out a sheet of paper.") - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) - P.info = "
Chemical Analysis

" - P.info += "Time of analysis: [worldtime2text(world.time)]

" - P.info += "Chemical name: [href_list["name"]]
" - if(href_list["name"] == "Blood") - var/datum/reagents/R = beaker.reagents - var/datum/reagent/blood/G - for(var/datum/reagent/F in R.reagent_list) - if(F.name == href_list["name"]) - G = F - break - var/B = G.data["blood_type"] - var/C = G.data["blood_DNA"] - P.info += "Description:
Blood Type: [B]
DNA: [C]" - else - P.info += "Description: [href_list["desc"]]" - P.info += "

Notes:
" - P.name = "Chemical Analysis - [href_list["name"]]" - printing = null - - if(beaker) - var/datum/reagents/R = beaker.reagents - if(href_list["analyze"]) - var/dat = "" - if(!condi) - if(href_list["name"] == "Blood") - var/datum/reagent/blood/G - for(var/datum/reagent/F in R.reagent_list) - if(F.name == href_list["name"]) - G = F - break - var/A = G.name - var/B = G.data["blood_type"] - var/C = G.data["blood_DNA"] - dat += "Chemmaster 3000Chemical infos:

Name:
[A]

Description:
Blood Type: [B]
DNA: [C]" - else - dat += "Chemmaster 3000Chemical infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]" - dat += "

(Print Analysis)
" - dat += "(Back)" - else - dat += "Condimaster 3000Condiment infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" - usr << browse(dat, "window=chem_master;size=575x400") - return - - else if(href_list["add"]) - - if(href_list["amount"]) - var/id = href_list["add"] - var/amount = text2num(href_list["amount"]) - R.trans_id_to(src, id, amount) - - else if(href_list["addcustom"]) - - var/id = href_list["addcustom"] - useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = isgoodnumber(useramount) - Topic(null, list("amount" = "[useramount]", "add" = "[id]")) - - else if(href_list["remove"]) - - if(href_list["amount"]) - var/id = href_list["remove"] - var/amount = text2num(href_list["amount"]) - if(mode) - reagents.trans_id_to(beaker, id, amount) - else - reagents.remove_reagent(id, amount) - - - else if(href_list["removecustom"]) - - var/id = href_list["removecustom"] - useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = isgoodnumber(useramount) - Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) - - else if(href_list["toggle"]) - mode = !mode - - else if(href_list["main"]) - attack_hand(usr) - return - else if(href_list["eject"]) - if(beaker) - beaker.forceMove(get_turf(src)) - beaker = null - reagents.clear_reagents() - icon_state = "mixer0" - else if(href_list["createpill"] || href_list["createpill_multiple"]) - if(!condi) - var/count = 1 - if(href_list["createpill_multiple"]) - count = input("Select the number of pills to make.", 10, pillamount) as num|null - if(count == null) - return - count = isgoodnumber(count) - if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? - if(count <= 0) return - var/amount_per_pill = reagents.total_volume/count - if(amount_per_pill > 50) amount_per_pill = 50 - var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null - if(!name) - return - name = reject_bad_text(name) - while(count--) - var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc) - if(!name) name = reagents.get_master_reagent_name() - P.name = "[name] pill" - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - P.icon_state = "pill"+pillsprite - reagents.trans_to(P,amount_per_pill) - if(loaded_pill_bottle) - if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) - P.forceMove(loaded_pill_bottle) - updateUsrDialog() - else - var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null - if(!name) - return - name = reject_bad_text(name) - var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc) - if(!name) name = reagents.get_master_reagent_name() - P.originalname = name - P.name = "[name] pack" - P.desc = "A small condiment pack. The label says it contains [name]." - reagents.trans_to(P,10) - else if(href_list["createpatch"] || href_list["createpatch_multiple"]) - if(!condi) - var/count = 1 - if(href_list["createpatch_multiple"]) - count = input("Select the number of patches to make.", 10, patchamount) as num|null - if(count == null) - return - count = isgoodnumber(count) - if(!count || count <= 0) - return - if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? - var/amount_per_patch = reagents.total_volume/count - if(amount_per_patch > 40) amount_per_patch = 40 - var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null - if(!name) - return - name = reject_bad_text(name) - var/is_medical_patch = chemical_safety_check(reagents) - while(count--) - var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc) - if(!name) name = reagents.get_master_reagent_name() - P.name = "[name] patch" - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - reagents.trans_to(P,amount_per_patch) - if(is_medical_patch) - P.instant_application = 1 - P.icon_state = "bandaid_med" - else if(href_list["createbottle"]) - if(!condi) - var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null - if(!name) - return - name = reject_bad_text(name) - var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc) - if(!name) name = reagents.get_master_reagent_name() - P.name = "[name] bottle" - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - P.icon_state = bottlesprite - reagents.trans_to(P,30) - else - var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc) - reagents.trans_to(P,50) - else if(href_list["change_pill"]) - #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites - var/dat = "" - var/j = 0 - for(var/i = 1 to MAX_PILL_SPRITE) - j++ - if(j == 1) - dat += "" - dat += "" - if(j == 5) - dat += "" - j = 0 - dat += "
" - usr << browse(dat, "window=chem_master_iconsel;size=225x193") - return - else if(href_list["change_bottle"]) - var/dat = "" - var/j = 0 - for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle")) - j++ - if(j == 1) - dat += "" - dat += "" - if(j == 5) - dat += "" - j = 0 - dat += "
" - usr << browse(dat, "window=chem_master_iconsel;size=225x193") - return - else if(href_list["pill_sprite"]) - pillsprite = href_list["pill_sprite"] - usr << browse(null, "window=chem_master_iconsel") - else if(href_list["bottle_sprite"]) - bottlesprite = href_list["bottle_sprite"] - usr << browse(null, "window=chem_master_iconsel") - - nanomanager.update_uis(src) - return - -/obj/machinery/chem_master/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/chem_master/attack_ghost(mob/user) - return attack_hand(user) - -/obj/machinery/chem_master/attack_hand(mob/user) - if(..()) - return 1 - ui_interact(user) - return - -/obj/machinery/chem_master/ui_interact(mob/user, ui_key="main", datum/nanoui/ui = null, force_open = 1) - - var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master) - assets.send(user) - - var/data = list() - - data["condi"] = condi - data["loaded_pill_bottle"] = (loaded_pill_bottle ? 1 : 0) - if(loaded_pill_bottle) - data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len - data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.storage_slots - - data["beaker"] = (beaker ? 1 : 0) - if(beaker) - var/list/beaker_reagents_list = list() - data["beaker_reagents"] = beaker_reagents_list - for(var/datum/reagent/R in beaker.reagents.reagent_list) - beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description) - var/list/buffer_reagents_list = list() - data["buffer_reagents"] = buffer_reagents_list - for(var/datum/reagent/R in reagents.reagent_list) - buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description) - - data["pillsprite"] = pillsprite - data["bottlesprite"] = bottlesprite - data["mode"] = mode - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if(!ui) - ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/chem_master/proc/isgoodnumber(num) - if(isnum(num)) - if(num > 200) - num = 200 - else if(num < 0) - num = 1 - else - num = round(num) - return num - else - return 0 - -/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R) - var/all_safe = 1 - for(var/datum/reagent/A in R.reagent_list) - if(!safe_chem_list.Find(A.id)) - all_safe = 0 - return all_safe - -/obj/machinery/chem_master/condimaster - name = "\improper CondiMaster 3000" - condi = 1 - -/obj/machinery/chem_master/constructable - name = "ChemMaster 2999" - desc = "Used to seperate chemicals and distribute them in a variety of forms." - -/obj/machinery/chem_master/constructable/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/chem_master(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) - component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) - -/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params) - - if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) - if(beaker) - beaker.forceMove(get_turf(src)) - beaker = null - reagents.clear_reagents() - if(loaded_pill_bottle) - loaded_pill_bottle.forceMove(get_turf(src)) - loaded_pill_bottle = null - return - - if(exchange_parts(user, B)) - return - - if(panel_open) - if(istype(B, /obj/item/weapon/crowbar)) - default_deconstruction_crowbar(B) - return 1 - else - to_chat(user, "You can't use the [name] while it's panel is opened!") - return 1 - else - ..() - -/obj/machinery/reagentgrinder - - name = "\improper All-In-One Grinder" - icon = 'icons/obj/kitchen.dmi' - icon_state = "juicer1" - layer = 2.9 - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 5 - active_power_usage = 100 - var/inuse = 0 - var/obj/item/weapon/reagent_containers/beaker = null - var/limit = 10 - - //IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent - var/list/blend_items = list ( - - //Sheets - /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20), - /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20), - /obj/item/stack/sheet/mineral/bananium = list("banana" = 20), - /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20), - /obj/item/stack/sheet/mineral/silver = list("silver" = 20), - /obj/item/stack/sheet/mineral/gold = list("gold" = 20), - /obj/item/weapon/grown/novaflower = list("capsaicin" = 0), - - //archaeology! - ///obj/item/weapon/rocksliver = list("ground_rock" = 50), - - - //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/food/pill = list(), - /obj/item/weapon/reagent_containers/food = list(), - /obj/item/weapon/reagent_containers/honeycomb = list() - ) - - var/list/blend_tags = list ( - "nettle" = list("sacid" = 0), - "deathnettle" = list("facid" = 0), - "soybeans" = list("soymilk" = 0), - "tomato" = list("ketchup" = 0), - "wheat" = list("flour" = -5), - "rice" = list("rice" = -5), - "cherries" = list("cherryjelly" = 0), - ) - - var/list/juice_items = list ( - /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0), - ) - - var/list/juice_tags = list ( - "tomato" = list("tomatojuice" = 0), - "carrot" = list("carrotjuice" = 0), - "berries" = list("berryjuice" = 0), - "banana" = list("banana" = 0), - "potato" = list("potato" = 0), - "lemon" = list("lemonjuice" = 0), - "orange" = list("orangejuice" = 0), - "lime" = list("limejuice" = 0), - "poisonberries" = list("poisonberryjuice" = 0), - "grapes" = list("grapejuice" = 0), - "corn" = list("cornoil" = 0), - ) - - var/list/holdingitems = list() - -/obj/machinery/reagentgrinder/New() - ..() - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - return - -/obj/machinery/reagentgrinder/update_icon() - icon_state = "juicer"+num2text(!isnull(beaker)) - return - -/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params) - - if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ - istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \ - istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker)) - - if(beaker) - return 1 - else - if(!user.drop_item()) - to_chat(user, "[O] is stuck to you!") - return - beaker = O - O.forceMove(src) - update_icon() - updateUsrDialog() - return 0 - - if(holdingitems && holdingitems.len >= limit) - to_chat(usr, "The machine cannot hold anymore items.") - return 1 - - //Fill machine with the plantbag! - if(istype(O, /obj/item/weapon/storage/bag/plants)) - - for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) - O.contents -= G - G.forceMove(src) - holdingitems += G - if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill - to_chat(user, "You empty the plant bag into the All-In-One grinder.") - - updateUsrDialog() - return 0 - - - if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items)) - to_chat(user, "Cannot refine into a reagent.") - return 1 - - user.unEquip(O) - O.forceMove(src) - holdingitems += O - updateUsrDialog() - return 0 - -/obj/machinery/reagentgrinder/attack_ai(mob/user) - return 0 - -/obj/machinery/reagentgrinder/attack_hand(mob/user) - user.set_machine(src) - interact(user) - -/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu - var/is_chamber_empty = 0 - var/is_beaker_ready = 0 - var/processing_chamber = "" - var/beaker_contents = "" - var/dat = "" - - if(!inuse) - for(var/obj/item/O in holdingitems) - processing_chamber += "\A [O.name]
" - - if(!processing_chamber) - is_chamber_empty = 1 - processing_chamber = "Nothing." - if(!beaker) - beaker_contents = "No beaker attached.
" - else - is_beaker_ready = 1 - beaker_contents = "The beaker contains:
" - var/anything = 0 - for(var/datum/reagent/R in beaker.reagents.reagent_list) - anything = 1 - beaker_contents += "[R.volume] - [R.name]
" - if(!anything) - beaker_contents += "Nothing
" - - - dat = {" - Processing chamber contains:
- [processing_chamber]
- [beaker_contents]
- "} - if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN))) - dat += "Grind the reagents
" - dat += "Juice the reagents

" - if(holdingitems && holdingitems.len > 0) - dat += "Eject the reagents
" - if(beaker) - dat += "Detach the beaker
" - else - dat += "Please wait..." - user << browse("All-In-One Grinder[dat]", "window=reagentgrinder") - onclose(user, "reagentgrinder") - return - -/obj/machinery/reagentgrinder/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - switch(href_list["action"]) - if("grind") - grind() - if("juice") - juice() - if("eject") - eject() - if("detach") - detach() - updateUsrDialog() - return - -/obj/machinery/reagentgrinder/proc/detach() - - if(usr.stat != 0) - return - if(!beaker) - return - beaker.forceMove(loc) - beaker = null - update_icon() - -/obj/machinery/reagentgrinder/proc/eject() - - if(usr.stat != 0) - return - if(holdingitems && holdingitems.len == 0) - return - - for(var/obj/item/O in holdingitems) - O.forceMove(loc) - holdingitems -= O - holdingitems = list() - -/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O) - for(var/i in blend_items) - if(istype(O, i)) - return 1 - return 0 - -/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O) - for(var/i in blend_items) - if(istype(O, i)) - return blend_items[i] - -/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O) - for(var/i in blend_items) - if(istype(O, i)) - return blend_items[i] - -/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O) - for(var/i in juice_items) - if(istype(O, i)) - return juice_items[i] - -/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O) - for(var/i in blend_tags) - if(O.seed.kitchen_tag == i) - return blend_tags[i] - -/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O) - for(var/i in juice_tags) - if(O.seed.kitchen_tag == i) - return juice_tags[i] - -/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O) - if(!istype(O)) - return 5 - else if(O.potency == -1) - return 5 - else - return round(O.potency) - -/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O) - if(!istype(O)) - return 5 - else if(O.potency == -1) - return 5 - else - return round(5*sqrt(O.potency)) - -/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O) - holdingitems -= O - qdel(O) - -/obj/machinery/reagentgrinder/proc/juice() - power_change() - if(stat & (NOPOWER|BROKEN)) - return - if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) - return - playsound(loc, 'sound/machines/juicer.ogg', 20, 1) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - inuse = 1 - spawn(50) - pixel_x = initial(pixel_x) //return to its spot after shaking - inuse = 0 - interact(usr) - //Snacks - for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - - var/allowed = null - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) - allowed = get_allowed_juice_by_tag(O) - else - allowed = get_allowed_juice_by_id(O) - if(isnull(allowed)) - break - - for(var/r_id in allowed) - - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = get_juice_amount(O) - - beaker.reagents.add_reagent(r_id, min(amount, space)) - - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - - remove_object(O) - -/obj/machinery/reagentgrinder/proc/grind() - - power_change() - if(stat & (NOPOWER|BROKEN)) - return - if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) - return - playsound(loc, 'sound/machines/blender.ogg', 50, 1) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - inuse = 1 - spawn(60) - pixel_x = initial(pixel_x) //return to its spot after shaking - inuse = 0 - interact(usr) - //Snacks and Plants - for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - - var/allowed = null - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) - allowed = get_allowed_snack_by_tag(O) - else - allowed = get_allowed_snack_by_id(O) - if(isnull(allowed)) - break - - for(var/r_id in allowed) - - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = allowed[r_id] - if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5") - if(amount == 0) - if(O.reagents != null && O.reagents.has_reagent("nutriment")) - beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space)) - O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) - if(O.reagents != null && O.reagents.has_reagent("plantmatter")) - beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space)) - O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) - else - if(O.reagents != null && O.reagents.has_reagent("nutriment")) - beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space)) - O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) - if(O.reagents != null && O.reagents.has_reagent("plantmatter")) - beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space)) - O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) - - else - O.reagents.trans_id_to(beaker, r_id, min(amount, space)) - - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - - if(O.reagents.reagent_list.len == 0) - remove_object(O) - - //Sheets - for(var/obj/item/stack/sheet/O in holdingitems) - var/allowed = get_allowed_by_id(O) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - for(var/i = 1; i <= round(O.amount, 1); i++) - for(var/r_id in allowed) - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = allowed[r_id] - beaker.reagents.add_reagent(r_id,min(amount, space)) - if(space < amount) - break - if(i == round(O.amount, 1)) - remove_object(O) - break - //Plants - for(var/obj/item/weapon/grown/O in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - var/allowed = get_allowed_by_id(O) - for(var/r_id in allowed) - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = allowed[r_id] - if(amount == 0) - if(O.reagents != null && O.reagents.has_reagent(r_id)) - beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space)) - else - beaker.reagents.add_reagent(r_id,min(amount, space)) - - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - remove_object(O) - - //xenoarch - /*for(var/obj/item/weapon/rocksliver/O in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - var/allowed = get_allowed_by_id(O) - for(var/r_id in allowed) - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = allowed[r_id] - beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data) - - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - 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) - break - var/amount = O.reagents.total_volume - O.reagents.trans_to(beaker, amount) - if(!O.reagents.total_volume) - remove_object(O) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/chemistry/colors.dm similarity index 80% rename from code/modules/reagents/Chemistry-Colours.dm rename to code/modules/reagents/chemistry/colors.dm index 176ec99c4d4..3d4ab41fe9c 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/chemistry/colors.dm @@ -1,31 +1,31 @@ -/* - * Returns: - * #RRGGBB(AA) on success, null on failure - */ -/proc/mix_color_from_reagents(const/list/reagent_list) - if(!istype(reagent_list)) - return - - var/color - var/reagent_color - var/vol_counter = 0 - var/vol_temp - // see libs/IconProcs/IconProcs.dm - for(var/datum/reagent/reagent in reagent_list) - if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) - reagent_color = reagent.data["blood_colour"] - else - reagent_color = reagent.color - - vol_temp = reagent.volume - vol_counter += vol_temp - - if(isnull(color)) - color = reagent.color - else if(length(color) >= length(reagent_color)) - color = BlendRGB(color, reagent_color, vol_temp/vol_counter) - else - color = BlendRGB(reagent_color, color, vol_temp/vol_counter) - return color - - +/* + * Returns: + * #RRGGBB(AA) on success, null on failure + */ +var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") + +/proc/mix_color_from_reagents(const/list/reagent_list) + if(!istype(reagent_list)) + return + + var/color + var/reagent_color + var/vol_counter = 0 + var/vol_temp + // see libs/IconProcs/IconProcs.dm + for(var/datum/reagent/reagent in reagent_list) + if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) + reagent_color = reagent.data["blood_colour"] + else + reagent_color = reagent.color + + vol_temp = reagent.volume + vol_counter += vol_temp + + if(isnull(color)) + color = reagent.color + else if(length(color) >= length(reagent_color)) + color = BlendRGB(color, reagent_color, vol_temp/vol_counter) + else + color = BlendRGB(reagent_color, color, vol_temp/vol_counter) + return color \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/chemistry/holder.dm similarity index 80% rename from code/modules/reagents/Chemistry-Holder.dm rename to code/modules/reagents/chemistry/holder.dm index ecc9c9ddc18..9c0c14014e4 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,601 +1,730 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -var/const/TOUCH = 1 -var/const/INGEST = 2 - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 300 - var/list/datum/reagent/addiction_list = new/list() - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!chemical_reagents_list) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = subtypesof(/datum/reagent) - chemical_reagents_list = list() - for(var/path in paths) - var/datum/reagent/D = new path() - chemical_reagents_list[D.id] = D - if(!D.can_grow_in_plants) - plant_blocked_chems.Add(D.id) - if(!chemical_reactions_list) - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - var/paths = subtypesof(/datum/chemical_reaction) - chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D && D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!chemical_reactions_list[id]) - chemical_reactions_list[id] = list() - chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant. - -/datum/reagents/proc/remove_any(amount=1) - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1,reagent_list.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !reagent_list.len) - break - - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] - - remove_reagent(current_reagent.id, min(1, amount - total_transfered)) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/get_master_reagent_name() - var/the_name = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_name = A.name - - return the_name - -/datum/reagents/proc/get_master_reagent_id() - var/the_id = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_id = A.id - - return the_id - -/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - if(!target) - return - if(total_volume <= 0) - return - var/datum/reagents/R - if(istype(target, /obj)) - var/obj/O = target - if(!O.reagents ) - return - R = O.reagents - else if(isliving(target)) - var/mob/living/M = target - if(!M.reagents) - return - R = M.reagents - else if(istype(target, /datum/reagents)) - R = target - else - return - - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/datum/reagent/current_reagent in reagent_list) - if(!current_reagent) - continue - if(current_reagent.id == "blood" && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(my_atom, amount) - continue - var/current_reagent_transfer = current_reagent.volume * part - if(preserve_data) - trans_data = copy_data(current_reagent) - - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) - remove_reagent(current_reagent.id, current_reagent_transfer) - - update_total() - R.update_total() - R.handle_reactions() - handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) - if(!target) - return - if(!target.reagents || total_volume<=0) - return - var/datum/reagents/R = target.reagents - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/datum/reagent/current_reagent in reagent_list) - var/current_reagent_transfer = current_reagent.volume * part - if(preserve_data) - trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) - - update_total() - R.update_total() - R.handle_reactions() - handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - if(!target) - return - if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent)) - return - - var/datum/reagents/R = target.reagents - if(get_reagent_amount(reagent) R.maximum_volume) return 0 - - current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix. - - while(total_transfered != amount) - if(total_transfered >= amount) break //Better safe than sorry. - if(total_volume <= 0 || !reagent_list.len) break - if(R.total_volume >= R.maximum_volume) break - - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] - if(preserve_data) - trans_data = current_reagent.data - R.add_reagent(current_reagent.id, (1 * multiplier), trans_data) - remove_reagent(current_reagent.id, 1) - - current_list_element++ - total_transfered++ - update_total() - R.update_total() - R.handle_reactions() - handle_reactions() - - return total_transfered -*/ - - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - for(var/datum/reagent/R in reagent_list) - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A, ) - for(var/datum/reagent/R in reagent_list) - R.on_update (A) - update_total() - -/datum/reagents/proc/handle_reactions() - if(my_atom.flags & NOREACT) - return //Yup, no reactions here. No siree. - - var/reaction_occured = 0 - do - reaction_occured = 0 - for(var/datum/reagent/R in reagent_list) // Usually a small list - for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/total_required_reagents = C.required_reagents.len - var/total_matching_reagents = 0 - var/total_required_catalysts = C.required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/list/multipliers = new/list() - var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this) - var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this) - for(var/B in C.required_reagents) - if(!has_reagent(B, C.required_reagents[B])) - break - total_matching_reagents++ - multipliers += round(get_reagent_amount(B) / C.required_reagents[B]) - for(var/B in C.required_catalysts) - if(!has_reagent(B, C.required_catalysts[B])) - break - total_matching_catalysts++ - - if(!C.required_container) - matching_container = 1 - - else - if(my_atom.type == C.required_container) - matching_container = 1 - - if(!C.required_other) - matching_other = 1 - - else if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - - if(min_temp == 0) - min_temp = chem_temp - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp) - var/multiplier = min(multipliers) - var/preserved_data = null - for(var/B in C.required_reagents) - if(!preserved_data) - preserved_data = get_data(B) - remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) - - var/created_volume = C.result_amount*multiplier - 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) - - //add secondary products - for(var/S in C.secondary_results) - add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) - - var/list/seen = viewers(4, get_turf(my_atom)) - for(var/mob/M in seen) - if(!C.no_message) - to_chat(M, "[bicon(my_atom)] [C.mix_message]") - - if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - playsound(get_turf(my_atom), C.mix_sound, 80, 1) - - C.on_reaction(src, created_volume) - reaction_occured = 1 - break - - while(reaction_occured) - update_total() - return 0 - -/datum/reagents/proc/isolate_reagent(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id == reagent) - if(isliving(my_atom)) - var/mob/living/M = my_atom - R.reagent_deleted(M) - reagent_list -= A - qdel(A) - update_total() - my_atom.on_reagent_change() - return 0 - - - return 1 - -/datum/reagents/proc/update_total() - total_volume = 0 - for(var/datum/reagent/R in reagent_list) - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - for(var/datum/reagent/R in reagent_list) - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R) - var/can_process = 0 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - //Check if this mob's species is set and can process this type of reagent - if(H.species && H.species.reagent_tag) - if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN - can_process = 1 - if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG - can_process = 1 - //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater - if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO)) - can_process = 1 - if(H.species && H.species.exotic_blood) - if(R.id == H.species.exotic_blood) - can_process = 0 - //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) - else - if(R.process_flags != SYNTHETIC) - can_process = 1 - return can_process - -/datum/reagents/proc/reaction(atom/A, method=TOUCH, volume_modifier = 1) - switch(method) - if(TOUCH) - for(var/datum/reagent/R in reagent_list) - if(isliving(A)) - var/check = reaction_check(A, R) - if(!check) - continue - else - R.reaction_mob(A, TOUCH, R.volume*volume_modifier) - if(isturf(A)) - R.reaction_turf(A, R.volume*volume_modifier) - if(isobj(A)) - R.reaction_obj(A, R.volume*volume_modifier) - if(INGEST) - for(var/datum/reagent/R in reagent_list) - if(isliving(A)) - var/check = reaction_check(A, R) - if(!check) - continue - else - R.reaction_mob(A, INGEST, R.volume*volume_modifier) - if(isturf(A)) - R.reaction_turf(A, R.volume*volume_modifier) - if(isobj(A)) - R.reaction_obj(A, R.volume*volume_modifier) - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) - 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. - if(amount <= 0) - return 0 - chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems - - for(var/A in reagent_list) - - var/datum/reagent/R = A - if(R.id == reagent) - R.volume += amount - update_total() - my_atom.on_reagent_change() - R.on_merge(data) - handle_reactions() - return 0 - - var/datum/reagent/D = chemical_reagents_list[reagent] - if(D) - - var/datum/reagent/R = new D.type() - reagent_list += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - update_total() - my_atom.on_reagent_change() - handle_reactions() - return 0 - else - warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - - handle_reactions() - - return 1 - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(!isnum(amount)) - return 1 - - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id == reagent) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - my_atom.on_reagent_change() - return 0 - - return 1 - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/res = "" - for(var/datum/reagent/A in reagent_list) - if(res != "") res += "," - res += A.name - - return res - -/datum/reagents/proc/get_reagent(type) - . = locate(type) in reagent_list - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - - var/has_removed_reagent = 0 - - for(var/datum/reagent/R in reagent_list) - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -// Admin logging. -/datum/reagents/proc/get_reagent_ids(and_amount=0) - var/list/stuff = list() - for(var/datum/reagent/A in reagent_list) - if(and_amount) - stuff += "[get_reagent_amount(A.id)]U of [A.id]" - else - stuff += A.id - return english_list(stuff) - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) -// to_chat(world, "proffering a data-carrying reagent ([reagent_id])") - return D.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) -// to_chat(world, "reagent data set ([reagent_id])") - D.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -atom/proc/create_reagents(max_vol) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/datum/reagents/proc/get_reagent_from_id(id) - var/datum/reagent/result = null - for(var/datum/reagent/R in reagent_list) - if(R.id == id) - result = R - break - return result - -/datum/reagents/Destroy() - . = ..() - processing_objects.Remove(src) - for(var/datum/reagent/R in reagent_list) - qdel(R) - reagent_list.Cut() - reagent_list = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + +var/const/TOUCH = 1 +var/const/INGEST = 2 +#define ADDICTION_TIME 4800 //8 minutes + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 300 + var/list/datum/reagent/addiction_list = new/list() + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!chemical_reagents_list) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = subtypesof(/datum/reagent) + chemical_reagents_list = list() + for(var/path in paths) + var/datum/reagent/D = new path() + chemical_reagents_list[D.id] = D + if(!D.can_grow_in_plants) + plant_blocked_chems.Add(D.id) + if(!chemical_reactions_list) + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + var/paths = subtypesof(/datum/chemical_reaction) + chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D && D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!chemical_reactions_list[id]) + chemical_reactions_list[id] = list() + chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant. + +/datum/reagents/proc/remove_any(amount=1) + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1,reagent_list.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !reagent_list.len) + break + + if(current_list_element > reagent_list.len) current_list_element = 1 + var/datum/reagent/current_reagent = reagent_list[current_list_element] + + remove_reagent(current_reagent.id, min(1, amount - total_transfered)) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/get_master_reagent() + var/the_reagent = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_reagent = A + + return the_reagent + +/datum/reagents/proc/get_master_reagent_name() + var/the_name = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_name = A.name + + return the_name + +/datum/reagents/proc/get_master_reagent_id() + var/the_id = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_id = A.id + + return the_id + +/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + if(!target) + return + if(total_volume <= 0) + return + var/datum/reagents/R + if(istype(target, /obj)) + var/obj/O = target + if(!O.reagents ) + return + R = O.reagents + else if(isliving(target)) + var/mob/living/M = target + if(!M.reagents) + return + R = M.reagents + else if(istype(target, /datum/reagents)) + R = target + else + return + + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/datum/reagent/current_reagent in reagent_list) + if(!current_reagent) + continue + if(current_reagent.id == "blood" && ishuman(target)) + var/mob/living/carbon/human/H = target + H.inject_blood(my_atom, amount) + continue + var/current_reagent_transfer = current_reagent.volume * part + if(preserve_data) + trans_data = copy_data(current_reagent) + + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) + remove_reagent(current_reagent.id, current_reagent_transfer) + + update_total() + R.update_total() + R.handle_reactions() + handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) + if(!target) + return + if(!target.reagents || total_volume<=0) + return + var/datum/reagents/R = target.reagents + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/datum/reagent/current_reagent in reagent_list) + var/current_reagent_transfer = current_reagent.volume * part + if(preserve_data) + trans_data = copy_data(current_reagent) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) + + update_total() + R.update_total() + R.handle_reactions() + handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + if(!target) + return + if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent)) + return + + var/datum/reagents/R = target.reagents + if(get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + R.overdose_start(M) + if(R.volume < R.overdose_threshold && R.overdosed) + R.overdosed = 0 + if(R.overdosed) + R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1) + + for(var/A in addiction_list) + var/datum/reagent/R = A + if(M && R) + if(R.addiction_stage < 5) + if(prob(5)) + R.addiction_stage++ + switch(R.addiction_stage) + if(1) + R.addiction_act_stage1(M) + if(2) + R.addiction_act_stage2(M) + if(3) + R.addiction_act_stage3(M) + if(4) + R.addiction_act_stage4(M) + if(5) + R.addiction_act_stage5(M) + if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end + to_chat(M, "You no longer feel reliant on [R.name]!") + addiction_list.Remove(R) + update_total() + +/datum/reagents/proc/death_metabolize(mob/living/M) + if(!M) + return + if(M.stat != DEAD) //what part of DEATH_metabolize don't you get? + return + for(var/A in reagent_list) + var/datum/reagent/R = A + if(!istype(R)) + continue + if(M && R) + R.on_mob_death(M) + +/datum/reagents/proc/overdose_list() + var/od_chems[0] + for(var/datum/reagent/R in reagent_list) + if(R.overdosed) + od_chems.Add(R.id) + return od_chems + + +/datum/reagents/proc/reagent_on_tick() + for(var/datum/reagent/R in reagent_list) + R.on_tick() + return +/* + if(!target) return + var/total_transfered = 0 + var/current_list_element = 1 + var/datum/reagents/R = target.reagents + var/trans_data = null + //if(R.total_volume + amount > R.maximum_volume) return 0 + + current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix. + + while(total_transfered != amount) + if(total_transfered >= amount) break //Better safe than sorry. + if(total_volume <= 0 || !reagent_list.len) break + if(R.total_volume >= R.maximum_volume) break + + if(current_list_element > reagent_list.len) current_list_element = 1 + var/datum/reagent/current_reagent = reagent_list[current_list_element] + if(preserve_data) + trans_data = current_reagent.data + R.add_reagent(current_reagent.id, (1 * multiplier), trans_data) + remove_reagent(current_reagent.id, 1) + + current_list_element++ + total_transfered++ + update_total() + R.update_total() + R.handle_reactions() + handle_reactions() + + return total_transfered +*/ + + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + for(var/datum/reagent/R in reagent_list) + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A, ) + for(var/datum/reagent/R in reagent_list) + R.on_update (A) + update_total() + +/datum/reagents/proc/handle_reactions() + if(my_atom.flags & NOREACT) + return //Yup, no reactions here. No siree. + + var/reaction_occured = 0 + do + reaction_occured = 0 + for(var/datum/reagent/R in reagent_list) // Usually a small list + for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue + + var/datum/chemical_reaction/C = reaction + var/total_required_reagents = C.required_reagents.len + var/total_matching_reagents = 0 + var/total_required_catalysts = C.required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/list/multipliers = new/list() + var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this) + var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this) + for(var/B in C.required_reagents) + if(!has_reagent(B, C.required_reagents[B])) + break + total_matching_reagents++ + multipliers += round(get_reagent_amount(B) / C.required_reagents[B]) + for(var/B in C.required_catalysts) + if(!has_reagent(B, C.required_catalysts[B])) + break + total_matching_catalysts++ + + if(!C.required_container) + matching_container = 1 + + else + if(my_atom.type == C.required_container) + matching_container = 1 + + if(!C.required_other) + matching_other = 1 + + else if(istype(my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/M = my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 + + if(min_temp == 0) + min_temp = chem_temp + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp) + var/multiplier = min(multipliers) + var/preserved_data = null + for(var/B in C.required_reagents) + if(!preserved_data) + preserved_data = get_data(B) + remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) + + var/created_volume = C.result_amount*multiplier + 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) + + //add secondary products + for(var/S in C.secondary_results) + add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) + + var/list/seen = viewers(4, get_turf(my_atom)) + for(var/mob/M in seen) + if(!C.no_message) + to_chat(M, "[bicon(my_atom)] [C.mix_message]") + + if(istype(my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + playsound(get_turf(my_atom), C.mix_sound, 80, 1) + + C.on_reaction(src, created_volume) + reaction_occured = 1 + break + + while(reaction_occured) + update_total() + return 0 + +/datum/reagents/proc/isolate_reagent(reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id == reagent) + if(isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + reagent_list -= A + qdel(A) + update_total() + my_atom.on_reagent_change() + return 0 + + + return 1 + +/datum/reagents/proc/update_total() + total_volume = 0 + for(var/datum/reagent/R in reagent_list) + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + for(var/datum/reagent/R in reagent_list) + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R) + var/can_process = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + //Check if this mob's species is set and can process this type of reagent + if(H.species && H.species.reagent_tag) + if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN + can_process = 1 + if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG + can_process = 1 + //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater + if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO)) + can_process = 1 + if(H.species && H.species.exotic_blood) + if(R.id == H.species.exotic_blood) + can_process = 0 + //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) + else + if(R.process_flags != SYNTHETIC) + can_process = 1 + return can_process + +/datum/reagents/proc/reaction(atom/A, method=TOUCH, volume_modifier = 1) + switch(method) + if(TOUCH) + for(var/datum/reagent/R in reagent_list) + if(isliving(A)) + var/check = reaction_check(A, R) + if(!check) + continue + else + R.reaction_mob(A, TOUCH, R.volume*volume_modifier) + if(isturf(A)) + R.reaction_turf(A, R.volume*volume_modifier) + if(isobj(A)) + R.reaction_obj(A, R.volume*volume_modifier) + if(INGEST) + for(var/datum/reagent/R in reagent_list) + if(isliving(A)) + var/check = reaction_check(A, R) + if(!check) + continue + else + R.reaction_mob(A, INGEST, R.volume*volume_modifier) + if(isturf(A)) + R.reaction_turf(A, R.volume*volume_modifier) + if(isobj(A)) + R.reaction_obj(A, R.volume*volume_modifier) + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) + 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. + if(amount <= 0) + return 0 + chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems + + for(var/A in reagent_list) + + var/datum/reagent/R = A + if(R.id == reagent) + R.volume += amount + update_total() + my_atom.on_reagent_change() + R.on_merge(data) + handle_reactions() + return 0 + + var/datum/reagent/D = chemical_reagents_list[reagent] + if(D) + + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) + + update_total() + my_atom.on_reagent_change() + handle_reactions() + return 0 + else + warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + + handle_reactions() + + return 1 + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(!isnum(amount)) + return 1 + + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id == reagent) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + my_atom.on_reagent_change() + return 0 + + return 1 + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/res = "" + for(var/datum/reagent/A in reagent_list) + if(res != "") res += "," + res += A.name + + return res + +/datum/reagents/proc/get_reagent(type) + . = locate(type) in reagent_list + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + + var/has_removed_reagent = 0 + + for(var/datum/reagent/R in reagent_list) + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +// Admin logging. +/datum/reagents/proc/get_reagent_ids(and_amount=0) + var/list/stuff = list() + for(var/datum/reagent/A in reagent_list) + if(and_amount) + stuff += "[get_reagent_amount(A.id)]U of [A.id]" + else + stuff += A.id + return english_list(stuff) + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) +// to_chat(world, "proffering a data-carrying reagent ([reagent_id])") + return D.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) +// to_chat(world, "reagent data set ([reagent_id])") + D.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents +/proc/adminReagentCheck(list/incoming) + var/list/outgoing[0] + for(var/tocheck in incoming) + if(ispath(tocheck)) + var/check = new tocheck + if(istype(check, /atom)) + var/atom/reagentCheck = check + var/datum/reagents/reagents = reagentCheck.reagents + var/admin = 0 + for(var/reag in reagents.reagent_list) + var/datum/reagent/reagent = reag + if(reagent.admin_only) + admin = 1 + break + if(!(admin)) + outgoing += tocheck + else + outgoing += tocheck + return outgoing + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +atom/proc/create_reagents(max_vol) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/datum/reagents/proc/get_reagent_from_id(id) + var/datum/reagent/result = null + for(var/datum/reagent/R in reagent_list) + if(R.id == id) + result = R + break + return result + +/datum/reagents/Destroy() + . = ..() + processing_objects.Remove(src) + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list.Cut() + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm new file mode 100644 index 00000000000..5103f246a27 --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -0,0 +1,377 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +/obj/machinery/chem_dispenser + name = "chem dispenser" + density = 1 + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "dispenser" + use_power = 0 + idle_power_usage = 40 + var/ui_title = "Chem Dispenser 5000" + var/energy = 100 + var/max_energy = 100 + var/amount = 30 + var/obj/item/weapon/reagent_containers/beaker = null + var/recharged = 0 + var/hackedcheck = 0 + var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", + "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron", + "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver") + var/list/hacked_reagents = list("toxin") + var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." + var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." + var/list/broken_requirements = list() + var/broken_on_spawn = 0 + var/recharge_delay = 5 + var/image/icon_beaker = null //cached overlay + + +/obj/machinery/chem_dispenser/proc/recharge() + if(stat & (BROKEN|NOPOWER)) return + var/addenergy = 1 + var/oldenergy = energy + energy = min(energy + addenergy, max_energy) + if(energy != oldenergy) + use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air) + nanomanager.update_uis(src) // update all UIs attached to src + +/obj/machinery/chem_dispenser/power_change() + if(powered()) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + stat |= NOPOWER + nanomanager.update_uis(src) // update all UIs attached to src + +/obj/machinery/chem_dispenser/process() + + if(recharged < 0) + recharge() + recharged = recharge_delay + else + recharged -= 1 + +/obj/machinery/chem_dispenser/New() + ..() + recharge() + dispensable_reagents = sortList(dispensable_reagents) + + if(broken_on_spawn) + overlays.Cut() + var/amount = pick(3,3,4) + var/list/options = list() + options[/obj/item/weapon/stock_parts/capacitor/adv] = "Add an advanced capacitor to fix it." + options[/obj/item/weapon/stock_parts/console_screen] = "Replace the console screen to fix it." + options[/obj/item/weapon/stock_parts/manipulator/pico] = "Upgrade to a pico manipulator to fix it." + options[/obj/item/weapon/stock_parts/matter_bin/super] = "Give it a super matter bin to fix it." + options[/obj/item/weapon/stock_parts/cell/super] = "Replace the reagent synthesizer with a super capacity cell to fix it." + options[/obj/item/device/mass_spectrometer/adv] = "Replace the reagent scanner with an advanced mass spectrometer to fix it" + options[/obj/item/weapon/stock_parts/micro_laser/high] = "Repair the reagent synthesizer with an high-power micro-laser to fix it" + options[/obj/item/device/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it" + options[/obj/item/stack/nanopaste] = "Apply some nanopaste to the broken nozzles to fix it." + options[/obj/item/stack/sheet/plasteel] = "Surround the outside with a plasteel cover to fix it." + options[/obj/item/stack/sheet/rglass] = "Insert a pane of reinforced glass to fix it." + + while(amount > 0) + amount -= 1 + + var/index = pick(options) + broken_requirements[index] = options[index] + options -= index + + +/obj/machinery/chem_dispenser/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if(prob(50)) + qdel(src) + return + +/obj/machinery/chem_dispenser/blob_act() + if(prob(50)) + qdel(src) + + /** + * The ui_interact proc is used to open and update Nano UIs + * If ui_interact is not used then the UI will not update correctly + * ui_interact is currently defined for /atom/movable + * + * @param user /mob The mob who is interacting with this ui + * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") + * + * @return nothing + */ + +/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + if(broken_requirements.len) + to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]") + return + + + // this is the data which will be sent to the ui + var/data[0] + data["amount"] = amount + data["energy"] = round(energy) + data["maxEnergy"] = round(max_energy) + data["isBeakerLoaded"] = beaker ? 1 : 0 + + var beakerContents[0] + var beakerCurrentVolume = 0 + if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... + beakerCurrentVolume += R.volume + data["beakerContents"] = beakerContents + + if(beaker) + data["beakerCurrentVolume"] = beakerCurrentVolume + data["beakerMaxVolume"] = beaker.volume + else + data["beakerCurrentVolume"] = null + data["beakerMaxVolume"] = null + + var chemicals[0] + for(var/re in dispensable_reagents) + var/datum/reagent/temp = chemical_reagents_list[re] + if(temp) + chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list... + data["chemicals"] = chemicals + + // 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) + // 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 + ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 390, 655) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + +/obj/machinery/chem_dispenser/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["amount"]) + amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 + if(amount < 0) // Since the user can actually type the commands himself, some sanity checking + amount = 0 + if(amount > 100) + amount = 100 + + if(href_list["dispense"]) + if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null) + var/obj/item/weapon/reagent_containers/glass/B = beaker + var/datum/reagents/R = B.reagents + var/space = R.maximum_volume - R.total_volume + + R.add_reagent(href_list["dispense"], min(amount, energy * 10, space)) + energy = max(energy - min(amount, energy * 10, space) / 10, 0) + overlays.Cut() + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker + + if(href_list["remove"]) + if(beaker) + if(href_list["removeamount"]) + var/amount = text2num(href_list["removeamount"]) + if(isnum(amount) && (amount > 0)) + var/obj/item/weapon/reagent_containers/glass/B = beaker + var/datum/reagents/R = B.reagents + var/id = href_list["remove"] + R.remove_reagent(id, amount) + + if(href_list["ejectBeaker"]) + if(beaker) + var/obj/item/weapon/reagent_containers/glass/B = beaker + B.forceMove(loc) + beaker = null + overlays.Cut() + add_fingerprint(usr) + return 1 // update UIs attached to this object + +/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/B, mob/user, params) + if(isrobot(user)) + return + + if(broken_requirements.len && B.type == broken_requirements[1]) + if(istype(B,/obj/item/stack)) + var/obj/item/stack/S = B + S.use(1) + else + if(!user.drop_item()) + to_chat(user, "[B] is stuck to you!") + return + qdel(B) + broken_requirements -= broken_requirements[1] + to_chat(user, "You fix [src].") + return + + if(beaker) + to_chat(user, "Something is already loaded into the machine.") + return + + if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) + beaker = B + if(!user.drop_item()) + to_chat(user, "[B] is stuck to you!") + return + B.forceMove(src) + to_chat(user, "You set [B] on the machine.") + nanomanager.update_uis(src) // update all UIs attached to src + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker + return + +/obj/machinery/chem_dispenser/attackby(obj/item/weapon/B, mob/user, params) + ..() + if(istype(B, /obj/item/device/multitool)) + if(hackedcheck == 0) + to_chat(user, hack_message) + dispensable_reagents += hacked_reagents + hackedcheck = 1 + return + + else + to_chat(user, unhack_message) + dispensable_reagents -= hacked_reagents + hackedcheck = 0 + return + +/obj/machinery/chem_dispenser/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/chem_dispenser/attack_ghost(mob/user) + return attack_hand(user) + +/obj/machinery/chem_dispenser/attack_hand(mob/user) + if(stat & BROKEN) + return + + ui_interact(user) + +/obj/machinery/chem_dispenser/soda + icon_state = "soda_dispenser" + name = "soda fountain" + desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch." + ui_title = "Soda Dispens-o-matic" + energy = 100 + max_energy = 100 + dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up", + "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana", + "watermelonjuice", "carrotjuice", "potato", "berryjuice") + hack_message = "You change the mode from 'McNano' to 'Pizza King'." + unhack_message = "You change the mode from 'Pizza King' to 'McNano'." + hacked_reagents = list("thirteenloko") + +/obj/machinery/chem_dispenser/beer + icon_state = "booze_dispenser" + name = "booze dispenser" + ui_title = "Booze Portal 9001" + energy = 100 + max_energy = 100 + 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("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol") + hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." + unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." + hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing") + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/machinery/chem_dispenser/constructable + name = "portable chem dispenser" + icon = 'icons/obj/chemical.dmi' + icon_state = "minidispenser" + energy = 5 + max_energy = 5 + amount = 5 + recharge_delay = 10 + dispensable_reagents = list() + var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"), + list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"), + list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"), + list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel")) + +/obj/machinery/chem_dispenser/constructable/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/weapon/stock_parts/cell/super(null) + RefreshParts() + +/obj/machinery/chem_dispenser/constructable/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/weapon/stock_parts/cell/hyper(null) + RefreshParts() + +/obj/machinery/chem_dispenser/constructable/RefreshParts() + var/time = 0 + var/temp_energy = 0 + var/i + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + temp_energy += M.rating + temp_energy-- + max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + time += C.rating + for(var/obj/item/weapon/stock_parts/cell/P in component_parts) + time += round(P.maxcharge, 10000) / 10000 + recharge_delay = 10 / (time/2) //delay between recharges, double the usual time on lowest 33% less than usual on highest + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + for(i=1, i<=M.rating, i++) + dispensable_reagents = sortList(dispensable_reagents | special_reagents[i]) + +/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(panel_open) + to_chat(user, "Close the maintenance panel first.") + return + ..() + else + ..() + + if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) + return + + if(exchange_parts(user, I)) + return + + if(istype(I, /obj/item/weapon/wrench)) + playsound(src, 'sound/items/Ratchet.ogg', 50, 1) + if(anchored) + anchored = 0 + to_chat(user, "[src] can now be moved.") + else if(!anchored) + anchored = 1 + to_chat(user, "[src] is now secured.") + + if(panel_open) + if(istype(I, /obj/item/weapon/crowbar)) + if(beaker) + var/obj/item/weapon/reagent_containers/glass/B = beaker + B.forceMove(loc) + beaker = null + default_deconstruction_crowbar(I) + return 1 \ No newline at end of file diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm similarity index 100% rename from code/modules/reagents/newchem/chem_heater.dm rename to code/modules/reagents/chemistry/machinery/chem_heater.dm diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm new file mode 100644 index 00000000000..b6b0de6e0a0 --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -0,0 +1,415 @@ +/obj/machinery/chem_master + name = "\improper ChemMaster 3000" + density = 1 + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "mixer0" + use_power = 1 + idle_power_usage = 20 + var/obj/item/weapon/reagent_containers/beaker = null + var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null + var/mode = 0 + var/condi = 0 + var/useramount = 30 // Last used amount + var/pillamount = 10 + var/patchamount = 10 + var/bottlesprite = "bottle" + var/pillsprite = "1" + var/client/has_sprites = list() + var/printing = null + +/obj/machinery/chem_master/New() + create_reagents(100) + overlays += "waitlight" + +/obj/machinery/chem_master/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if(prob(50)) + qdel(src) + return + +/obj/machinery/chem_master/blob_act() + if(prob(50)) + qdel(src) + +/obj/machinery/chem_master/power_change() + if(powered()) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + stat |= NOPOWER + +/obj/machinery/chem_master/attackby(obj/item/weapon/B, mob/user, params) + + if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) + + if(beaker) + to_chat(user, "A beaker is already loaded into the machine.") + return + if(!user.drop_item()) + to_chat(user, "[B] is stuck to you!") + return + beaker = B + B.forceMove(src) + to_chat(user, "You add the beaker to the machine!") + nanomanager.update_uis(src) + icon_state = "mixer1" + + else if(istype(B, /obj/item/weapon/storage/pill_bottle)) + + if(loaded_pill_bottle) + to_chat(user, "A pill bottle is already loaded into the machine.") + return + + if(!user.drop_item()) + to_chat(user, "[B] is stuck to you!") + return + loaded_pill_bottle = B + B.forceMove(src) + to_chat(user, "You add the pill bottle into the dispenser slot!") + nanomanager.update_uis(src) + return + +/obj/machinery/chem_master/Topic(href, href_list) + if(..()) + return 1 + + add_fingerprint(usr) + usr.set_machine(src) + + + if(href_list["ejectp"]) + if(loaded_pill_bottle) + loaded_pill_bottle.forceMove(loc) + loaded_pill_bottle = null + else if(href_list["close"]) + usr << browse(null, "window=chem_master") + onclose(usr, "chem_master") + usr.unset_machine() + return + + if(href_list["print_p"]) + if(!(printing)) + printing = 1 + visible_message("[src] rattles and prints out a sheet of paper.") + playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) + P.info = "
Chemical Analysis

" + P.info += "Time of analysis: [worldtime2text(world.time)]

" + P.info += "Chemical name: [href_list["name"]]
" + if(href_list["name"] == "Blood") + var/datum/reagents/R = beaker.reagents + var/datum/reagent/blood/G + for(var/datum/reagent/F in R.reagent_list) + if(F.name == href_list["name"]) + G = F + break + var/B = G.data["blood_type"] + var/C = G.data["blood_DNA"] + P.info += "Description:
Blood Type: [B]
DNA: [C]" + else + P.info += "Description: [href_list["desc"]]" + P.info += "

Notes:
" + P.name = "Chemical Analysis - [href_list["name"]]" + printing = null + + if(beaker) + var/datum/reagents/R = beaker.reagents + if(href_list["analyze"]) + var/dat = "" + if(!condi) + if(href_list["name"] == "Blood") + var/datum/reagent/blood/G + for(var/datum/reagent/F in R.reagent_list) + if(F.name == href_list["name"]) + G = F + break + var/A = G.name + var/B = G.data["blood_type"] + var/C = G.data["blood_DNA"] + dat += "Chemmaster 3000Chemical infos:

Name:
[A]

Description:
Blood Type: [B]
DNA: [C]" + else + dat += "Chemmaster 3000Chemical infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]" + dat += "

(Print Analysis)
" + dat += "(Back)" + else + dat += "Condimaster 3000Condiment infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" + usr << browse(dat, "window=chem_master;size=575x400") + return + + else if(href_list["add"]) + + if(href_list["amount"]) + var/id = href_list["add"] + var/amount = text2num(href_list["amount"]) + R.trans_id_to(src, id, amount) + + else if(href_list["addcustom"]) + + var/id = href_list["addcustom"] + useramount = input("Select the amount to transfer.", 30, useramount) as num + useramount = isgoodnumber(useramount) + Topic(null, list("amount" = "[useramount]", "add" = "[id]")) + + else if(href_list["remove"]) + + if(href_list["amount"]) + var/id = href_list["remove"] + var/amount = text2num(href_list["amount"]) + if(mode) + reagents.trans_id_to(beaker, id, amount) + else + reagents.remove_reagent(id, amount) + + + else if(href_list["removecustom"]) + + var/id = href_list["removecustom"] + useramount = input("Select the amount to transfer.", 30, useramount) as num + useramount = isgoodnumber(useramount) + Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) + + else if(href_list["toggle"]) + mode = !mode + + else if(href_list["main"]) + attack_hand(usr) + return + else if(href_list["eject"]) + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + reagents.clear_reagents() + icon_state = "mixer0" + else if(href_list["createpill"] || href_list["createpill_multiple"]) + if(!condi) + var/count = 1 + if(href_list["createpill_multiple"]) + count = input("Select the number of pills to make.", 10, pillamount) as num|null + if(count == null) + return + count = isgoodnumber(count) + if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? + if(count <= 0) return + var/amount_per_pill = reagents.total_volume/count + if(amount_per_pill > 50) amount_per_pill = 50 + var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null + if(!name) + return + name = reject_bad_text(name) + while(count--) + var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] pill" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + P.icon_state = "pill"+pillsprite + reagents.trans_to(P,amount_per_pill) + if(loaded_pill_bottle) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) + P.forceMove(loaded_pill_bottle) + updateUsrDialog() + else + var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null + if(!name) + return + name = reject_bad_text(name) + var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc) + if(!name) name = reagents.get_master_reagent_name() + P.originalname = name + P.name = "[name] pack" + P.desc = "A small condiment pack. The label says it contains [name]." + reagents.trans_to(P,10) + else if(href_list["createpatch"] || href_list["createpatch_multiple"]) + if(!condi) + var/count = 1 + if(href_list["createpatch_multiple"]) + count = input("Select the number of patches to make.", 10, patchamount) as num|null + if(count == null) + return + count = isgoodnumber(count) + if(!count || count <= 0) + return + if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? + var/amount_per_patch = reagents.total_volume/count + if(amount_per_patch > 40) amount_per_patch = 40 + var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null + if(!name) + return + name = reject_bad_text(name) + var/is_medical_patch = chemical_safety_check(reagents) + while(count--) + var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] patch" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + reagents.trans_to(P,amount_per_patch) + if(is_medical_patch) + P.instant_application = 1 + P.icon_state = "bandaid_med" + else if(href_list["createbottle"]) + if(!condi) + var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null + if(!name) + return + name = reject_bad_text(name) + var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] bottle" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + P.icon_state = bottlesprite + reagents.trans_to(P,30) + else + var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc) + reagents.trans_to(P,50) + else if(href_list["change_pill"]) + #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites + var/dat = "" + var/j = 0 + for(var/i = 1 to MAX_PILL_SPRITE) + j++ + if(j == 1) + dat += "" + dat += "" + if(j == 5) + dat += "" + j = 0 + dat += "
" + usr << browse(dat, "window=chem_master_iconsel;size=225x193") + return + else if(href_list["change_bottle"]) + var/dat = "" + var/j = 0 + for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle")) + j++ + if(j == 1) + dat += "" + dat += "" + if(j == 5) + dat += "" + j = 0 + dat += "
" + usr << browse(dat, "window=chem_master_iconsel;size=225x193") + return + else if(href_list["pill_sprite"]) + pillsprite = href_list["pill_sprite"] + usr << browse(null, "window=chem_master_iconsel") + else if(href_list["bottle_sprite"]) + bottlesprite = href_list["bottle_sprite"] + usr << browse(null, "window=chem_master_iconsel") + + nanomanager.update_uis(src) + return + +/obj/machinery/chem_master/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/chem_master/attack_ghost(mob/user) + return attack_hand(user) + +/obj/machinery/chem_master/attack_hand(mob/user) + if(..()) + return 1 + ui_interact(user) + return + +/obj/machinery/chem_master/ui_interact(mob/user, ui_key="main", datum/nanoui/ui = null, force_open = 1) + + var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master) + assets.send(user) + + var/data = list() + + data["condi"] = condi + data["loaded_pill_bottle"] = (loaded_pill_bottle ? 1 : 0) + if(loaded_pill_bottle) + data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len + data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.storage_slots + + data["beaker"] = (beaker ? 1 : 0) + if(beaker) + var/list/beaker_reagents_list = list() + data["beaker_reagents"] = beaker_reagents_list + for(var/datum/reagent/R in beaker.reagents.reagent_list) + beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description) + var/list/buffer_reagents_list = list() + data["buffer_reagents"] = buffer_reagents_list + for(var/datum/reagent/R in reagents.reagent_list) + buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description) + + data["pillsprite"] = pillsprite + data["bottlesprite"] = bottlesprite + data["mode"] = mode + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/chem_master/proc/isgoodnumber(num) + if(isnum(num)) + if(num > 200) + num = 200 + else if(num < 0) + num = 1 + else + num = round(num) + return num + else + return 0 + +/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R) + var/all_safe = 1 + for(var/datum/reagent/A in R.reagent_list) + if(!safe_chem_list.Find(A.id)) + all_safe = 0 + return all_safe + +/obj/machinery/chem_master/condimaster + name = "\improper CondiMaster 3000" + condi = 1 + +/obj/machinery/chem_master/constructable + name = "ChemMaster 2999" + desc = "Used to seperate chemicals and distribute them in a variety of forms." + +/obj/machinery/chem_master/constructable/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/chem_master(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) + component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) + +/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params) + + if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + reagents.clear_reagents() + if(loaded_pill_bottle) + loaded_pill_bottle.forceMove(get_turf(src)) + loaded_pill_bottle = null + return + + if(exchange_parts(user, B)) + return + + if(panel_open) + if(istype(B, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(B) + return 1 + else + to_chat(user, "You can't use the [name] while it's panel is opened!") + return 1 + else + ..() \ No newline at end of file diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm similarity index 99% rename from code/modules/reagents/pandemic.dm rename to code/modules/reagents/chemistry/machinery/pandemic.dm index 1f801d0ace5..1aa72ac0918 100644 --- a/code/modules/reagents/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -293,5 +293,4 @@ ..() return else - ..() - return + ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm new file mode 100644 index 00000000000..38cfdf4b0ae --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -0,0 +1,415 @@ +/obj/machinery/reagentgrinder + name = "\improper All-In-One Grinder" + icon = 'icons/obj/kitchen.dmi' + icon_state = "juicer1" + layer = 2.9 + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 5 + active_power_usage = 100 + var/inuse = 0 + var/obj/item/weapon/reagent_containers/beaker = null + var/limit = 10 + + //IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent + var/list/blend_items = list ( + + //Sheets + /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20), + /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20), + /obj/item/stack/sheet/mineral/bananium = list("banana" = 20), + /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20), + /obj/item/stack/sheet/mineral/silver = list("silver" = 20), + /obj/item/stack/sheet/mineral/gold = list("gold" = 20), + /obj/item/weapon/grown/novaflower = list("capsaicin" = 0), + + //archaeology! + ///obj/item/weapon/rocksliver = list("ground_rock" = 50), + + + //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/food = list(), + /obj/item/weapon/reagent_containers/honeycomb = list() + ) + + var/list/blend_tags = list ( + "nettle" = list("sacid" = 0), + "deathnettle" = list("facid" = 0), + "soybeans" = list("soymilk" = 0), + "tomato" = list("ketchup" = 0), + "wheat" = list("flour" = -5), + "rice" = list("rice" = -5), + "cherries" = list("cherryjelly" = 0), + ) + + var/list/juice_items = list ( + /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0), + ) + + var/list/juice_tags = list ( + "tomato" = list("tomatojuice" = 0), + "carrot" = list("carrotjuice" = 0), + "berries" = list("berryjuice" = 0), + "banana" = list("banana" = 0), + "potato" = list("potato" = 0), + "lemon" = list("lemonjuice" = 0), + "orange" = list("orangejuice" = 0), + "lime" = list("limejuice" = 0), + "poisonberries" = list("poisonberryjuice" = 0), + "grapes" = list("grapejuice" = 0), + "corn" = list("cornoil" = 0), + ) + + var/list/holdingitems = list() + +/obj/machinery/reagentgrinder/New() + ..() + beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + return + +/obj/machinery/reagentgrinder/update_icon() + icon_state = "juicer"+num2text(!isnull(beaker)) + return + +/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params) + + if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker)) + + if(beaker) + return 1 + else + if(!user.drop_item()) + to_chat(user, "[O] is stuck to you!") + return + beaker = O + O.forceMove(src) + update_icon() + updateUsrDialog() + return 0 + + if(holdingitems && holdingitems.len >= limit) + to_chat(usr, "The machine cannot hold anymore items.") + return 1 + + //Fill machine with a plantbag! + if(istype(O, /obj/item/weapon/storage/bag/plants)) + var/obj/item/weapon/storage/bag/plants/PB = O + for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents) + PB.remove_from_storage(G, src) + holdingitems += G + if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill + to_chat(user, "You empty [PB] into the All-In-One grinder.") + + updateUsrDialog() + return 0 + + + if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items)) + to_chat(user, "Cannot refine into a reagent.") + return 1 + + user.unEquip(O) + O.forceMove(src) + holdingitems += O + updateUsrDialog() + return 0 + +/obj/machinery/reagentgrinder/attack_ai(mob/user) + return 0 + +/obj/machinery/reagentgrinder/attack_hand(mob/user) + user.set_machine(src) + interact(user) + +/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu + var/is_chamber_empty = 0 + var/is_beaker_ready = 0 + var/processing_chamber = "" + var/beaker_contents = "" + var/dat = "" + + if(!inuse) + for(var/obj/item/O in holdingitems) + processing_chamber += "\A [O.name]
" + + if(!processing_chamber) + is_chamber_empty = 1 + processing_chamber = "Nothing." + if(!beaker) + beaker_contents = "No beaker attached.
" + else + is_beaker_ready = 1 + beaker_contents = "The beaker contains:
" + var/anything = 0 + for(var/datum/reagent/R in beaker.reagents.reagent_list) + anything = 1 + beaker_contents += "[R.volume] - [R.name]
" + if(!anything) + beaker_contents += "Nothing
" + + + dat = {" + Processing chamber contains:
+ [processing_chamber]
+ [beaker_contents]
+ "} + if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN))) + dat += "Grind the reagents
" + dat += "Juice the reagents

" + if(holdingitems && holdingitems.len > 0) + dat += "Eject the reagents
" + if(beaker) + dat += "Detach the beaker
" + else + dat += "Please wait..." + user << browse("All-In-One Grinder[dat]", "window=reagentgrinder") + onclose(user, "reagentgrinder") + return + +/obj/machinery/reagentgrinder/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + switch(href_list["action"]) + if("grind") + grind() + if("juice") + juice() + if("eject") + eject() + if("detach") + detach() + updateUsrDialog() + return + +/obj/machinery/reagentgrinder/proc/detach() + + if(usr.stat != 0) + return + if(!beaker) + return + beaker.forceMove(loc) + beaker = null + update_icon() + +/obj/machinery/reagentgrinder/proc/eject() + + if(usr.stat != 0) + return + if(holdingitems && holdingitems.len == 0) + return + + for(var/obj/item/O in holdingitems) + O.forceMove(loc) + holdingitems -= O + holdingitems = list() + +/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O) + for(var/i in blend_items) + if(istype(O, i)) + return 1 + return 0 + +/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O) + for(var/i in blend_items) + if(istype(O, i)) + return blend_items[i] + +/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O) + for(var/i in blend_items) + if(istype(O, i)) + return blend_items[i] + +/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O) + for(var/i in juice_items) + if(istype(O, i)) + return juice_items[i] + +/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O) + for(var/i in blend_tags) + if(O.seed.kitchen_tag == i) + return blend_tags[i] + +/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O) + for(var/i in juice_tags) + if(O.seed.kitchen_tag == i) + return juice_tags[i] + +/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O) + if(!istype(O)) + return 5 + else if(O.potency == -1) + return 5 + else + return round(O.potency) + +/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O) + if(!istype(O)) + return 5 + else if(O.potency == -1) + return 5 + else + return round(5*sqrt(O.potency)) + +/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O) + holdingitems -= O + qdel(O) + +/obj/machinery/reagentgrinder/proc/juice() + power_change() + if(stat & (NOPOWER|BROKEN)) + return + if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) + return + playsound(loc, 'sound/machines/juicer.ogg', 20, 1) + var/offset = prob(50) ? -2 : 2 + animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking + inuse = 1 + spawn(50) + pixel_x = initial(pixel_x) //return to its spot after shaking + inuse = 0 + interact(usr) + //Snacks + for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + + var/allowed = null + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) + allowed = get_allowed_juice_by_tag(O) + else + allowed = get_allowed_juice_by_id(O) + if(isnull(allowed)) + break + + for(var/r_id in allowed) + + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = get_juice_amount(O) + + beaker.reagents.add_reagent(r_id, min(amount, space)) + + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + + remove_object(O) + +/obj/machinery/reagentgrinder/proc/grind() + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) + return + playsound(loc, 'sound/machines/blender.ogg', 50, 1) + var/offset = prob(50) ? -2 : 2 + animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking + inuse = 1 + spawn(60) + pixel_x = initial(pixel_x) //return to its spot after shaking + inuse = 0 + interact(usr) + //Snacks and Plants + for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + + var/allowed = null + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) + allowed = get_allowed_snack_by_tag(O) + else + allowed = get_allowed_snack_by_id(O) + if(isnull(allowed)) + break + + for(var/r_id in allowed) + + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5") + if(amount == 0) + if(O.reagents != null && O.reagents.has_reagent("nutriment")) + beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space)) + O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) + if(O.reagents != null && O.reagents.has_reagent("plantmatter")) + beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space)) + O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) + else + if(O.reagents != null && O.reagents.has_reagent("nutriment")) + beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space)) + O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) + if(O.reagents != null && O.reagents.has_reagent("plantmatter")) + beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space)) + O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) + + else + O.reagents.trans_id_to(beaker, r_id, min(amount, space)) + + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + + if(O.reagents.reagent_list.len == 0) + remove_object(O) + + //Sheets + for(var/obj/item/stack/sheet/O in holdingitems) + var/allowed = get_allowed_by_id(O) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + for(var/i = 1; i <= round(O.amount, 1); i++) + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + beaker.reagents.add_reagent(r_id,min(amount, space)) + if(space < amount) + break + if(i == round(O.amount, 1)) + remove_object(O) + break + //Plants + for(var/obj/item/weapon/grown/O in holdingitems) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + var/allowed = get_allowed_by_id(O) + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + if(amount == 0) + if(O.reagents != null && O.reagents.has_reagent(r_id)) + beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space)) + else + beaker.reagents.add_reagent(r_id,min(amount, space)) + + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + remove_object(O) + + //xenoarch + /*for(var/obj/item/weapon/rocksliver/O in holdingitems) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + var/allowed = get_allowed_by_id(O) + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data) + + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + 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) + break + var/amount = O.reagents.total_volume + O.reagents.trans_to(beaker, amount) + if(!O.reagents.total_volume) + remove_object(O) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/chemistry/readme.dm similarity index 97% rename from code/modules/reagents/Chemistry-Readme.dm rename to code/modules/reagents/chemistry/readme.dm index cae0c31162c..1fe946a10d1 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/chemistry/readme.dm @@ -1,249 +1,249 @@ -/* -NOTE: IF YOU UPDATE THE REAGENT-SYSTEM, ALSO UPDATE THIS README. - -Structure: /////////////////// ////////////////////////// - // Mob or object // -------> // Reagents var (datum) // Is a reference to the datum that holds the reagents. - /////////////////// ////////////////////////// - | | - The object that holds everything. V - reagent_list var (list) A List of datums, each datum is a reagent. - - | | | - V V V - - reagents (datums) Reagents. I.e. Water , antitoxins or mercury. - - -Random important notes: - - An objects on_reagent_change will be called every time the objects reagents change. - Useful if you want to update the objects icon etc. - -About the Holder: - - The holder (reagents datum) is the datum that holds a list of all reagents - currently in the object.It also has all the procs needed to manipulate reagents - - remove_any(amount) - This proc removes reagents from the holder until the passed amount - is matched. It'll try to remove some of ALL reagents contained. - - trans_to(obj/target, amount) - This proc equally transfers the contents of the holder to another - objects holder. You need to pass it the object (not the holder) you want - to transfer to and the amount you want to transfer. Its return value is the - actual amount transfered (if one of the objects is full/empty) - - trans_id_to(obj/target, reagent, amount) - Same as above but only for a specific reagent in the reagent list. - If the specified amount is greater than what is available, it will use - the amount of the reagent that is available. If no reagent exists, returns null. - - metabolize(mob/living/M) - This proc is called by the mobs life proc. It simply calls on_mob_life for - all contained reagents. You shouldnt have to use this one directly. - - handle_reactions() - This proc check all recipes and, on a match, uses them. - It will also call the recipe's on_reaction proc (for explosions or w/e). - Currently, this proc is automatically called by trans_to. - - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology) - - isolate_reagent(reagent) - Pass it a reagent id and it will remove all reagents but that one. - It's that simple. - - del_reagent(reagent) - Completely remove the reagent with the matching id. - - update_total() - This one simply updates the total volume of the holder. - (the volume of all reagents added together) - - clear_reagents() - This proc removes ALL reagents from the holder. - - reaction(atom/A, method=TOUCH, volume_modifier=0) - This proc calls the appropriate reaction procs of the reagents. - I.e. if A is an object, it will call the reagents reaction_obj - proc. The method var is used for reaction on mobs. It simply tells - us if the mob TOUCHed the reagent or if it INGESTed the reagent. - Since the volume can be checked in a reagents proc, you might want to - use the volume_modifier var to modifiy the passed value without actually - changing the volume of the reagents. - If you're not sure if you need to use this the answer is very most likely 'No'. - You'll want to use this proc whenever an atom first comes in - contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.) - More on the reaction in the reagent part of this readme. - - add_reagent(reagent, amount, data) - Attempts to add X of the matching reagent to the holder. - You wont use this much. Mostly in new procs for pre-filled - objects. - - remove_reagent(reagent, amount) - The exact opposite of the add_reagent proc. - - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology) - - has_reagent(reagent, amount) - Returns 1 if the holder contains this reagent. - Or 0 if not. - If you pass it an amount it will additionally check - if the amount is matched. This is optional. - - get_reagent_amount(reagent) - Returns the amount of the matching reagent inside the - holder. Returns 0 if the reagent is missing. - - overdose_list() - Returns a list of all the chemical IDs in the reagent holder that are overdosing - - Important variables: - - total_volume - This variable contains the total volume of all reagents in this holder. - - reagent_list - This is a list of all contained reagents. More specifically, references - to the reagent datums. - - maximum_volume - This is the maximum volume of the holder. - - my_atom - This is the atom the holder is 'in'. Useful if you need to find the location. - (i.e. for explosions) - - -About Reagents: - - Reagents are all the things you can mix and fille in bottles etc. This can be anything from - rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below. - - reaction_mob(mob/living/M, method=TOUCH) - This is called by the holder's reation proc. - This version is only called when the reagent - reacts with a mob. The method var can be either - TOUCH or INGEST. You'll want to put stuff like - acid-facemelting in here. Should only ever be - called, directly, on living mobs. - - reaction_obj(obj/O) - This is called by the holder's reation proc. - This version is called when the reagents reacts - with an object. You'll want to put stuff like - object melting in here ... or something. i dunno. - - reaction_turf(turf/T) - This is called by the holder's reation proc. - This version is called when the reagents reacts - with a turf. You'll want to put stuff like extra - slippery floors for lube or something in here. - - on_mob_life(mob/living/M) - This proc is called everytime the mobs life proc executes. - This is the place where you put damage for toxins , - drowsyness for sleep toxins etc etc. - You'll want to call the parents proc by using ..() . - If you dont, the chemical will stay in the mob forever - - unless you write your own piece of code to slowly remove it. - (Should be pretty easy, 1 line of code) - - Important variables: - - holder - This variable contains a reference to the holder the chemical is 'in' - - volume - This is the volume of the reagent. - - id - The id of the reagent - - name - The name of the reagent. - - data - This var can be used for whatever the fuck you want.You could use this - for DNA in a blood reagent or ... well whatever you want. - - color - This is a hexadecimal color that represents the reagent outside of containers, - you define it as "#RRGGBB", or, red green blue. You can also define it using the - rgb() proc, which returns a hexadecimal value too. The color is black by default. - - A good website for color calculations: http://www.psyclops.com/tools/rgb/ - - - - -About Recipes: - - Recipes are simple datums that contain a list of required reagents and a result. - They also have a proc that is called when the recipe is matched. - - on_reaction(datum/reagents/holder, created_volume) - This proc is called when the recipe is matched. - You'll want to add explosions etc here. - To find the location you'll have to do something - like get_turf(holder.my_atom) - - name & id - Should be pretty obvious. - - result - This var contains the id of the resulting reagent. - - required_reagents - This is a list of ids of the required reagents. - Each id also needs an associated value that gives us the minimum required amount - of that reagent. The handle_reaction proc can detect mutiples of the same recipes - so for most cases you want to set the required amount to 1. - - required_catalysts (Added May 2011) - This is a list of the ids of the required catalysts. - Functionally similar to required_reagents, it is a list of reagents that are required - for the reaction. However, unlike required_reagents, catalysts are NOT consumed. - They mearly have to be present in the container. - - result_amount - This is the amount of the resulting reagent this recipe will produce. - I recommend you set this to the total volume of all required reagent. - - required_container - The container the recipe has to take place in in order to happen. Leave this blank/null - if you want the reaction to happen anywhere. - - required_other - Basically like a reagent's data variable. You can set extra requirements for a - reaction with this. - - -About the Tools: - - By default, all atom have a reagents var - but its empty. if you want to use an object for the chem. - system you'll need to add something like this in its new proc: - - var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum, 100 is the maximum_volume of the new holder datum. - reagents = R, <<< assign the new datum to the objects reagents var - R.my_atom = src, <<< set the holders my_atom to src so that we know where we are. - - This can also be done by calling a convenience proc: - atom/proc/create_reagents(max_volume) - - Other important stuff: - - amount_per_transfer_from_this var - This var is mostly used by beakers and bottles. - It simply tells us how much to transfer when - 'pouring' our reagents into something else. - - atom/proc/is_open_container() - Checks atom/var/flags & OPENCONTAINER. - If this returns 1 , you can use syringes, beakers etc - to manipulate the contents of this object. - If it's 0, you'll need to write your own custom reagent - transfer code since you will not be able to use the standard - tools to manipulate it. - +/* +NOTE: IF YOU UPDATE THE REAGENT-SYSTEM, ALSO UPDATE THIS README. + +Structure: /////////////////// ////////////////////////// + // Mob or object // -------> // Reagents var (datum) // Is a reference to the datum that holds the reagents. + /////////////////// ////////////////////////// + | | + The object that holds everything. V + reagent_list var (list) A List of datums, each datum is a reagent. + + | | | + V V V + + reagents (datums) Reagents. I.e. Water , antitoxins or mercury. + + +Random important notes: + + An objects on_reagent_change will be called every time the objects reagents change. + Useful if you want to update the objects icon etc. + +About the Holder: + + The holder (reagents datum) is the datum that holds a list of all reagents + currently in the object.It also has all the procs needed to manipulate reagents + + remove_any(amount) + This proc removes reagents from the holder until the passed amount + is matched. It'll try to remove some of ALL reagents contained. + + trans_to(obj/target, amount) + This proc equally transfers the contents of the holder to another + objects holder. You need to pass it the object (not the holder) you want + to transfer to and the amount you want to transfer. Its return value is the + actual amount transfered (if one of the objects is full/empty) + + trans_id_to(obj/target, reagent, amount) + Same as above but only for a specific reagent in the reagent list. + If the specified amount is greater than what is available, it will use + the amount of the reagent that is available. If no reagent exists, returns null. + + metabolize(mob/living/M) + This proc is called by the mobs life proc. It simply calls on_mob_life for + all contained reagents. You shouldnt have to use this one directly. + + handle_reactions() + This proc check all recipes and, on a match, uses them. + It will also call the recipe's on_reaction proc (for explosions or w/e). + Currently, this proc is automatically called by trans_to. + - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology) + + isolate_reagent(reagent) + Pass it a reagent id and it will remove all reagents but that one. + It's that simple. + + del_reagent(reagent) + Completely remove the reagent with the matching id. + + update_total() + This one simply updates the total volume of the holder. + (the volume of all reagents added together) + + clear_reagents() + This proc removes ALL reagents from the holder. + + reaction(atom/A, method=TOUCH, volume_modifier=0) + This proc calls the appropriate reaction procs of the reagents. + I.e. if A is an object, it will call the reagents reaction_obj + proc. The method var is used for reaction on mobs. It simply tells + us if the mob TOUCHed the reagent or if it INGESTed the reagent. + Since the volume can be checked in a reagents proc, you might want to + use the volume_modifier var to modifiy the passed value without actually + changing the volume of the reagents. + If you're not sure if you need to use this the answer is very most likely 'No'. + You'll want to use this proc whenever an atom first comes in + contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.) + More on the reaction in the reagent part of this readme. + + add_reagent(reagent, amount, data) + Attempts to add X of the matching reagent to the holder. + You wont use this much. Mostly in new procs for pre-filled + objects. + + remove_reagent(reagent, amount) + The exact opposite of the add_reagent proc. + - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology) + + has_reagent(reagent, amount) + Returns 1 if the holder contains this reagent. + Or 0 if not. + If you pass it an amount it will additionally check + if the amount is matched. This is optional. + + get_reagent_amount(reagent) + Returns the amount of the matching reagent inside the + holder. Returns 0 if the reagent is missing. + + overdose_list() + Returns a list of all the chemical IDs in the reagent holder that are overdosing + + Important variables: + + total_volume + This variable contains the total volume of all reagents in this holder. + + reagent_list + This is a list of all contained reagents. More specifically, references + to the reagent datums. + + maximum_volume + This is the maximum volume of the holder. + + my_atom + This is the atom the holder is 'in'. Useful if you need to find the location. + (i.e. for explosions) + + +About Reagents: + + Reagents are all the things you can mix and fille in bottles etc. This can be anything from + rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below. + + reaction_mob(mob/living/M, method=TOUCH) + This is called by the holder's reation proc. + This version is only called when the reagent + reacts with a mob. The method var can be either + TOUCH or INGEST. You'll want to put stuff like + acid-facemelting in here. Should only ever be + called, directly, on living mobs. + + reaction_obj(obj/O) + This is called by the holder's reation proc. + This version is called when the reagents reacts + with an object. You'll want to put stuff like + object melting in here ... or something. i dunno. + + reaction_turf(turf/T) + This is called by the holder's reation proc. + This version is called when the reagents reacts + with a turf. You'll want to put stuff like extra + slippery floors for lube or something in here. + + on_mob_life(mob/living/M) + This proc is called everytime the mobs life proc executes. + This is the place where you put damage for toxins , + drowsyness for sleep toxins etc etc. + You'll want to call the parents proc by using ..() . + If you dont, the chemical will stay in the mob forever - + unless you write your own piece of code to slowly remove it. + (Should be pretty easy, 1 line of code) + + Important variables: + + holder + This variable contains a reference to the holder the chemical is 'in' + + volume + This is the volume of the reagent. + + id + The id of the reagent + + name + The name of the reagent. + + data + This var can be used for whatever the fuck you want.You could use this + for DNA in a blood reagent or ... well whatever you want. + + color + This is a hexadecimal color that represents the reagent outside of containers, + you define it as "#RRGGBB", or, red green blue. You can also define it using the + rgb() proc, which returns a hexadecimal value too. The color is black by default. + + A good website for color calculations: http://www.psyclops.com/tools/rgb/ + + + + +About Recipes: + + Recipes are simple datums that contain a list of required reagents and a result. + They also have a proc that is called when the recipe is matched. + + on_reaction(datum/reagents/holder, created_volume) + This proc is called when the recipe is matched. + You'll want to add explosions etc here. + To find the location you'll have to do something + like get_turf(holder.my_atom) + + name & id + Should be pretty obvious. + + result + This var contains the id of the resulting reagent. + + required_reagents + This is a list of ids of the required reagents. + Each id also needs an associated value that gives us the minimum required amount + of that reagent. The handle_reaction proc can detect mutiples of the same recipes + so for most cases you want to set the required amount to 1. + + required_catalysts (Added May 2011) + This is a list of the ids of the required catalysts. + Functionally similar to required_reagents, it is a list of reagents that are required + for the reaction. However, unlike required_reagents, catalysts are NOT consumed. + They mearly have to be present in the container. + + result_amount + This is the amount of the resulting reagent this recipe will produce. + I recommend you set this to the total volume of all required reagent. + + required_container + The container the recipe has to take place in in order to happen. Leave this blank/null + if you want the reaction to happen anywhere. + + required_other + Basically like a reagent's data variable. You can set extra requirements for a + reaction with this. + + +About the Tools: + + By default, all atom have a reagents var - but its empty. if you want to use an object for the chem. + system you'll need to add something like this in its new proc: + + var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum, 100 is the maximum_volume of the new holder datum. + reagents = R, <<< assign the new datum to the objects reagents var + R.my_atom = src, <<< set the holders my_atom to src so that we know where we are. + + This can also be done by calling a convenience proc: + atom/proc/create_reagents(max_volume) + + Other important stuff: + + amount_per_transfer_from_this var + This var is mostly used by beakers and bottles. + It simply tells us how much to transfer when + 'pouring' our reagents into something else. + + atom/proc/is_open_container() + Checks atom/var/flags & OPENCONTAINER. + If this returns 1 , you can use syringes, beakers etc + to manipulate the contents of this object. + If it's 0, you'll need to write your own custom reagent + transfer code since you will not be able to use the standard + tools to manipulate it. + */ \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/chemistry/reagents.dm similarity index 53% rename from code/modules/reagents/oldchem/reagents/_reagent_base.dm rename to code/modules/reagents/chemistry/reagents.dm index fbf1398decb..367c747c4e0 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -1,3 +1,7 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + /datum/reagent var/name = "Reagent" var/id = "reagent" @@ -6,7 +10,6 @@ var/reagent_state = SOLID var/list/data = null var/volume = 0 - var/nutriment_factor = 0 var/metabolization_rate = REAGENTS_METABOLISM //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) @@ -20,6 +23,20 @@ //By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths var/process_flags = ORGANIC var/admin_only = 0 + var/can_synth = 1 //whether or not a mech syringe gun and synthesize this reagent + var/overdose_threshold = 0 + var/addiction_chance = 0 + var/addiction_stage = 1 + var/last_addiction_dose = 0 + var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. + var/current_cycle = 1 + var/drink_icon = "glass_brown" // what icon state/name/description a drinking glass will use if this is the master reagent. + var/drink_name = "Glass of ..what?" + var/drink_desc = "You can't really tell what this is." + +/datum/reagent/Destroy() + . = ..() + holder = null /datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. if(holder) //for catching rare runtimes @@ -61,20 +78,78 @@ /datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect return -// Called when two reagents of the same are mixing. -/datum/reagent/proc/on_merge(data) +// Called when this reagent is removed while inside a mob +/datum/reagent/proc/on_mob_delete(mob/living/M) return /datum/reagent/proc/on_move(mob/M) return -/datum/reagent/proc/on_update(atom/A) - return - // Called after add_reagents creates a new reagent. /datum/reagent/proc/on_new(data) return -/datum/reagent/Destroy() - . = ..() - holder = null \ No newline at end of file +// Called when two reagents of the same are mixing. +/datum/reagent/proc/on_merge(data) + return + +/datum/reagent/proc/on_update(atom/A) + return + +// Called every time reagent containers process. +/datum/reagent/proc/on_tick(data) + return + +// Called when the reagent container is hit by an explosion +/datum/reagent/proc/on_ex_act(severity) + return + +// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects +/datum/reagent/proc/overdose_process(mob/living/M, severity) + var/effect = rand(1, 100) - severity + if(effect <= 8) + M.adjustToxLoss(severity) + return effect + +/datum/reagent/proc/overdose_start(mob/living/M) + return + +/datum/reagent/proc/addiction_act_stage1(mob/living/M) + return + +/datum/reagent/proc/addiction_act_stage2(mob/living/M) + if(prob(8)) + M.emote("shiver") + if(prob(8)) + M.emote("sneeze") + if(prob(4)) + to_chat(M, "You feel a dull headache.") + +/datum/reagent/proc/addiction_act_stage3(mob/living/M) + if(prob(8)) + M.emote("twitch_s") + if(prob(8)) + M.emote("shiver") + if(prob(4)) + to_chat(M, "You begin craving [name]!") + +/datum/reagent/proc/addiction_act_stage4(mob/living/M) + if(prob(8)) + M.emote("twitch") + if(prob(4)) + to_chat(M, "You have the strong urge for some [name]!") + if(prob(4)) + to_chat(M, "You REALLY crave some [name]!") + +/datum/reagent/proc/addiction_act_stage5(mob/living/M) + if(prob(8)) + M.emote("twitch") + if(prob(6)) + to_chat(M, "Your stomach lurches painfully!") + M.visible_message("[M] gags and retches!") + M.Stun(rand(2,4)) + M.Weaken(rand(2,4)) + if(prob(5)) + to_chat(M, "You feel like you can't live without [name]!") + if(prob(5)) + to_chat(M, "You would DIE for some [name] right now!") \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm new file mode 100644 index 00000000000..a915ef8cd57 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/admin.dm @@ -0,0 +1,61 @@ +/datum/reagent/medicine/adminordrazine //An OP chemical for admins + name = "Adminordrazine" + id = "adminordrazine" + description = "It's magic. We don't have to explain it." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds! + admin_only = 1 + can_synth = 0 + +/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M) + M.setCloneLoss(0) + M.setOxyLoss(0) + M.radiation = 0 + M.adjustBruteLoss(-5) + M.adjustFireLoss(-5) + M.adjustToxLoss(-5) + M.setBrainLoss(0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + for(var/name in H.internal_organs) + var/obj/item/organ/internal/I = H.get_int_organ(name) + I.damage = max(0, I.damage-5) + for(var/obj/item/organ/external/E in H.organs) + if(E.mend_fracture()) + E.perma_injury = 0 + M.SetEyeBlind(0) + M.CureNearsighted() + M.CureBlind() + M.CureMute() + M.CureDeaf() + M.CureEpilepsy() + M.CureTourettes() + M.CureCoughing() + M.CureNervous() + M.SetEyeBlurry(0) + M.SetWeakened(0) + M.SetStunned(0) + M.SetParalysis(0) + M.SetSilence(0) + M.SetHallucinate(0) + M.SetDizzy(0) + M.SetDrowsy(0) + M.SetStuttering(0) + M.SetSlur(0) + M.SetConfused(0) + M.SetSleeping(0) + M.SetJitter(0) + for(var/datum/disease/D in M.viruses) + if(D.severity == NONTHREAT) + continue + D.spread_text = "Remissive" + D.stage-- + if(D.stage < 1) + D.cure() + ..() + +/datum/reagent/medicine/adminordrazine/nanites + name = "Nanites" + id = "nanites" + description = "Nanomachines that aid in rapid cellular regeneration." \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm new file mode 100644 index 00000000000..536385d7614 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -0,0 +1,1116 @@ +//ALCOHOL WOO +/datum/reagent/consumable/ethanol + name = "Ethanol" //Parent class for all alcoholic reagents. + id = "ethanol" + description = "A well-known alcohol with a variety of applications." + reagent_state = LIQUID + nutriment_factor = 0 //So alcohol can fill you up! If they want to. + color = "#404030" // rgb: 64, 64, 48 + can_grow_in_plants = 0 //Alcoholic drinks won't be grown in plants (would "water down" random seed chems too much) + var/dizzy_adj = 3 + var/alcohol_perc = 1 //percentage of ethanol in a beverage 0.0 - 1.0 + +/datum/reagent/consumable/ethanol/on_mob_life(mob/living/M) + M.AdjustDrunk(alcohol_perc) + M.AdjustDizzy(dizzy_adj) + ..() + +/datum/reagent/consumable/ethanol/reaction_obj(obj/O, volume) + if(istype(O,/obj/item/weapon/paper)) + var/obj/item/weapon/paper/paperaffected = O + paperaffected.clearpaper() + to_chat(usr, "The solution melts away the ink on the paper.") + if(istype(O,/obj/item/weapon/book)) + if(volume >= 5) + var/obj/item/weapon/book/affectedbook = O + affectedbook.dat = null + to_chat(usr, "The solution melts away the ink on the book.") + else + to_chat(usr, "It wasn't enough...") + +/datum/reagent/consumable/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel. + if(method == TOUCH) + M.adjust_fire_stacks(volume / 15) + + +/datum/reagent/consumable/ethanol/beer + name = "Beer" + id = "beer" + description = "An alcoholic beverage made from malted grains, hops, yeast, and water." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon ="beerglass" + drink_name = "Beer glass" + drink_desc = "A freezing pint of beer" + +/datum/reagent/consumable/ethanol/cider + name = "Cider" + id = "cider" + description = "An alcoholic beverage derived from apples." + color = "#174116" + alcohol_perc = 0.2 + drink_icon = "rewriter" + drink_name = "Cider" + drink_desc = "a refreshing glass of traditional cider" + +/datum/reagent/consumable/ethanol/whiskey + name = "Whiskey" + id = "whiskey" + description = "A superb and well-aged single-malt whiskey. Damn." + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 4 + alcohol_perc = 0.4 + drink_icon = "whiskeyglass" + drink_name = "Glass of whiskey" + drink_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + +/datum/reagent/consumable/ethanol/specialwhiskey + name = "Special Blend Whiskey" + id = "specialwhiskey" + description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + +/datum/reagent/consumable/ethanol/gin + name = "Gin" + id = "gin" + description = "It's gin. In space. I say, good sir." + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 3 + alcohol_perc = 0.5 + drink_icon = "ginvodkaglass" + drink_name = "Glass of gin" + drink_desc = "A crystal clear glass of Griffeater gin." + +/datum/reagent/consumable/ethanol/absinthe + name = "Absinthe" + id = "absinthe" + description = "Watch out that the Green Fairy doesn't come for you!" + color = "#33EE00" // rgb: lots, ??, ?? + overdose_threshold = 30 + dizzy_adj = 5 + alcohol_perc = 0.7 + drink_icon = "absinthebottle" + drink_name = "Glass of Absinthe" + drink_desc = "The green fairy is going to get you now!" + +//copy paste from LSD... shoot me +/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/M) + M.AdjustHallucinate(5) + ..() + +/datum/reagent/consumable/ethanol/absinthe/overdose_process(mob/living/M, severity) + M.adjustToxLoss(1) + +/datum/reagent/consumable/ethanol/rum + name = "Rum" + id = "rum" + description = "Popular with the sailors. Not very popular with everyone else." + color = "#664300" // rgb: 102, 67, 0 + overdose_threshold = 30 + alcohol_perc = 0.4 + dizzy_adj = 5 + drink_icon = "rumglass" + drink_name = "Glass of Rum" + drink_desc = "Now you want to Pray for a pirate suit, don't you?" + +/datum/reagent/consumable/ethanol/rum/overdose_process(mob/living/M, severity) + M.adjustToxLoss(1) + +/datum/reagent/consumable/ethanol/mojito + name = "Mojito" + id = "mojito" + description = "If it's good enough for Spesscuba, it's good enough for you." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "mojito" + drink_name = "Glass of Mojito" + drink_desc = "Fresh from Spesscuba." + +/datum/reagent/consumable/ethanol/vodka + name = "Vodka" + id = "vodka" + description = "Number one drink AND fueling choice for Russians worldwide." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "ginvodkaglass" + drink_name = "Glass of vodka" + drink_desc = "The glass contain wodka. Xynta." + +/datum/reagent/consumable/ethanol/sake + name = "Sake" + id = "sake" + description = "Anime's favorite drink." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "ginvodkaglass" + drink_name = "Glass of Sake" + drink_desc = "A glass of Sake." + +/datum/reagent/consumable/ethanol/tequila + name = "Tequila" + id = "tequila" + description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" + color = "#A8B0B7" // rgb: 168, 176, 183 + alcohol_perc = 0.4 + drink_icon = "tequilaglass" + drink_name = "Glass of Tequila" + drink_desc = "Now all that's missing is the weird colored shades!" + +/datum/reagent/consumable/ethanol/vermouth + name = "Vermouth" + id = "vermouth" + description = "You suddenly feel a craving for a martini..." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "vermouthglass" + drink_name = "Glass of Vermouth" + drink_desc = "You wonder why you're even drinking this straight." + +/datum/reagent/consumable/ethanol/wine + name = "Wine" + id = "wine" + description = "An premium alchoholic beverage made from distilled grape juice." + color = "#7E4043" // rgb: 126, 64, 67 + dizzy_adj = 2 + alcohol_perc = 0.2 + drink_icon = "wineglass" + drink_name = "Glass of wine" + drink_desc = "A very classy looking drink." + +/datum/reagent/consumable/ethanol/cognac + name = "Cognac" + id = "cognac" + description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 4 + alcohol_perc = 0.4 + drink_icon = "cognacglass" + drink_name = "Glass of cognac" + drink_desc = "Damn, you feel like some kind of French aristocrat just by holding this." + +/datum/reagent/consumable/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning". + name = "Suicider" + id = "suicider" + description = "An unbelievably strong and potent variety of Cider." + color = "#CF3811" + dizzy_adj = 20 + alcohol_perc = 1 //because that's a thing it's supposed to do, I guess + drink_icon = "suicider" + drink_name = "Suicider" + drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + +/datum/reagent/consumable/ethanol/ale + name = "Ale" + id = "ale" + description = "A dark alchoholic beverage made by malted barley and yeast." + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.1 + drink_icon = "aleglass" + drink_name = "Ale glass" + drink_desc = "A freezing pint of delicious Ale" + +/datum/reagent/consumable/ethanol/thirteenloko + name = "Thirteen Loko" + id = "thirteenloko" + description = "A potent mixture of caffeine and alcohol." + reagent_state = LIQUID + color = "#102000" // rgb: 16, 32, 0 + alcohol_perc = 0.3 + heart_rate_increase = 1 + drink_icon = "thirteen_loko_glass" + drink_name = "Glass of Thirteen Loko" + drink_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" + +/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/M) + M.AdjustDrowsy(-7) + M.AdjustSleeping(-2) + if(M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + M.Jitter(5) + ..() + + +/////////////////////////////////////////////////////////////////cocktail entities////////////////////////////////////////////// + +/datum/reagent/consumable/ethanol/bilk + name = "Bilk" + id = "bilk" + description = "This appears to be beer mixed with milk. Disgusting." + reagent_state = LIQUID + color = "#895C4C" // rgb: 137, 92, 76 + alcohol_perc = 0.2 + drink_icon = "glass_brown" + drink_name = "Glass of bilk" + drink_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + +/datum/reagent/consumable/ethanol/atomicbomb + name = "Atomic Bomb" + id = "atomicbomb" + description = "Nuclear proliferation never tasted so good." + reagent_state = LIQUID + color = "#666300" // rgb: 102, 99, 0 + alcohol_perc = 0.2 + drink_icon = "atomicbombglass" + drink_name = "Atomic Bomb" + drink_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + +/datum/reagent/consumable/ethanol/threemileisland + name = "THree Mile Island Iced Tea" + id = "threemileisland" + description = "Made for a woman, strong enough for a man." + reagent_state = LIQUID + color = "#666340" // rgb: 102, 99, 64 + alcohol_perc = 0.2 + drink_icon = "threemileislandglass" + drink_name = "Three Mile Island Ice Tea" + drink_desc = "A glass of this is sure to prevent a meltdown." + +/datum/reagent/consumable/ethanol/goldschlager + name = "Goldschlager" + id = "goldschlager" + description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "ginvodkaglass" + drink_name = "Glass of goldschlager" + drink_desc = "100 proof that teen girls will drink anything with gold in it." + +/datum/reagent/consumable/ethanol/patron + name = "Patron" + id = "patron" + description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." + reagent_state = LIQUID + color = "#585840" // rgb: 88, 88, 64 + alcohol_perc = 0.4 + drink_icon = "patronglass" + drink_name = "Glass of Patron" + drink_desc = "Drinking patron in the bar, with all the subpar ladies." + +/datum/reagent/consumable/ethanol/gintonic + name = "Gin and Tonic" + id = "gintonic" + description = "An all time classic, mild cocktail." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "gintonicglass" + drink_name = "Gin and Tonic" + drink_desc = "A mild but still great cocktail. Drink up, like a true Englishman." + +/datum/reagent/consumable/ethanol/cuba_libre + name = "Cuba Libre" + id = "cubalibre" + description = "Rum, mixed with cola. Viva la revolution." + reagent_state = LIQUID + color = "#3E1B00" // rgb: 62, 27, 0 + alcohol_perc = 0.2 + drink_icon = "cubalibreglass" + drink_name = "Cuba Libre" + drink_desc = "A classic mix of rum and cola." + +/datum/reagent/consumable/ethanol/whiskey_cola + name = "Whiskey Cola" + id = "whiskeycola" + description = "Whiskey, mixed with cola. Surprisingly refreshing." + reagent_state = LIQUID + color = "#3E1B00" // rgb: 62, 27, 0 + alcohol_perc = 0.3 + drink_icon = "whiskeycolaglass" + drink_name = "Whiskey Cola" + drink_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + +/datum/reagent/consumable/ethanol/martini + name = "Classic Martini" + id = "martini" + description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + drink_icon = "martiniglass" + drink_name = "Classic Martini" + drink_desc = "Damn, the bartender even stirred it, not shook it." + +/datum/reagent/consumable/ethanol/vodkamartini + name = "Vodka Martini" + id = "vodkamartini" + description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "martiniglass" + drink_name = "Vodka martini" + drink_desc ="A bastardisation of the classic martini. Still great." + +/datum/reagent/consumable/ethanol/white_russian + name = "White Russian" + id = "whiterussian" + description = "That's just, like, your opinion, man..." + reagent_state = LIQUID + color = "#A68340" // rgb: 166, 131, 64 + alcohol_perc = 0.3 + drink_icon = "whiterussianglass" + drink_name = "White Russian" + drink_desc = "A very nice looking drink. But that's just, like, your opinion, man." + +/datum/reagent/consumable/ethanol/screwdrivercocktail + name = "Screwdriver" + id = "screwdrivercocktail" + description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." + reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + alcohol_perc = 0.3 + drink_icon = "screwdriverglass" + drink_name = "Screwdriver" + drink_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + +/datum/reagent/consumable/ethanol/booger + name = "Booger" + id = "booger" + description = "Ewww..." + reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + alcohol_perc = 0.2 + drink_icon = "booger" + drink_name = "Booger" + drink_desc = "Ewww..." + +/datum/reagent/consumable/ethanol/bloody_mary + name = "Bloody Mary" + id = "bloodymary" + description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "bloodymaryglass" + drink_name = "Bloody Mary" + drink_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + +/datum/reagent/consumable/ethanol/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + id = "gargleblaster" + description = "Whoah, this stuff looks volatile!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.7 //ouch + drink_icon = "gargleblasterglass" + drink_name = "Pan-Galactic Gargle Blaster" + drink_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + +/datum/reagent/consumable/ethanol/brave_bull + name = "Brave Bull" + id = "bravebull" + description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "bravebullglass" + drink_name = "Brave Bull" + drink_desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up." + +/datum/reagent/consumable/ethanol/tequila_sunrise + name = "Tequila Sunrise" + id = "tequilasunrise" + description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "tequilasunriseglass" + drink_name = "Tequila Sunrise" + drink_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + +/datum/reagent/consumable/ethanol/toxins_special + name = "Toxins Special" + id = "toxinsspecial" + description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + drink_icon = "toxinsspecialglass" + drink_name = "Toxins Special" + drink_desc = "Whoah, this thing is on FIRE" + +/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/M) + if(M.bodytemperature < 330) + M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + +/datum/reagent/consumable/ethanol/beepsky_smash + name = "Beepsky Smash" + id = "beepskysmash" + description = "Deny drinking this and prepare for THE LAW." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + drink_icon = "beepskysmashglass" + drink_name = "Beepsky Smash" + drink_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/M) + M.Stun(1) + ..() + +/datum/reagent/consumable/ethanol/irish_cream + name = "Irish Cream" + id = "irishcream" + description = "Whiskey-imbued cream, what else would you expect from the Irish." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "irishcreamglass" + drink_name = "Irish Cream" + drink_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + +/datum/reagent/consumable/ethanol/manly_dorf + name = "The Manly Dorf" + id = "manlydorf" + description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "manlydorfglass" + drink_name = "The Manly Dorf" + drink_desc = "A manly concotion made from Ale and Beer. Intended for true men only." + +/datum/reagent/consumable/ethanol/longislandicedtea + name = "Long Island Iced Tea" + id = "longislandicedtea" + description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + drink_icon = "longislandicedteaglass" + drink_name = "Long Island Iced Tea" + drink_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + +/datum/reagent/consumable/ethanol/moonshine + name = "Moonshine" + id = "moonshine" + description = "You've really hit rock bottom now... your liver packed its bags and left last night." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.8 //yeeehaw + drink_icon = "glass_clear" + drink_name = "Moonshine" + drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + +/datum/reagent/consumable/ethanol/b52 + name = "B-52" + id = "b52" + description = "Coffee, Irish Cream, and congac. You will get bombed." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "b52glass" + drink_name = "B-52" + drink_desc = "Kahlua, Irish Cream, and congac. You will get bombed." + +/datum/reagent/consumable/ethanol/irishcoffee + name = "Irish Coffee" + id = "irishcoffee" + description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "irishcoffeeglass" + drink_name = "Irish Coffee" + drink_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + +/datum/reagent/consumable/ethanol/margarita + name = "Margarita" + id = "margarita" + description = "On the rocks with salt on the rim. Arriba~!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "margaritaglass" + drink_name = "Margarita" + drink_desc = "On the rocks with salt on the rim. Arriba~!" + +/datum/reagent/consumable/ethanol/black_russian + name = "Black Russian" + id = "blackrussian" + description = "For the lactose-intolerant. Still as classy as a White Russian." + reagent_state = LIQUID + color = "#360000" // rgb: 54, 0, 0 + alcohol_perc = 0.4 + drink_icon = "blackrussianglass" + drink_name = "Black Russian" + drink_desc = "For the lactose-intolerant. Still as classy as a White Russian." + +/datum/reagent/consumable/ethanol/manhattan + name = "Manhattan" + id = "manhattan" + description = "The Detective's undercover drink of choice. He never could stomach gin..." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "manhattanglass" + drink_name = "Manhattan" + drink_desc = "The Detective's undercover drink of choice. He never could stomach gin..." + +/datum/reagent/consumable/ethanol/manhattan_proj + name = "Manhattan Project" + id = "manhattan_proj" + description = "A scienitst's drink of choice, for pondering ways to blow up the station." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "proj_manhattanglass" + drink_name = "Manhattan Project" + drink_desc = "A scienitst drink of choice, for thinking how to blow up the station." + +/datum/reagent/consumable/ethanol/whiskeysoda + name = "Whiskey Soda" + id = "whiskeysoda" + description = "Ultimate refreshment." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "whiskeysodaglass2" + drink_name = "Whiskey Soda" + drink_desc = "Ultimate refreshment." + +/datum/reagent/consumable/ethanol/antifreeze + name = "Anti-freeze" + id = "antifreeze" + description = "Ultimate refreshment." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "antifreeze" + drink_name = "Anti-freeze" + drink_desc = "The ultimate refreshment." + +/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/M) + if(M.bodytemperature < 330) + M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + +/datum/reagent/consumable/ethanol/barefoot + name = "Barefoot" + id = "barefoot" + description = "Barefoot and pregnant" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "b&p" + drink_name = "Barefoot" + drink_desc = "Barefoot and pregnant" + +/datum/reagent/consumable/ethanol/snowwhite + name = "Snow White" + id = "snowwhite" + description = "A cold refreshment" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "snowwhite" + drink_name = "Snow White" + drink_desc = "A cold refreshment." + +/datum/reagent/consumable/ethanol/demonsblood + name = "Demons Blood" + id = "demonsblood" + description = "AHHHH!!!!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 10 + alcohol_perc = 0.4 + drink_icon = "demonsblood" + drink_name = "Demons Blood" + drink_desc = "Just looking at this thing makes the hair at the back of your neck stand up." + +/datum/reagent/consumable/ethanol/vodkatonic + name = "Vodka and Tonic" + id = "vodkatonic" + description = "For when a gin and tonic isn't russian enough." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 4 + alcohol_perc = 0.3 + drink_icon = "vodkatonicglass" + drink_name = "Vodka and Tonic" + drink_desc = "For when a gin and tonic isn't russian enough." + +/datum/reagent/consumable/ethanol/ginfizz + name = "Gin Fizz" + id = "ginfizz" + description = "Refreshingly lemony, deliciously dry." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 4 + alcohol_perc = 0.4 + drink_icon = "ginfizzglass" + drink_name = "Gin Fizz" + drink_desc = "Refreshingly lemony, deliciously dry." + +/datum/reagent/consumable/ethanol/bahama_mama + name = "Bahama mama" + id = "bahama_mama" + description = "Tropic cocktail." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "bahama_mama" + drink_name = "Bahama Mama" + drink_desc = "Tropic cocktail" + +/datum/reagent/consumable/ethanol/singulo + name = "Singulo" + id = "singulo" + description = "A blue-space beverage!" + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + dizzy_adj = 15 + alcohol_perc = 0.7 + drink_icon = "singulo" + drink_name = "Singulo" + drink_desc = "A blue-space beverage." + +/datum/reagent/consumable/ethanol/sbiten + name = "Sbiten" + id = "sbiten" + description = "A spicy Vodka! Might be a little hot for the little guys!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "sbitenglass" + drink_name = "Sbiten" + drink_desc = "A spicy mix of Vodka and Spice. Very hot." + +/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M) + if(M.bodytemperature < 360) + M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + +/datum/reagent/consumable/ethanol/devilskiss + name = "Devils Kiss" + id = "devilskiss" + description = "Creepy time!" + reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + alcohol_perc = 0.3 + drink_icon = "devilskiss" + drink_name = "Devils Kiss" + drink_desc = "Creepy time!" + +/datum/reagent/consumable/ethanol/red_mead + name = "Red Mead" + id = "red_mead" + description = "The true Viking drink! Even though it has a strange red color." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "red_meadglass" + drink_name = "Red Mead" + drink_desc = "A True Vikings Beverage, though its color is strange." + +/datum/reagent/consumable/ethanol/mead + name = "Mead" + id = "mead" + description = "A Vikings drink, though a cheap one." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "meadglass" + drink_name = "Mead" + drink_desc = "A Vikings Beverage, though a cheap one." + +/datum/reagent/consumable/ethanol/iced_beer + name = "Iced Beer" + id = "iced_beer" + description = "A beer which is so cold the air around it freezes." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "iced_beerglass" + drink_name = "Iced Beer" + drink_desc = "A beer so frosty, the air around it freezes." + +/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M) + if(M.bodytemperature > 270) + M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + +/datum/reagent/consumable/ethanol/grog + name = "Grog" + id = "grog" + description = "Watered down rum, Nanotrasen approves!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "grogglass" + drink_name = "Grog" + drink_desc = "A fine and cepa drink for Space." + +/datum/reagent/consumable/ethanol/aloe + name = "Aloe" + id = "aloe" + description = "So very, very, very good." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "aloe" + drink_name = "Aloe" + drink_desc = "Very, very, very good." + +/datum/reagent/consumable/ethanol/andalusia + name = "Andalusia" + id = "andalusia" + description = "A nice, strange named drink." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.4 + drink_icon = "andalusia" + drink_name = "Andalusia" + drink_desc = "A nice, strange named drink." + +/datum/reagent/consumable/ethanol/alliescocktail + name = "Allies Cocktail" + id = "alliescocktail" + description = "A drink made from your allies." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.5 + drink_icon = "alliescocktail" + drink_name = "Allies cocktail" + drink_desc = "A drink made from your allies." + +/datum/reagent/consumable/ethanol/acid_spit + name = "Acid Spit" + id = "acidspit" + description = "A drink by Nanotrasen. Made from live aliens." + reagent_state = LIQUID + color = "#365000" // rgb: 54, 80, 0 + alcohol_perc = 0.3 + drink_icon = "acidspitglass" + drink_name = "Acid Spit" + drink_desc = "A drink from Nanotrasen. Made from live aliens." + +/datum/reagent/consumable/ethanol/amasec + name = "Amasec" + id = "amasec" + description = "Official drink of the Imperium." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.3 + drink_icon = "amasecglass" + drink_name = "Amasec" + drink_desc = "Always handy before COMBAT!!!" + +/datum/reagent/consumable/ethanol/neurotoxin + name = "Neuro-toxin" + id = "neurotoxin" + description = "A strong neurotoxin that puts the subject into a death-like state." + reagent_state = LIQUID + color = "#2E2E61" // rgb: 46, 46, 97 + dizzy_adj = 6 + alcohol_perc = 0.7 + heart_rate_decrease = 1 + drink_icon = "neurotoxinglass" + drink_name = "Neurotoxin" + drink_desc = "A drink that is guaranteed to knock you silly." + +/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/M) + M.Weaken(3) + if(current_cycle >=55) + M.Druggy(55) + if(current_cycle >=200) + M.adjustToxLoss(2) + ..() + +/datum/reagent/consumable/ethanol/hippies_delight + name = "Hippie's Delight" + id = "hippiesdelight" + description = "You just don't get it maaaan." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + metabolization_rate = 0.2 * REAGENTS_METABOLISM + drink_icon = "hippiesdelightglass" + drink_name = "Hippie's Delight" + drink_desc = "A drink enjoyed by people during the 1960's." + +/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/M) + M.Druggy(50) + switch(current_cycle) + if(1 to 5) + if(!M.stuttering) M.stuttering = 1 + M.Dizzy(10) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(5 to 10) + if(!M.stuttering) M.stuttering = 1 + M.Jitter(20) + M.Dizzy(20) + M.Druggy(45) + if(prob(20)) M.emote(pick("twitch","giggle")) + if(10 to INFINITY) + if(!M.stuttering) M.stuttering = 1 + M.Jitter(40) + M.Dizzy(40) + M.Druggy(60) + if(prob(30)) M.emote(pick("twitch","giggle")) + ..() + +/datum/reagent/consumable/ethanol/changelingsting + name = "Changeling Sting" + id = "changelingsting" + description = "A stingy drink." + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + alcohol_perc = 0.7 + dizzy_adj = 5 + drink_icon = "changelingsting" + drink_name = "Changeling Sting" + drink_desc = "A stingy drink." + +/datum/reagent/consumable/ethanol/irishcarbomb + name = "Irish Car Bomb" + id = "irishcarbomb" + description = "Mmm, tastes like chocolate cake..." + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + alcohol_perc = 0.3 + dizzy_adj = 5 + drink_icon = "irishcarbomb" + drink_name = "Irish Car Bomb" + drink_desc = "An irish car bomb." + +/datum/reagent/consumable/ethanol/syndicatebomb + name = "Syndicate Bomb" + id = "syndicatebomb" + description = "A Syndicate bomb" + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + alcohol_perc = 0.2 + drink_icon = "syndicatebomb" + drink_name = "Syndicate Bomb" + drink_desc = "A syndicate bomb." + +/datum/reagent/consumable/ethanol/erikasurprise + name = "Erika Surprise" + id = "erikasurprise" + description = "The surprise is, it's green!" + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + alcohol_perc = 0.2 + drink_icon = "erikasurprise" + name = "Erika Surprise" + drink_desc = "The surprise is, it's green!" + +/datum/reagent/consumable/ethanol/driestmartini + name = "Driest Martini" + id = "driestmartini" + description = "Only for the experienced. You think you see sand floating in the glass." + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#2E6671" // rgb: 46, 102, 113 + alcohol_perc = 0.5 + dizzy_adj = 10 + drink_icon = "driestmartiniglass" + drink_name = "Driest Martini" + drink_desc = "Only for the experienced. You think you see sand floating in the glass." + +/datum/reagent/consumable/ethanol/driestmartini/on_mob_life(mob/living/M) + if(current_cycle >= 55 && current_cycle < 115) + M.stuttering += 10 + ..() + +/datum/reagent/consumable/ethanol/kahlua + name = "Kahlua" + id = "kahlua" + description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + color = "#664300" // rgb: 102, 67, 0 + alcohol_perc = 0.2 + drink_icon = "kahluaglass" + drink_name = "Glass of RR coffee Liquor" + drink_desc = "DAMN, THIS THING LOOKS ROBUST" + +/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/M) + M.AdjustDizzy(-5) + M.AdjustDrowsy(-3) + M.AdjustSleeping(-2) + M.Jitter(5) + ..() + +/datum/reagent/ginsonic + name = "Gin and sonic" + id = "ginsonic" + description = "GOTTA GET CRUNK FAST BUT LIQUOR TOO SLOW" + reagent_state = LIQUID + color = "#1111CF" + drink_icon = "ginsonic" + drink_name = "Gin and Sonic" + drink_desc = "An extremely high amperage drink. Absolutely not for the true Englishman." + +/datum/reagent/ginsonic/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) + if(prob(25)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + if(prob(8)) + M.reagents.add_reagent("methamphetamine",1.2) + var/sonic_message = pick("Gotta go fast!", "Time to speed, keed!", "I feel a need for speed!", "Let's juice.", "Juice time.", "Way Past Cool!") + if(prob(50)) + M.say("[sonic_message]") + else + to_chat(M, "[sonic_message ]") + ..() + +/datum/reagent/consumable/ethanol/applejack + name = "Applejack" + id = "applejack" + description = "A highly concentrated alcoholic beverage made by repeatedly freezing cider and removing the ice." + color = "#997A00" + alcohol_perc = 0.4 + drink_icon = "cognacglass" + drink_name = "Glass of applejack" + drink_desc = "When cider isn't strong enough, you gotta jack it." + +/datum/reagent/consumable/ethanol/jackrose + name = "Jack Rose" + id = "jackrose" + description = "A classic cocktail that had fallen out of fashion, but never out of taste," + color = "#664300" + alcohol_perc = 0.4 + drink_icon = "patronglass" + drink_name = "Jack Rose" + drink_desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." + +/datum/reagent/consumable/ethanol/dragons_breath //inaccessible to players, but here for admin shennanigans + name = "Dragon's Breath" + id = "dragonsbreath" + description = "Possessing this stuff probably breaks the Geneva convention." + reagent_state = LIQUID + color = "#DC0000" + alcohol_perc = 1 + can_synth = 0 + +/datum/reagent/consumable/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST && prob(20)) + if(M.on_fire) + M.adjust_fire_stacks(3) + +/datum/reagent/consumable/ethanol/dragons_breath/on_mob_life(mob/living/M) + if(M.reagents.has_reagent("milk")) + to_chat(M, "The milk stops the burning. Ahhh.") + M.reagents.del_reagent("milk") + M.reagents.del_reagent("dragonsbreath") + return + if(prob(8)) + to_chat(M, "Oh god! Oh GODD!!") + if(prob(50)) + to_chat(M, "Your throat burns terribly!") + M.emote(pick("scream","cry","choke","gasp")) + M.Stun(1) + if(prob(8)) + to_chat(M, "Why!? WHY!?") + if(prob(8)) + to_chat(M, "ARGHHHH!") + if(prob(2 * volume)) + to_chat(M, "OH GOD OH GOD PLEASE NO!!
") + if(M.on_fire) + M.adjust_fire_stacks(5) + if(prob(50)) + to_chat(M, "IT BURNS!!!!") + M.visible_message("[M] is consumed in flames!") + M.dust() + return + ..() + +// ROBOT ALCOHOL PAST THIS POINT +// WOOO! + +/datum/reagent/consumable/ethanol/synthanol + name = "Synthanol" + id = "synthanol" + description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics." + reagent_state = LIQUID + color = "#1BB1FF" + process_flags = ORGANIC | SYNTHETIC + alcohol_perc = 0.5 + drink_icon = "synthanolglass" + drink_name = "Glass of Synthanol" + drink_desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." + +/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/M) + if(!M.isSynthetic()) + holder.remove_reagent(id, 3.6) //gets removed from organics very fast + if(prob(25)) + holder.remove_reagent(id, 15) + M.fakevomit() + ..() + +/datum/reagent/consumable/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume) + if(M.isSynthetic()) + return + if(method == INGEST) + to_chat(M, pick("That was awful!", "Yuck!")) + +/datum/reagent/consumable/ethanol/synthanol/robottears + name = "Robot Tears" + id = "robottears" + description = "An oily substance that an IPC could technically consider a 'drink'." + reagent_state = LIQUID + color = "#363636" + alcohol_perc = 0.25 + drink_icon = "robottearsglass" + drink_name = "Glass of Robot Tears" + drink_desc = "No robots were hurt in the making of this drink." + +/datum/reagent/consumable/ethanol/synthanol/trinary + name = "Trinary" + id = "trinary" + description = "A fruit drink meant only for synthetics, however that works." + reagent_state = LIQUID + color = "#adb21f" + alcohol_perc = 0.2 + drink_icon = "trinaryglass" + drink_name = "Glass of Trinary" + drink_desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." + +/datum/reagent/consumable/ethanol/synthanol/servo + name = "Servo" + id = "servo" + description = "A drink containing some organic ingredients, but meant only for synthetics." + reagent_state = LIQUID + color = "#5b3210" + alcohol_perc = 0.25 + drink_icon = "servoglass" + drink_name = "Glass of Servo" + drink_desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." + +/datum/reagent/consumable/ethanol/synthanol/uplink + name = "Uplink" + id = "uplink" + description = "A potent mix of alcohol and synthanol. Will only work on synthetics." + reagent_state = LIQUID + color = "#e7ae04" + alcohol_perc = 0.15 + drink_icon = "uplinkglass" + drink_name = "Glass of Uplink" + drink_desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." + +/datum/reagent/consumable/ethanol/synthanol/synthnsoda + name = "Synth 'n Soda" + id = "synthnsoda" + description = "The classic drink adjusted for a robot's tastes." + reagent_state = LIQUID + color = "#7204e7" + alcohol_perc = 0.25 + drink_icon = "synthnsodaglass" + drink_name = "Glass of Synth 'n Soda" + drink_desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." + +/datum/reagent/consumable/ethanol/synthanol/synthignon + name = "Synthignon" + id = "synthignon" + description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself." + reagent_state = LIQUID + color = "#d004e7" + alcohol_perc = 0.25 + drink_icon = "synthignonglass" + drink_name = "Glass of Synthignon" + drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." \ No newline at end of file diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/chemistry/reagents/blob.dm similarity index 97% rename from code/modules/reagents/newchem/Blob-Reagents.dm rename to code/modules/reagents/chemistry/reagents/blob.dm index fa5e9747e34..895922c7542 100644 --- a/code/modules/reagents/newchem/Blob-Reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -4,6 +4,7 @@ description = "" var/message = "The blob strikes you" //message sent to any mob hit by the blob var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt + can_synth = 0 /datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, volume, show_message, touch_protection) return round(volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume. @@ -61,7 +62,7 @@ volume = ..() M.apply_damage(0.4*volume, BRUTE) M.apply_damage(1*volume, OXY) - M.losebreath += round(0.3*volume) + M.AdjustLoseBreath(round(0.3*volume)) /datum/reagent/blob/kinetic //does semi-random brute damage @@ -149,4 +150,4 @@ if(message_living && !issilicon(M)) totalmessage += message_living totalmessage += "!" - to_chat(M, "[totalmessage]") + to_chat(M, "[totalmessage]") \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm new file mode 100644 index 00000000000..f9fbf930e3e --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -0,0 +1,186 @@ +/datum/reagent/spider_eggs + name = "spider eggs" + id = "spidereggs" + description = "A fine dust containing spider eggs. Oh gosh." + reagent_state = SOLID + color = "#FFFFFF" + can_synth = 0 + +/datum/reagent/spider_eggs/on_mob_life(mob/living/M) + if(volume > 2.5) + if(iscarbon(M)) + if(!M.get_int_organ(/obj/item/organ/internal/body_egg)) + new/obj/item/organ/internal/body_egg/spider_eggs(M) //Yes, even Xenos can fall victim to the plague that is spider infestation. + ..() + + +/datum/reagent/nanomachines + name = "Nanomachines" + id = "nanomachines" + description = "Microscopic construction robots." + color = "#535E66" // rgb: 83, 94, 102 + can_synth = 0 + +/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M) + if(volume > 1.5) + M.ForceContractDisease(new /datum/disease/transformation/robot(0)) + ..() + + +/datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + color = "#535E66" // rgb: 83, 94, 102 + can_synth = 0 + +/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M) + if(volume > 1.5) + M.ContractDisease(new /datum/disease/transformation/xeno(0)) + ..() + +/datum/reagent/fungalspores + name = "Tubercle bacillus Cosmosis microbes" + id = "fungalspores" + description = "Active fungal spores." + color = "#92D17D" // rgb: 146, 209, 125 + can_synth = 0 + +/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M) + if(volume > 2.5) + M.ForceContractDisease(new /datum/disease/tuberculosis(0)) + ..() + +/datum/reagent/jagged_crystals + name = "Jagged Crystals" + id = "jagged_crystals" + description = "Rapid chemical decomposition has warped these crystals into twisted spikes." + reagent_state = SOLID + color = "#FA0000" // rgb: 250, 0, 0 + can_synth = 0 + +/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M) + M.ForceContractDisease(new /datum/disease/berserker(0)) + ..() + +/datum/reagent/salmonella + name = "Salmonella" + id = "salmonella" + description = "A nasty bacteria found in spoiled food." + reagent_state = LIQUID + color = "#1E4600" + can_synth = 0 + +/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + ..() + +/datum/reagent/gibbis + name = "Gibbis" + id = "gibbis" + description = "Liquid gibbis." + reagent_state = LIQUID + color = "#FF0000" + can_synth = 0 + +/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) + if(volume > 2.5) + M.ForceContractDisease(new /datum/disease/gbs/curable(0)) + ..() + +/datum/reagent/prions + name = "Prions" + id = "prions" + description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material." + reagent_state = LIQUID + color = "#FFFFFF" + can_synth = 0 + +/datum/reagent/prions/on_mob_life(mob/living/carbon/M) + if(volume > 4.5) + M.ForceContractDisease(new /datum/disease/kuru(0)) + ..() + +/datum/reagent/grave_dust + name = "Grave Dust" + id = "grave_dust" + description = "Moldy old dust taken from a grave site." + reagent_state = LIQUID + color = "#465046" + can_synth = 0 + +/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M) + if(volume > 4.5) + M.ForceContractDisease(new /datum/disease/vampire(0)) + ..() + +/datum/reagent/heartworms + name = "Space heartworms" + id = "heartworms" + description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!" + reagent_state = SOLID + color = "#925D6C" + can_synth = 0 + +/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M) + if(volume > 4.5) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart) + if(ate_heart) + ate_heart.remove(H) + qdel(ate_heart) + ..() + +/datum/reagent/concentrated_initro + name = "Concentrated Initropidril" + id = "concentrated_initro" + description = "A guaranteed heart-stopper!" + reagent_state = LIQUID + color = "#AB1CCF" + can_synth = 0 + +/datum/reagent/concentrated_initro/on_mob_life(mob/living/M) + if(volume >=5) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.heart_attack) + H.heart_attack = 1 // rip in pepperoni + +//virus foods + +/datum/reagent/consumable/virus_food + name = "Virus Food" + id = "virusfood" + description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#899613" // rgb: 137, 150, 19 + +/datum/reagent/mutagen/mutagenvirusfood + name = "mutagenic agar" + id = "mutagenvirusfood" + description = "mutates blood" + color = "#A3C00F" // rgb: 163,192,15 + +/datum/reagent/mutagen/mutagenvirusfood/sugar + name = "sucrose agar" + id = "sugarvirusfood" + color = "#41B0C0" // rgb: 65,176,192 + +/datum/reagent/medicine/diphenhydramine/diphenhydraminevirusfood + name = "virus rations" + id = "diphenhydraminevirusfood" + description = "mutates blood" + color = "#D18AA5" // rgb: 209,138,165 + +/datum/reagent/plasma_dust/plasmavirusfood + name = "virus plasma" + id = "plasmavirusfood" + description = "mutates blood" + color = "#A69DA9" // rgb: 166,157,169 + +/datum/reagent/plasma_dust/plasmavirusfood/weak + name = "weakened virus plasma" + id = "weakplasmavirusfood" + color = "#CEC3C6" // rgb: 206,195,198 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/chemistry/reagents/drink_base.dm similarity index 73% rename from code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm rename to code/modules/reagents/chemistry/reagents/drink_base.dm index 1868489adb7..25484983a4f 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm +++ b/code/modules/reagents/chemistry/reagents/drink_base.dm @@ -1,9 +1,8 @@ -/datum/reagent/drink +/datum/reagent/consumable/drink name = "Drink" id = "drink" description = "Uh, some kind of drink." reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM color = "#E78108" // rgb: 231, 129, 8 var/adj_dizzy = 0 var/adj_drowsy = 0 @@ -11,12 +10,11 @@ var/adj_temp_hot = 0 var/adj_temp_cool = 0 -/datum/reagent/drink/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor +/datum/reagent/consumable/drink/on_mob_life(mob/living/M) if(adj_dizzy) - M.dizziness = max(0, M.dizziness + adj_dizzy) + M.AdjustDizzy(adj_dizzy) if(adj_drowsy) - M.drowsyness = max(0, M.drowsyness + adj_drowsy) + M.AdjustDrowsy(adj_drowsy) if(adj_sleepy) M.AdjustSleeping(adj_sleepy) if(adj_temp_hot) diff --git a/code/modules/reagents/chemistry/reagents/drink_cold.dm b/code/modules/reagents/chemistry/reagents/drink_cold.dm new file mode 100644 index 00000000000..ffd43a81840 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drink_cold.dm @@ -0,0 +1,163 @@ +/datum/reagent/consumable/drink/cold + name = "Cold drink" + adj_temp_cool = 5 + +/datum/reagent/consumable/drink/cold/tonic + name = "Tonic Water" + id = "tonic" + description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." + color = "#664300" // rgb: 102, 67, 0 + adj_dizzy = -5 + adj_drowsy = -3 + adj_sleepy = -2 + drink_icon = "glass_clear" + drink_name = "Glass of Tonic Water" + drink_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + +/datum/reagent/consumable/drink/cold/sodawater + name = "Soda Water" + id = "sodawater" + description = "A can of club soda. Why not make a scotch and soda?" + color = "#619494" // rgb: 97, 148, 148 + adj_dizzy = -5 + adj_drowsy = -3 + drink_icon = "glass_clear" + drink_name = "Glass of Soda Water" + drink_desc = "Soda water. Why not make a scotch and soda?" + +/datum/reagent/consumable/drink/cold/ice + name = "Ice" + id = "ice" + description = "Frozen water, your dentist wouldn't like you chewing this." + reagent_state = SOLID + color = "#619494" // rgb: 97, 148, 148 + adj_temp_cool = 0 + drink_icon = "iceglass" + drink_name = "Glass of ice" + drink_desc = "Generally, you're supposed to put something else in there too..." + +/datum/reagent/consumable/drink/cold/ice/on_mob_life(mob/living/M) + M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) + ..() + +/datum/reagent/consumable/drink/cold/space_cola + name = "Cola" + id = "cola" + description = "A refreshing beverage." + reagent_state = LIQUID + color = "#100800" // rgb: 16, 8, 0 + adj_drowsy = -5 + drink_icon = "glass_brown" + drink_name = "Glass of Space Cola" + drink_desc = "A glass of refreshing Space Cola" + +/datum/reagent/consumable/drink/cold/nuka_cola + name = "Nuka Cola" + id = "nuka_cola" + description = "Cola, cola never changes." + color = "#100800" // rgb: 16, 8, 0 + adj_sleepy = -2 + drink_icon = "nuka_colaglass" + drink_name = "Nuka Cola" + drink_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" + +/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_life(mob/living/M) + M.Jitter(20) + M.Druggy(30) + M.AdjustDizzy(5) + M.SetDrowsy(0) + M.status_flags |= GOTTAGOFAST + ..() + +/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_delete(mob/living/M) + M.status_flags &= ~GOTTAGOFAST + ..() + +/datum/reagent/consumable/drink/cold/spacemountainwind + name = "Space Mountain Wind" + id = "spacemountainwind" + description = "Blows right through you like a space wind." + color = "#102000" // rgb: 16, 32, 0 + adj_drowsy = -7 + adj_sleepy = -1 + drink_icon = "Space_mountain_wind_glass" + drink_name = "Glass of Space Mountain Wind" + drink_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + +/datum/reagent/consumable/drink/cold/dr_gibb + name = "Dr. Gibb" + id = "dr_gibb" + description = "A delicious blend of 42 different flavours" + color = "#102000" // rgb: 16, 32, 0 + adj_drowsy = -6 + drink_icon = "dr_gibb_glass" + drink_name = "Glass of Dr. Gibb" + drink_desc = "Dr. Gibb. Not as dangerous as the name might imply." + +/datum/reagent/consumable/drink/cold/space_up + name = "Space-Up" + id = "space_up" + description = "Tastes like a hull breach in your mouth." + color = "#202800" // rgb: 32, 40, 0 + adj_temp_cool = 8 + drink_icon = "space-up_glass" + drink_name = "Glass of Space-up" + drink_desc = "Space-up. It helps keep your cool." + +/datum/reagent/consumable/drink/cold/lemon_lime + name = "Lemon Lime" + description = "A tangy substance made of 0.5% natural citrus!" + id = "lemon_lime" + color = "#878F00" // rgb: 135, 40, 0 + adj_temp_cool = 8 + +/datum/reagent/consumable/drink/cold/lemonade + name = "Lemonade" + description = "Oh the nostalgia..." + id = "lemonade" + color = "#FFFF00" // rgb: 255, 255, 0 + drink_icon = "lemonade" + drink_name = "Lemonade" + drink_desc = "Oh the nostalgia..." + +/datum/reagent/consumable/drink/cold/kiraspecial + name = "Kira Special" + description = "Long live the guy who everyone had mistaken for a girl. Baka!" + id = "kiraspecial" + color = "#CCCC99" // rgb: 204, 204, 153 + drink_icon = "kiraspecial" + drink_name = "Kira Special" + drink_desc = "Long live the guy who everyone had mistaken for a girl. Baka!" + +/datum/reagent/consumable/drink/cold/brownstar + name = "Brown Star" + description = "It's not what it sounds like..." + id = "brownstar" + color = "#9F3400" // rgb: 159, 052, 000 + adj_temp_cool = 2 + drink_icon = "brownstar" + drink_name = "Brown Star" + drink_desc = "Its not what it sounds like..." + +/datum/reagent/consumable/drink/cold/milkshake + name = "Milkshake" + description = "Glorious brainfreezing mixture." + id = "milkshake" + color = "#AEE5E4" // rgb" 174, 229, 228 + adj_temp_cool = 9 + drink_icon = "milkshake" + drink_name = "Milkshake" + drink_desc = "Glorious brainfreezing mixture." + +/datum/reagent/consumable/drink/cold/rewriter + name = "Rewriter" + description = "The secert of the sanctuary of the Libarian..." + id = "rewriter" + color = "#485000" // rgb:72, 080, 0 + drink_icon = "rewriter" + drink_name = "Rewriter" + drink_desc = "The secert of the sanctuary of the Libarian..." + +/datum/reagent/consumable/drink/cold/rewriter/on_mob_life(mob/living/M) + M.Jitter(5) + ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm new file mode 100644 index 00000000000..489eac3eb81 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -0,0 +1,362 @@ +/datum/reagent/consumable/drink/orangejuice + name = "Orange juice" + id = "orangejuice" + description = "Both delicious AND rich in Vitamin C, what more do you need?" + color = "#E78108" // rgb: 231, 129, 8 + drink_icon = "glass_orange" + drink_name = "Glass of Orange juice" + drink_desc = "Vitamins! Yay!" + +/datum/reagent/consumable/drink/orangejuicde/on_mob_life(mob/living/M) + if(M.getOxyLoss() && prob(30)) + M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/consumable/drink/tomatojuice + name = "Tomato Juice" + id = "tomatojuice" + description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" + color = "#731008" // rgb: 115, 16, 8 + drink_icon = "glass_red" + drink_name = "Glass of Tomato juice" + drink_desc = "Are you sure this is tomato juice?" + +/datum/reagent/consumable/drink/tomatojuice/on_mob_life(mob/living/M) + if(M.getFireLoss() && prob(20)) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/drink/limejuice + name = "Lime Juice" + id = "limejuice" + description = "The sweet-sour juice of limes." + color = "#365E30" // rgb: 54, 94, 48 + drink_icon = "glass_green" + drink_name = "Glass of Lime juice" + drink_desc = "A glass of sweet-sour lime juice." + +/datum/reagent/consumable/drink/limejuice/on_mob_life(mob/living/M) + if(M.getToxLoss() && prob(20)) + M.adjustToxLoss(-1) + ..() + +/datum/reagent/consumable/drink/carrotjuice + name = "Carrot juice" + id = "carrotjuice" + description = "It is just like a carrot but without crunching." + color = "#973800" // rgb: 151, 56, 0 + drink_icon = "carrotjuice" + drink_name = "Glass of carrot juice" + drink_desc = "It is just like a carrot but without crunching." + +/datum/reagent/consumable/drink/carrotjuicde/on_mob_life(mob/living/M) + M.AdjustEyeBlurry(-1) + M.AdjustEyeBlind(-1) + switch(current_cycle) + if(1 to 20) + //nothing + if(21 to INFINITY) + if(prob(current_cycle-10)) + M.disabilities &= ~NEARSIGHTED + ..() + +/datum/reagent/consumable/drink/doctor_delight + name = "The Doctor's Delight" + id = "doctorsdelight" + description = "A gulp a day keeps the MediBot away. That's probably for the best." + reagent_state = LIQUID + color = "#FF8CFF" // rgb: 255, 140, 255 + drink_icon = "doctorsdelightglass" + drink_name = "Doctor's Delight" + drink_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + +/datum/reagent/consumable/drink/doctors_delight/on_mob_life(mob/living/M) + if(M.getToxLoss() && prob(20)) + M.adjustToxLoss(-1) + ..() + +/datum/reagent/consumable/drink/triple_citrus + name = "Triple Citrus" + id = "triple_citrus" + description = "A refreshing mixed drink of orange, lemon and lime juice." + reagent_state = LIQUID + color = "#23A046" + drink_icon = "triplecitrus" + drink_name = "Glass of Triplecitrus Juice" + drink_desc = "As colorful and healthy as it is delicious." + +/datum/reagent/consumable/drink/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST) + M.adjustToxLoss(-rand(1,2)) + +/datum/reagent/consumable/drink/berryjuice + name = "Berry Juice" + id = "berryjuice" + description = "A delicious blend of several different kinds of berries." + color = "#863333" // rgb: 134, 51, 51 + drink_icon = "berryjuice" + drink_name = "Glass of berry juice" + drink_desc = "Berry juice. Or maybe its jam. Who cares?" + +/datum/reagent/consumable/drink/poisonberryjuice + name = "Poison Berry Juice" + id = "poisonberryjuice" + description = "A tasty juice blended from various kinds of very deadly and toxic berries." + color = "#863353" // rgb: 134, 51, 83 + drink_icon = "poisonberryjuice" + drink_name = "Glass of poison berry juice" + drink_desc = "A glass of deadly juice." + +/datum/reagent/consumable/drink/poisonberryjuice/on_mob_life(mob/living/M) + M.adjustToxLoss(1) + ..() + +/datum/reagent/consumable/drink/watermelonjuice + name = "Watermelon Juice" + id = "watermelonjuice" + description = "Delicious juice made from watermelon." + color = "#863333" // rgb: 134, 51, 51 + +/datum/reagent/consumable/drink/lemonjuice + name = "Lemon Juice" + id = "lemonjuice" + description = "This juice is VERY sour." + color = "#863333" // rgb: 175, 175, 0 + drink_icon = "lemonglass" + drink_name = "Glass of lemonjuice" + drink_desc = "Sour..." + +/datum/reagent/consumable/drink/grapejuice + name = "Grape Juice" + id = "grapejuice" + description = "This juice is known to stain shirts." + color = "#993399" // rgb: 153, 51, 153 + +/datum/reagent/consumable/drink/banana + name = "Banana Juice" + id = "banana" + description = "The raw essence of a banana." + color = "#863333" // rgb: 175, 175, 0 + drink_icon = "banana" + drink_name = "Glass of banana juice" + drink_desc = "The raw essence of a banana. HONK" + +/datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M) + if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/drink/nothing + name = "Nothing" + id = "nothing" + description = "Absolutely nothing." + drink_icon = "nothing" + drink_name = "Nothing" + drink_desc = "Absolutely nothing." + +/datum/reagent/consumable/drink/nothing/on_mob_life(mob/living/M) + if(ishuman(M) && M.job in list("Mime")) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/drink/potato_juice + name = "Potato Juice" + id = "potato" + description = "Juice of the potato. Bleh." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + drink_icon = "glass_brown" + drink_name = "Glass of potato juice" + drink_desc = "Who in the hell requests this? Gross!" + +/datum/reagent/consumable/drink/milk + name = "Milk" + id = "milk" + description = "An opaque white liquid produced by the mammary glands of mammals." + color = "#DFDFDF" // rgb: 223, 223, 223 + drink_icon = "glass_white" + drink_name = "Glass of milk" + drink_desc = "White and nutritious goodness!" + +/datum/reagent/consumable/drink/milk/on_mob_life(mob/living/M) + if(M.getBruteLoss() && prob(20)) + M.adjustBruteLoss(-1) + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 2) + ..() + +/datum/reagent/consumable/drink/milk/soymilk + name = "Soy Milk" + id = "soymilk" + description = "An opaque white liquid made from soybeans." + color = "#DFDFC7" // rgb: 223, 223, 199 + drink_name = "Glass of soy milk" + drink_desc = "White and nutritious soy goodness!" + +/datum/reagent/consumable/drink/milk/cream + name = "Cream" + id = "cream" + description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" + color = "#DFD7AF" // rgb: 223, 215, 175 + drink_name = "Glass of cream" + drink_desc = "Ewwww..." + +/datum/reagent/consumable/drink/milk/chocolate_milk + name = "Chocolate milk" + id ="chocolate_milk" + description = "Chocolate-flavored milk, tastes like being a kid again." + color = "#85432C" + +/datum/reagent/consumable/drink/hot_coco + name = "Hot Chocolate" + id = "hot_coco" + description = "Made with love! And coco beans." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#403010" // rgb: 64, 48, 16 + adj_temp_hot = 5 + drink_icon = "hot_coco" + drink_name = "Glass of hot coco" + drink_desc = "Delicious and cozy" + +/datum/reagent/consumable/drink/coffee + name = "Coffee" + id = "coffee" + description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." + color = "#482000" // rgb: 72, 32, 0 + adj_dizzy = -5 + adj_drowsy = -3 + adj_sleepy = -2 + adj_temp_hot = 25 + overdose_threshold = 45 + addiction_chance = 1 // It's true. + heart_rate_increase = 1 + drink_icon = "glass_brown" + drink_name = "Glass of coffee" + drink_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + +/datum/reagent/consumable/drink/coffee/on_mob_life(mob/living/M) + if(holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 5) + if(prob(50)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + ..() + +/datum/reagent/consumable/drink/coffee/overdose_process(mob/living/M, severity) + if(volume > 45) + M.Jitter(5) + +/datum/reagent/consumable/drink/coffee/icecoffee + name = "Iced Coffee" + id = "icecoffee" + description = "Coffee and ice, refreshing and cool." + color = "#102838" // rgb: 16, 40, 56 + adj_temp_hot = 0 + adj_temp_cool = 5 + drink_icon = "icedcoffeeglass" + drink_name = "Iced Coffee" + drink_desc = "A drink to perk you up and refresh you!" + +/datum/reagent/consumable/drink/coffee/soy_latte + name = "Soy Latte" + id = "soy_latte" + description = "A nice and tasty beverage while you are reading your hippie books." + color = "#664300" // rgb: 102, 67, 0 + adj_sleepy = 0 + adj_temp_hot = 5 + drink_icon = "soy_latte" + drink_name = "Soy Latte" + drink_desc = "A nice and refrshing beverage while you are reading." + +/datum/reagent/consumable/drink/coffee/soy_latte/on_mob_life(mob/living/M) + ..() + M.SetSleeping(0) + if(M.getBruteLoss() && prob(20)) + M.adjustBruteLoss(-1) + +/datum/reagent/consumable/drink/coffee/cafe_latte + name = "Cafe Latte" + id = "cafe_latte" + description = "A nice, strong and tasty beverage while you are reading." + color = "#664300" // rgb: 102, 67, 0 + adj_sleepy = 0 + adj_temp_hot = 5 + drink_icon = "cafe_latte" + drink_name = "Cafe Latte" + drink_desc = "A nice, strong and refreshing beverage while you are reading." + +/datum/reagent/consumable/drink/coffee/cafe_latte/on_mob_life(mob/living/M) + ..() + M.SetSleeping(0) + if(M.getBruteLoss() && prob(20)) + M.adjustBruteLoss(-1) + +/datum/reagent/consumable/drink/coffee/cafe_latte/cafe_mocha + name = "Cafe Mocha" + id = "cafe_mocha" + description = "The perfect blend of coffe, milk, and chocolate." + color = "#673629" + drink_name = "Cafe Mocha" + drink_desc = "The perfect blend of coffe, milk, and chocolate." + +/datum/reagent/consumable/drink/tea + name = "Tea" + id = "tea" + description = "Tasty black tea: It has antioxidants. It's good for you!" + color = "#101000" // rgb: 16, 16, 0 + adj_dizzy = -2 + adj_drowsy = -1 + adj_sleepy = -3 + adj_temp_hot = 20 + drink_icon = "glass_brown" + drink_name = "Glass of Tea" + drink_desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" + +/datum/reagent/consumable/drink/tea/on_mob_life(mob/living/M) + if(M.getToxLoss() && prob(20)) + M.adjustToxLoss(-1) + ..() + +/datum/reagent/consumable/drink/tea/icetea + name = "Iced Tea" + id = "icetea" + description = "No relation to a certain rap artist/ actor." + color = "#104038" // rgb: 16, 64, 56 + adj_temp_hot = 0 + adj_temp_cool = 5 + drink_icon = "icetea" + drink_name = "Iced Tea" + drink_desc = "No relation to a certain rap artist/ actor." + +/datum/reagent/consumable/drink/bananahonk + name = "Banana Mama" + id = "bananahonk" + description = "A drink from Clown Heaven." + color = "#664300" // rgb: 102, 67, 0 + drink_icon = "bananahonkglass" + drink_name = "Banana Honk" + drink_desc = "A drink from Banana Heaven." + +/datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M) + if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/drink/silencer + name = "Silencer" + id = "silencer" + description = "A drink from Mime Heaven." + color = "#664300" // rgb: 102, 67, 0 + drink_icon = "silencerglass" + drink_name = "Silencer" + drink_desc = "A drink from mime Heaven." + +/datum/reagent/consumable/drink/silencer/on_mob_life(mob/living/M) + if(ishuman(M) && M.job in list("Mime")) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + ..() \ No newline at end of file diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm similarity index 77% rename from code/modules/reagents/newchem/drugs.dm rename to code/modules/reagents/chemistry/reagents/drugs.dm index 99a637e4fca..3719c6f49b8 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -1,8 +1,88 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 +/datum/reagent/serotrotium + name = "Serotrotium" + id = "serotrotium" + description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + reagent_state = LIQUID + color = "#202040" // rgb: 20, 20, 40 + metabolization_rate = 0.25 * REAGENTS_METABOLISM -#define REM REAGENTS_EFFECT_MULTIPLIER +/datum/reagent/serotrotium/on_mob_life(mob/living/M) + if(ishuman(M)) + if(prob(7)) + M.emote(pick("twitch","drool","moan","gasp")) + ..() + + +/datum/reagent/lithium + name = "Lithium" + id = "lithium" + description = "A chemical element." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + +/datum/reagent/lithium/on_mob_life(mob/living/M) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove && !M.restrained()) + step(M, pick(cardinal)) + if(prob(5)) M.emote(pick("twitch","drool","moan")) + ..() + +/datum/reagent/lsd + name = "Lysergic acid diethylamide" + id = "lsd" + description = "A highly potent hallucinogenic substance. Far out, maaaan." + reagent_state = LIQUID + color = "#0000D8" + +/datum/reagent/lsd/on_mob_life(mob/living/M) + M.Druggy(15) + M.AdjustHallucinate(10) + ..() + +/datum/reagent/space_drugs + name = "Space drugs" + id = "space_drugs" + description = "An illegal chemical compound used as drug." + reagent_state = LIQUID + color = "#9087A2" + metabolization_rate = 0.2 + addiction_chance = 65 + heart_rate_decrease = 1 + +/datum/reagent/space_drugs/on_mob_life(mob/living/M) + M.Druggy(15) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove && !M.restrained()) + step(M, pick(cardinal)) + if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) + ..() + +/datum/reagent/psilocybin + name = "Psilocybin" + id = "psilocybin" + description = "A strong psycotropic derived from certain species of mushroom." + color = "#E700E7" // rgb: 231, 0, 231 + +/datum/reagent/psilocybin/on_mob_life(mob/living/M) + M.Druggy(30) + switch(current_cycle) + if(1 to 5) + M.Stuttering(1) + M.Dizzy(5) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(5 to 10) + M.Stuttering(1) + M.Jitter(10) + M.Dizzy(10) + M.Druggy(35) + if(prob(20)) M.emote(pick("twitch","giggle")) + if(10 to INFINITY) + M.Stuttering(1) + M.Jitter(20) + M.Dizzy(20) + M.Druggy(40) + if(prob(30)) M.emote(pick("twitch","giggle")) + ..() /datum/reagent/nicotine name = "Nicotine" @@ -22,7 +102,7 @@ M.AdjustParalysis(-1) M.AdjustStunned(-1) M.AdjustWeakened(-1) - M.adjustStaminaLoss(-1*REM) + M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER) ..() /datum/reagent/nicotine/overdose_process(mob/living/M, severity) @@ -30,7 +110,7 @@ if(severity == 1) if(effect <= 2) M.visible_message("[M] looks nervous!") - M.confused += 15 + M.AdjustConfused(15) M.adjustToxLoss(2) M.Jitter(10) M.emote("twitch_s") @@ -55,7 +135,7 @@ M.Jitter(10) M.adjustToxLoss(5) M.Weaken(1) - M.confused += 33 + M.AdjustConfused(33) else if(effect <= 7) M.emote("collapse") to_chat(M, "Your heart is pounding!") @@ -90,7 +170,7 @@ if(prob(4)) to_chat(M, "You feel kinda awful!") M.adjustToxLoss(1) - M.jitteriness += 30 + M.AdjustJitter(30) M.emote(pick("groan", "moan")) ..() @@ -99,7 +179,7 @@ if(severity == 1) if(effect <= 2) M.visible_message("[M] looks confused!") - M.confused += 20 + M.AdjustConfused(20) M.Jitter(20) M.emote("scream") else if(effect <= 4) @@ -123,7 +203,7 @@ M.adjustToxLoss(2) M.adjustBrainLoss(8) M.Weaken(3) - M.confused += 25 + M.AdjustConfused(25) M.emote("scream") M.reagents.add_reagent("jagged_crystals", 5) else if(effect <= 7) @@ -133,22 +213,6 @@ M.adjustBruteLoss(5) M.emote("twitch_s") -/datum/chemical_reaction/crank - name = "Crank" - id = "crank" - result = "crank" - required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) - result_amount = 5 - mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." - mix_sound = 'sound/goonstation/effects/crystalshatter.ogg' - min_temp = 390 - -/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume) - var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) - explosion(T,0,0,2) - /datum/reagent/krokodil name = "Krokodil" id = "krokodil" @@ -160,7 +224,7 @@ /datum/reagent/krokodil/on_mob_life(mob/living/M) - M.jitteriness -= 40 + M.AdjustJitter(-40) if(prob(25)) M.adjustBrainLoss(1) if(prob(15)) @@ -216,16 +280,6 @@ M.emote("shiver") M.bodytemperature -= 70 -/datum/chemical_reaction/krokodil - name = "Krokodil" - id = "krokodil" - result = "krokodil" - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) - result_amount = 6 - mix_message = "The mixture dries into a pale blue powder." - min_temp = 380 - mix_sound = 'sound/goonstation/misc/fuse.ogg' - /datum/reagent/methamphetamine name = "Methamphetamine" id = "methamphetamine" @@ -241,8 +295,8 @@ if(prob(5)) M.emote(pick("twitch_s","blink_r","shiver")) if(current_cycle >= 25) - M.jitteriness += 5 - M.drowsyness = max(0, M.drowsyness-10) + M.AdjustJitter(5) + M.AdjustDrowsy(-10) M.AdjustParalysis(-2.5) M.AdjustStunned(-2.5) M.AdjustWeakened(-2.5) @@ -253,7 +307,7 @@ M.adjustBrainLoss(1.0) ..() -/datum/reagent/methamphetamine/reagent_deleted(mob/living/M) +/datum/reagent/methamphetamine/on_mob_delete(mob/living/M) M.status_flags &= ~GOTTAGOREALLYFAST ..() @@ -262,7 +316,7 @@ if(severity == 1) if(effect <= 2) M.visible_message("[M] can't seem to control their legs!") - M.confused += 20 + M.AdjustConfused(20) M.Weaken(4) else if(effect <= 4) M.visible_message("[M]'s hands flip out and flail everywhere!") @@ -282,39 +336,6 @@ else if(effect <= 7) M.emote("laugh") -/datum/chemical_reaction/methamphetamine - name = "methamphetamine" - id = "methamphetamine" - result = "methamphetamine" - required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) - result_amount = 4 - min_temp = 374 - -/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The solution generates a strong vapor!") - for(var/mob/living/carbon/C in range(T, 1)) - if(C.can_breathe_gas()) - C.emote("gasp") - C.losebreath++ - C.reagents.add_reagent("toxin", 10) - C.reagents.add_reagent("neurotoxin2", 20) - -/datum/chemical_reaction/saltpetre - name = "saltpetre" - id = "saltpetre" - result = "saltpetre" - required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) - result_amount = 3 - mix_sound = 'sound/goonstation/misc/fuse.ogg' - -/datum/reagent/saltpetre - name = "Saltpetre" - id = "saltpetre" - description = "Volatile." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - /datum/reagent/bath_salts name = "Bath Salts" id = "bath_salts" @@ -342,15 +363,15 @@ M.SetWeakened(0) if(check < 30) M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble")) - M.druggy = max(M.druggy, 15) + M.Druggy(15) if(check < 20) - M.confused += 10 + M.AdjustConfused(10) if(check < 8) M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5)) M.visible_message("[M] scratches at something under their skin!") M.adjustBruteLoss(5) else if(check < 16) - M.hallucination += 30 + M.AdjustHallucinate(30) else if(check < 24) to_chat(M, "They're coming for you!") else if(check < 28) @@ -373,7 +394,7 @@ if(severity == 1) if(effect <= 2) M.visible_message("[M] flails around like a lunatic!") - M.confused += 25 + M.AdjustConfused(25) M.Jitter(10) M.emote("scream") M.reagents.add_reagent("jagged_crystals", 5) @@ -383,7 +404,7 @@ M.adjustToxLoss(2) M.adjustBrainLoss(1) M.Stun(3) - M.eye_blurry = max(M.eye_blurry, 7) + M.EyeBlurry(7) M.reagents.add_reagent("jagged_crystals", 5) else if(effect <= 7) M.emote("faint") @@ -394,7 +415,7 @@ M.adjustToxLoss(2) M.adjustBrainLoss(1) M.Stun(3) - M.eye_blurry = max(M.eye_blurry, 7) + M.EyeBlurry(7) M.reagents.add_reagent("jagged_crystals", 5) else if(effect <= 4) M.visible_message("[M] convulses violently and falls to the floor!") @@ -411,32 +432,6 @@ M.reagents.add_reagent("jagged_crystals", 5) M.emote("twitch") -/datum/chemical_reaction/bath_salts - name = "bath_salts" - id = "bath_salts" - result = "bath_salts" - required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1) - result_amount = 6 - min_temp = 374 - mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh." - mix_sound = 'sound/goonstation/misc/fuse.ogg' - -/datum/chemical_reaction/jenkem - name = "Jenkem" - id = "jenkem" - result = "jenkem" - required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1) - result_amount = 3 - mix_message = "The mixture ferments into a filthy morass." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/chemical_reaction/jenkem/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The solution generates a strong vapor!") - for(var/mob/living/carbon/C in range(T, 1)) - if(C.can_breathe_gas()) - C.reagents.add_reagent("jenkem", 25) - /datum/reagent/jenkem name = "Jenkem" id = "jenkem" @@ -452,13 +447,6 @@ M.adjustToxLoss(1) ..() -/datum/chemical_reaction/aranesp - name = "Aranesp" - id = "aranesp" - result = "aranesp" - required_reagents = list("epinephrine" = 1, "atropine" = 1, "insulin" = 1) - result_amount = 3 - /datum/reagent/aranesp name = "Aranesp" id = "aranesp" @@ -479,7 +467,7 @@ to_chat(M, "You cannot breathe!") M.adjustOxyLoss(15) M.Stun(1) - M.losebreath++ + M.AdjustLoseBreath(1) ..() /datum/reagent/thc @@ -489,7 +477,6 @@ reagent_state = LIQUID color = "#0FBE0F" - /datum/reagent/thc/on_mob_life(mob/living/M) M.stuttering += rand(0,2) if(prob(5)) @@ -497,10 +484,10 @@ if(prob(5)) to_chat(M, "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]") if(prob(4)) - M.confused = max(M.confused, 10) + M.Confused(10) if(volume >= 50 && prob(25)) if(prob(10)) - M.drowsyness = max(M.drowsyness, 10) + M.Drowsy(10) ..() /datum/reagent/fliptonium @@ -514,19 +501,6 @@ process_flags = ORGANIC | SYNTHETIC //Flipping for everyone! addiction_chance = 10 -/datum/chemical_reaction/fliptonium - name = "fliptonium" - id = "fliptonium" - result = "fliptonium" - required_reagents = list("ephedrine" = 1, "liquid_dark_matter" = 1, "chocolate" = 1, "ginsonic" = 1) - result_amount = 4 - mix_message = "The mixture swirls around excitedly!" - -/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST || method == TOUCH) - M.SpinAnimation(speed = 12, loops = -1) - ..() - /datum/reagent/fliptonium/on_mob_life(mob/living/M) if(current_cycle == 5) M.SpinAnimation(speed = 11, loops = -1) @@ -545,7 +519,7 @@ if(current_cycle == 50) M.SpinAnimation(speed = 4, loops = -1) - M.drowsyness = max(0, M.drowsyness-6) + M.AdjustDrowsy(-6) M.AdjustParalysis(-1.5) M.AdjustStunned(-1.5) M.AdjustWeakened(-1.5) @@ -553,7 +527,12 @@ M.SetSleeping(0) ..() -/datum/reagent/fliptonium/reagent_deleted(mob/living/M) +/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST || method == TOUCH) + M.SpinAnimation(speed = 12, loops = -1) + ..() + +/datum/reagent/fliptonium/on_mob_delete(mob/living/M) M.SpinAnimation(speed = 12, loops = -1) /datum/reagent/fliptonium/overdose_process(mob/living/M, severity) @@ -561,7 +540,7 @@ if(severity == 1) if(effect <= 2) M.visible_message("[M] can't seem to control their legs!") - M.confused += 33 + M.AdjustConfused(33) M.Weaken(2) else if(effect <= 4) M.visible_message("[M]'s hands flip out and flail everywhere!") @@ -592,20 +571,11 @@ description = "Ultra-Lube is an enhanced lubricant which induces effect similar to Methamphetamine in synthetic users by drastically reducing internal friction and increasing cooling capabilities." reagent_state = LIQUID color = "#1BB1FF" - process_flags = SYNTHETIC overdose_threshold = 20 addiction_chance = 60 metabolization_rate = 0.6 -/datum/chemical_reaction/lube/ultra - name = "Ultra-Lube" - id = "ultralube" - result = "ultralube" - required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1) - result_amount = 2 - mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol." - /datum/reagent/lube/ultra/on_mob_life(mob/living/M) var/high_message = pick("You feel your servos whir!", "You feel like you need to go faster.", "You feel like you were just overclocked!") if(prob(1)) @@ -624,7 +594,7 @@ M.emote(pick("twitch", "shiver")) ..() -/datum/reagent/lube/ultra/reagent_deleted(mob/living/M) +/datum/reagent/lube/ultra/on_mob_delete(mob/living/M) M.status_flags &= ~GOTTAGOREALLYFAST ..() @@ -655,7 +625,7 @@ /datum/reagent/surge/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 15) + M.Druggy(15) var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") if(prob(1)) if(prob(1)) @@ -680,13 +650,5 @@ B.pixel_x = rand(-20, 0) B.pixel_y = rand(-20, 0) B.icon = I - M.adjustFireLoss(rand(1,5)*REM) - M.adjustBruteLoss(rand(1,5)*REM) - -/datum/chemical_reaction/surge - name = "Surge" - id = "surge" - result = "surge" - required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1) - result_amount = 6 - mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity." + M.adjustFireLoss(rand(1,5)*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(rand(1,5)*REAGENTS_EFFECT_MULTIPLIER) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm new file mode 100644 index 00000000000..e2aef002060 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -0,0 +1,835 @@ +/////////////////////////Food Reagents//////////////////////////// +// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food +// condiments, additives, and such go. + +/datum/reagent/consumable + name = "Consumable" + id = "consumable" + var/nutriment_factor = 1 * REAGENTS_METABOLISM + var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN + +/datum/reagent/consumable/on_mob_life(mob/living/M) + if(!(M.mind in ticker.mode.vampires)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients + H.nutrition += nutriment_factor // For hunger and fatness + ..() + +/datum/reagent/consumable/nutriment // Pure nutriment, universally digestable and thus slightly less effective + name = "Nutriment" + id = "nutriment" + description = "A questionable mixture of various pure nutrients commonly found in processed foods." + reagent_state = SOLID + nutriment_factor = 12 * REAGENTS_METABOLISM + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M) + if(!(M.mind in ticker.mode.vampires)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients + if(prob(50)) + M.adjustBruteLoss(-1) + if(H.species.exotic_blood) + H.vessel.add_reagent(H.species.exotic_blood, 0.4) + else + if(!(H.species.flags & NO_BLOOD)) + H.vessel.add_reagent("blood", 0.4) + ..() + +/datum/reagent/consumable/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores + name = "Protein" + id = "protein" + description = "Various essential proteins and fats commonly found in animal flesh and blood." + nutriment_factor = 15 * REAGENTS_METABOLISM + diet_flags = DIET_CARN | DIET_OMNI + +/datum/reagent/consumable/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores + name = "Plant-matter" + id = "plantmatter" + description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce." + nutriment_factor = 15 * REAGENTS_METABOLISM + diet_flags = DIET_HERB | DIET_OMNI + +/datum/reagent/consumable/vitamin + name = "Vitamin" + id = "vitamin" + description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." + reagent_state = SOLID + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M) + if(prob(50)) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.exotic_blood) + H.vessel.add_reagent(H.species.exotic_blood, 0.5) + else + if(!(H.species.flags & NO_BLOOD)) + H.vessel.add_reagent("blood", 0.5) + ..() + +/datum/reagent/consumable/soysauce + name = "Soysauce" + id = "soysauce" + description = "A salty sauce made from the soy plant." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#792300" // rgb: 121, 35, 0 + +/datum/reagent/consumable/ketchup + name = "Ketchup" + id = "ketchup" + description = "Ketchup, catsup, whatever. It's tomato paste." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#731008" // rgb: 115, 16, 8 + +/datum/reagent/consumable/capsaicin + name = "Capsaicin Oil" + id = "capsaicin" + description = "This is what makes chilis hot." + reagent_state = LIQUID + color = "#B31008" // rgb: 179, 16, 8 + +/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/M) + switch(current_cycle) + if(1 to 15) + M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 5) + if(isslime(M)) + M.bodytemperature += rand(5,20) + if(15 to 25) + M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(isslime(M)) + M.bodytemperature += rand(10,20) + if(25 to 35) + M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(isslime(M)) + M.bodytemperature += rand(15,20) + if(35 to INFINITY) + M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(isslime(M)) + M.bodytemperature += rand(20,25) + ..() + +/datum/reagent/consumable/condensedcapsaicin + name = "Condensed Capsaicin" + id = "condensedcapsaicin" + description = "This shit goes in pepperspray." + reagent_state = LIQUID + color = "#B31008" // rgb: 179, 16, 8 + +/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/M) + if(prob(5)) + M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") + ..() + +/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + if(ishuman(M)) + var/mob/living/carbon/human/victim = M + var/mouth_covered = 0 + var/eyes_covered = 0 + var/obj/item/safe_thing = null + if( victim.wear_mask ) + if( victim.wear_mask.flags & MASKCOVERSEYES ) + eyes_covered = 1 + safe_thing = victim.wear_mask + if( victim.wear_mask.flags & MASKCOVERSMOUTH ) + mouth_covered = 1 + safe_thing = victim.wear_mask + if( victim.head ) + if( victim.head.flags & MASKCOVERSEYES ) + eyes_covered = 1 + safe_thing = victim.head + if( victim.head.flags & MASKCOVERSMOUTH ) + mouth_covered = 1 + safe_thing = victim.head + if(victim.glasses) + eyes_covered = 1 + if( !safe_thing ) + safe_thing = victim.glasses + if( eyes_covered && mouth_covered ) + to_chat(victim, "Your [safe_thing] protects you from the pepperspray!") + return + else if( mouth_covered ) // Reduced effects if partially protected + to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!") + if(prob(5)) + victim.emote("scream") + victim.EyeBlurry(3) + victim.EyeBlind(1) + victim.Confused(3) + victim.damageoverlaytemp = 60 + victim.Weaken(3) + victim.drop_item() + return + else if( eyes_covered ) // Eye cover is better than mouth cover + to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!") + victim.EyeBlurry(3) + victim.damageoverlaytemp = 30 + return + else // Oh dear :D + if(prob(5)) + victim.emote("scream") + to_chat(victim, "You're sprayed directly in the eyes with pepperspray!") + victim.EyeBlurry(5) + victim.EyeBlind(2) + victim.Confused(6) + victim.damageoverlaytemp = 75 + victim.Weaken(5) + victim.drop_item() + +/datum/reagent/consumable/frostoil + name = "Frost Oil" + id = "frostoil" + description = "A special oil that noticably chills the body. Extraced from Icepeppers." + reagent_state = LIQUID + color = "#8BA6E9" // rgb: 139, 166, 233 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/consumable/frostoil/on_mob_life(mob/living/M) + switch(current_cycle) + if(1 to 15) + M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 5) + if(isslime(M)) + M.bodytemperature -= rand(5,20) + if(15 to 25) + M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(isslime(M)) + M.bodytemperature -= rand(10,20) + if(25 to 35) + M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) + M.emote("shiver") + if(isslime(M)) + M.bodytemperature -= rand(15,20) + if(35 to INFINITY) + M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) + M.emote("shiver") + if(isslime(M)) + M.bodytemperature -= rand(20,25) + ..() + +/datum/reagent/consumable/frostoil/reaction_turf(turf/T, volume) + if(volume >= 5) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +/datum/reagent/consumable/sodiumchloride + name = "Salt" + id = "sodiumchloride" + description = "Sodium chloride, common table salt." + reagent_state = SOLID + color = "#B1B0B0" + overdose_threshold = 100 + +/datum/reagent/consumable/sodiumchloride/overdose_process(mob/living/M, severity) + if(prob(70)) + M.adjustBrainLoss(1) + ..() + +/datum/reagent/consumable/blackpepper + name = "Black Pepper" + id = "blackpepper" + description = "A powder ground from peppercorns. *AAAACHOOO*" + reagent_state = SOLID + +/datum/reagent/consumable/cocoa + name = "Cocoa Powder" + id = "cocoa" + description = "A fatty, bitter paste made from cocoa beans." + reagent_state = SOLID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/consumable/hot_coco + name = "Hot Chocolate" + id = "hot_coco" + description = "Made with love! And cocoa beans." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#403010" // rgb: 64, 48, 16 + +/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/M) + if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + ..() + +/datum/reagent/consumable/sprinkles + name = "Sprinkles" + id = "sprinkles" + description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." + color = "#FF00FF" // rgb: 255, 0, 255 + +/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M) + if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")) + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/cornoil + name = "Corn Oil" + id = "cornoil" + description = "An oil derived from various types of corn." + reagent_state = LIQUID + nutriment_factor = 20 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/consumable/cornoil/reaction_turf(turf/simulated/T, volume) + if(!istype(T)) + return + if(volume >= 3) + T.MakeSlippery() + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + +/datum/reagent/consumable/enzyme + name = "Denatured Enzyme" + id = "enzyme" + description = "Heated beyond usefulness, this enzyme is now worthless." + reagent_state = LIQUID + color = "#282314" // rgb: 54, 94, 48 + +/datum/reagent/consumable/dry_ramen + name = "Dry Ramen" + id = "dry_ramen" + description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." + reagent_state = SOLID + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/consumable/hot_ramen + name = "Hot Ramen" + id = "hot_ramen" + description = "The noodles are boiled, the flavors are artificial, just like being back in school." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/M) + if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) + ..() + +/datum/reagent/consumable/hell_ramen + name = "Hell Ramen" + id = "hell_ramen" + description = "The noodles are boiled, the flavors are artificial, just like being back in school." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/M) + M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + +/datum/reagent/consumable/flour + name = "flour" + id = "flour" + description = "This is what you rub all over yourself to pretend to be a ghost." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 0, 0, 0 + +/datum/reagent/consumable/flour/reaction_turf(turf/T, volume) + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/flour(T) + +/datum/reagent/consumable/rice + name = "Rice" + id = "rice" + description = "Enjoy the great taste of nothing." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 0, 0, 0 + +/datum/reagent/consumable/cherryjelly + name = "Cherry Jelly" + id = "cherryjelly" + description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." + reagent_state = LIQUID + color = "#801E28" // rgb: 128, 30, 40 + +/datum/reagent/consumable/egg + name = "Egg" + id = "egg" + description = "A runny and viscous mixture of clear and yellow fluids." + reagent_state = LIQUID + color = "#F0C814" + +/datum/reagent/consumable/egg/on_mob_life(mob/living/M) + if(prob(8)) + M.emote("fart") + if(prob(3)) + M.reagents.add_reagent("cholesterol", rand(1,2)) + ..() + +/datum/reagent/consumable/corn_starch + name = "Corn Starch" + id = "corn_starch" + description = "The powdered starch of maize, derived from the kernel's endosperm. Used as a thickener for gravies and puddings." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/reagent/consumable/corn_syrup + name = "Corn Syrup" + id = "corn_syrup" + description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/M) + M.reagents.add_reagent("sugar", 1.2) + ..() + +/datum/reagent/consumable/vhfcs + name = "Very-high-fructose corn syrup" + id = "vhfcs" + description = "An incredibly sweet syrup, created from corn syrup treated with enzymes to convert its sugars into fructose." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/reagent/consumable/vhfcs/on_mob_life(mob/living/M) + M.reagents.add_reagent("sugar", 2.4) + ..() + +/datum/reagent/consumable/honey + name = "Honey" + id = "honey" + description = "A sweet substance produced by bees through partial digestion. Bee barf." + reagent_state = LIQUID + color = "#d3a308" + +/datum/reagent/consumable/honey/on_mob_life(mob/living/M) + M.reagents.add_reagent("sugar", 0.4) + if(prob(20)) + M.adjustBruteLoss(-3) + M.adjustFireLoss(-1) + ..() + +/datum/reagent/consumable/chocolate + name = "Chocolate" + id = "chocolate" + description = "Chocolate is a delightful product derived from the seeds of the theobroma cacao tree." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM //same as pure cocoa powder, because it makes no sense that chocolate won't fill you up and make you fat + color = "#2E2418" + drink_icon = "chocolateglass" + drink_name = "Glass of chocolate" + drink_desc = "Tasty" + +/datum/reagent/consumable/chocolate/on_mob_life(mob/living/M) + M.reagents.add_reagent("sugar", 0.8) + ..() + +/datum/reagent/consumable/chocolate/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T) + +/datum/reagent/consumable/mugwort + name = "Mugwort" + id = "mugwort" + description = "A rather bitter herb once thought to hold magical protective properties." + reagent_state = LIQUID + color = "#21170E" + +/datum/reagent/consumable/mugwort/on_mob_life(mob/living/M) + if(ishuman(M) && M.mind) + if(M.mind.special_role == SPECIAL_ROLE_WIZARD) + M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/consumable/porktonium + name = "Porktonium" + id = "porktonium" + description = "A highly-radioactive pork byproduct first discovered in hotdogs." + reagent_state = LIQUID + color = "#AB5D5D" + metabolization_rate = 0.2 + overdose_threshold = 133 + +/datum/reagent/consumable/porktonium/overdose_process(mob/living/M, severity) + if(prob(15)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent("radium", 15) + M.reagents.add_reagent("cyanide", 10) + +/datum/reagent/consumable/chicken_soup + name = "Chicken soup" + id = "chicken_soup" + description = "An old household remedy for mild illnesses." + reagent_state = LIQUID + color = "#B4B400" + metabolization_rate = 0.2 + nutriment_factor = 2 + +/datum/reagent/consumable/cheese + name = "Cheese" + id = "cheese" + description = "Some cheese. Pour it out to make it solid." + reagent_state = SOLID + color = "#FFFF00" + metabolization_rate = 0 //heheheh + nutriment_factor = 0 + +/datum/reagent/consumable/cheese/on_mob_life(mob/living/M) + if(prob(3)) + M.reagents.add_reagent("cholesterol", rand(1,2)) + ..() + +/datum/reagent/consumable/cheese/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T) + +/datum/reagent/consumable/fake_cheese + name = "Cheese substitute" + id = "fake_cheese" + description = "A cheese-like substance derived loosely from actual cheese." + reagent_state = LIQUID + color = "#B2B139" + overdose_threshold = 50 + +/datum/reagent/consumable/fake_cheese/overdose_process(mob/living/M, severity) + if(prob(8)) + to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") + M.adjustToxLoss(rand(1,2)) + +/datum/reagent/consumable/weird_cheese + name = "Weird cheese" + id = "weird_cheese" + description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid." + reagent_state = SOLID + color = "#50FF00" + metabolization_rate = 0 //heheheh + addiction_chance = 5 + nutriment_factor = 0 + +/datum/reagent/consumable/weird_cheese/on_mob_life(mob/living/M) + if(prob(5)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + ..() + +/datum/reagent/consumable/weird_cheese/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T) + +/datum/reagent/consumable/beans + name = "Refried beans" + id = "beans" + description = "A dish made of mashed beans cooked with lard." + reagent_state = LIQUID + color = "#684435" + +/datum/reagent/consumable/beans/on_mob_life(mob/living/M) + if(prob(10)) + M.emote("fart") + ..() + +/datum/reagent/consumable/bread + name = "Bread" + id = "bread" + description = "Bread! Yep, bread." + reagent_state = SOLID + color = "#9C5013" + +/datum/reagent/consumable/soybeanoil + name = "Space-soybean oil" + id = "soybeanoil" + description = "An oil derived from extra-terrestrial soybeans." + reagent_state = LIQUID + color = "#B1B0B0" + +/datum/reagent/consumable/soybeanoil/on_mob_life(mob/living/M) + if(prob(10)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent("porktonium", 5) + ..() + +/datum/reagent/consumable/hydrogenated_soybeanoil + name = "Partially hydrogenated space-soybean oil" + id = "hydrogenated_soybeanoil" + description = "An oil derived from extra-terrestrial soybeans, with additional hydrogen atoms added to convert it into a saturated form." + reagent_state = LIQUID + color = "#B1B0B0" + metabolization_rate = 0.2 + overdose_threshold = 75 + +/datum/reagent/consumable/hydrogenated_soybeanoil/on_mob_life(mob/living/M) + if(prob(15)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent("porktonium", 5) + if(volume >= 75) + metabolization_rate = 0.4 + else + metabolization_rate = 0.2 + ..() + +/datum/reagent/consumable/hydrogenated_soybeanoil/overdose_process(mob/living/M, severity) + if(prob(33)) + to_chat(M, "You feel horribly weak.") + if(prob(10)) + to_chat(M, "You cannot breathe!") + M.adjustOxyLoss(5) + if(prob(5)) + to_chat(M, "You feel a sharp pain in your chest!") + M.adjustOxyLoss(25) + M.Stun(5) + M.Paralyse(10) + +/datum/reagent/consumable/meatslurry + name = "Meat Slurry" + id = "meatslurry" + description = "A paste comprised of highly-processed organic material. Uncomfortably similar to deviled ham spread." + reagent_state = LIQUID + color = "#EBD7D7" + +/datum/reagent/consumable/meatslurry/on_mob_life(mob/living/M) + if(prob(4)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + ..() + +/datum/reagent/consumable/meatslurry/reaction_turf(turf/T, volume) + if(volume >= 5 && prob(10) && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) + playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + +/datum/reagent/consumable/mashedpotatoes + name = "Mashed potatoes" + id = "mashedpotatoes" + description = "A starchy food paste made from boiled potatoes." + reagent_state = SOLID + color = "#D6D9C1" + +/datum/reagent/consumable/gravy + name = "Gravy" + id = "gravy" + description = "A savory sauce made from a simple meat-dripping roux and milk." + reagent_state = LIQUID + color = "#B4641B" + +/datum/reagent/consumable/beff + name = "Beff" + id = "beff" + description = "An advanced blend of mechanically-recovered meat and textured synthesized protein product notable for its unusual crystalline grain when sliced." + reagent_state = SOLID + color = "#AC7E67" + +/datum/reagent/consumable/beff/on_mob_life(mob/living/M) + if(prob(5)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8) + else if(prob(6)) + to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]") + M.emote(pick("groan","moan")) + ..() + +/datum/reagent/consumable/pepperoni + name = "Pepperoni" + id = "pepperoni" + description = "An Italian-American variety of salami usually made from beef and pork" + reagent_state = SOLID + color = "#AC7E67" + +/datum/reagent/consumable/pepperoni/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.wear_mask) + to_chat(H, "The pepperoni bounces off your mask!") + return + + if(H.head) + to_chat(H, "Your mask protects you from the errant pepperoni!") + return + + if(prob(50)) + M.adjustBruteLoss(1) + playsound(M, 'sound/effects/woodhit.ogg', 50, 1) + to_chat(M, "A slice of pepperoni slaps you!") + else + M.emote("burp") + to_chat(M, "My goodness, that was tasty!") + + +///Food Related, but non-nutritious + +/datum/reagent/sugar + name = "Sugar" + id = "sugar" + description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255, 255, 255 + overdose_threshold = 200 // Hyperglycaemic shock + +/datum/reagent/sugar/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) + if(current_cycle >= 90) + M.AdjustJitter(2) + if(prob(50)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + if(prob(4)) + M.reagents.add_reagent("epinephrine", 1.2) + ..() + +/datum/reagent/sugar/overdose_start(mob/living/M) + to_chat(M, "You pass out from hyperglycemic shock!") + M.emote("collapse") + ..() + +/datum/reagent/sugar/overdose_process(mob/living/M, severity) + M.Paralyse(3 * severity) + M.Weaken(4 * severity) + if(prob(8)) + M.adjustToxLoss(severity) + +/datum/reagent/questionmark // food poisoning + name = "????" + id = "????" + description = "A gross and unidentifiable substance." + reagent_state = LIQUID + color = "#63DE63" + +/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST) + M.Stun(2) + M.Weaken(2) + to_chat(M, "Ugh! Eating that was a terrible idea!") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + +/datum/reagent/msg + name = "Monosodium glutamate" + id = "msg" + description = "Monosodium Glutamate is a sodium salt known chiefly for its use as a controversial flavor enhancer." + reagent_state = LIQUID + color = "#F5F5F5" + metabolization_rate = 0.2 + +/datum/reagent/msg/on_mob_life(mob/living/M) + if(prob(5)) + if(prob(10)) + M.adjustToxLoss(rand(2.4)) + if(prob(7)) + to_chat(M, "A horrible migraine overpowers you.") + M.Stun(rand(2,5)) + ..() + +/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST) + to_chat(M, "That tasted amazing!") + +/datum/reagent/cholesterol + name = "cholesterol" + id = "cholesterol" + description = "Pure cholesterol. Probably not very good for you." + reagent_state = LIQUID + color = "#FFFAC8" + +/datum/reagent/cholesterol/on_mob_life(mob/living/M) + if(volume >= 25 && prob(volume*0.15)) + to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!") + M.adjustToxLoss(rand(1,2)) + else if(volume >= 45 && prob(volume*0.08)) + to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!") + M.adjustToxLoss(rand(2,4)) + M.Stun(1) + else if(volume >= 150 && prob(volume*0.01)) + to_chat(M, "Your chest is burning with pain!") + M.Stun(1) + M.Weaken(1) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.heart_attack) + H.heart_attack = 1 + ..() + +/datum/reagent/fungus + name = "Space fungus" + id = "fungus" + description = "Scrapings of some unknown fungus found growing on the station walls." + reagent_state = LIQUID + color = "#C87D28" + +/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST) + var/ranchance = rand(1,10) + if(ranchance == 1) + to_chat(M, "You feel very sick.") + M.reagents.add_reagent("toxin", rand(1,5)) + else if(ranchance <= 5) + to_chat(M, "That tasted absolutely FOUL.") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + else + to_chat(M, "Yuck!") + +/datum/reagent/ectoplasm + name = "Ectoplasm" + id = "ectoplasm" + description = "A bizarre gelatinous substance supposedly derived from ghosts." + reagent_state = LIQUID + color = "#8EAE7B" + process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell + +/datum/reagent/ectoplasm/on_mob_life(mob/living/M) + var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...") + if(prob(8)) + to_chat(M, "[spooky_message]") + ..() + +/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == INGEST) + var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.") + to_chat(M, "[spooky_eat]") + +/datum/reagent/ectoplasm/reaction_turf(turf/T, volume) + if(volume >= 10 && !istype(T, /turf/space)) + new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T) + +///Vomit/// + +/datum/reagent/consumable/bread/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T) + +/datum/reagent/vomit + name = "Vomit" + id = "vomit" + description = "Looks like someone lost their lunch. And then collected it. Yuck." + reagent_state = LIQUID + color = "#FFFF00" + +/datum/reagent/vomit/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/vomit(T) + playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + +/datum/reagent/greenvomit + name = "Green vomit" + id = "green_vomit" + description = "Whoa, that can't be natural. That's horrible." + reagent_state = LIQUID + color = "#78FF74" + +/datum/reagent/greenvomit/reaction_turf(turf/T, volume) + if(volume >= 5 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/vomit/green(T) + playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) \ No newline at end of file diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm similarity index 56% rename from code/modules/reagents/newchem/medicine.dm rename to code/modules/reagents/chemistry/reagents/medicine.dm index 777c10ebfd7..b3b94ff7e88 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1,10 +1,151 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 +/datum/reagent/medicine + name = "Medicine" + id = "medicine" -#define REM REAGENTS_EFFECT_MULTIPLIER +/datum/reagent/medicine/hydrocodone + name = "Hydrocodone" + id = "hydrocodone" + description = "An extremely effective painkiller; may have long term abuse consequences." + reagent_state = LIQUID + color = "#C805DC" + metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units + shock_reduction = 200 -/datum/reagent/silver_sulfadiazine +/datum/reagent/medicine/hydrocodone/on_mob_life(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.traumatic_shock < 100) + H.shock_stage = 0 + ..() + +/datum/reagent/medicine/sterilizine + name = "Sterilizine" + id = "sterilizine" + description = "Sterilizes wounds in preparation for surgery." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + + //makes you squeaky clean +/datum/reagent/medicine/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + M.germ_level -= min(volume*20, M.germ_level) + +/datum/reagent/medicine/sterilizine/reaction_obj(obj/O, volume) + O.germ_level -= min(volume*20, O.germ_level) + +/datum/reagent/medicine/sterilizine/reaction_turf(turf/T, volume) + T.germ_level -= min(volume*20, T.germ_level) + +/datum/reagent/medicine/synaptizine + name = "Synaptizine" + id = "synaptizine" + description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis." + reagent_state = LIQUID + color = "#FA46FA" + overdose_threshold = 40 + +/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.SetSleeping(0) + if(prob(50)) + M.adjustBrainLoss(-1.0) + ..() + +/datum/reagent/medicine/synaptizine/overdose_process(mob/living/M, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.adjustToxLoss(1) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M] staggers and drools, their eyes bloodshot!") + M.Dizzy(8) + M.Weaken(4) + if(effect <= 15) + M.adjustToxLoss(1) + +/datum/reagent/medicine/mitocholide + name = "Mitocholide" + id = "mitocholide" + description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +/datum/reagent/medicine/mitocholide/on_mob_life(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + //Mitocholide is hard enough to get, it's probably fair to make this all internal organs + for(var/name in H.internal_organs) + var/obj/item/organ/internal/I = H.get_int_organ(name) + if(I.damage > 0) + I.damage = max(I.damage-0.4, 0) + ..() + +/datum/reagent/medicine/mitocholide/reaction_obj(obj/O, volume) + if(istype(O, /obj/item/organ)) + var/obj/item/organ/Org = O + Org.rejuvenate() + +/datum/reagent/medicine/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly." + reagent_state = LIQUID + color = "#0000C8" // rgb: 200, 165, 220 + heart_rate_decrease = 1 + +/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M) + if(M.bodytemperature < 265) + M.adjustCloneLoss(-4) + M.adjustOxyLoss(-10) + M.adjustToxLoss(-3) + M.adjustBruteLoss(-12) + M.adjustFireLoss(-12) + M.status_flags &= ~DISFIGURED + ..() + +/datum/reagent/medicine/rezadone + name = "Rezadone" + id = "rezadone" + description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage." + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + overdose_threshold = 30 + +/datum/reagent/medicine/rezadone/on_mob_life(mob/living/M) + M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. + M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate. + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + M.status_flags &= ~DISFIGURED + ..() + +/datum/reagent/medicine/rezadone/overdose_process(mob/living/M, severity) + M.adjustToxLoss(1) + M.Dizzy(5) + M.Jitter(5) + +/datum/reagent/medicine/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + description = "An all-purpose antibiotic agent extracted from space fungus." + reagent_state = LIQUID + color = "#0AB478" + metabolization_rate = 0.2 + +/datum/reagent/medicine/silver_sulfadiazine name = "Silver Sulfadiazine" id = "silver_sulfadiazine" description = "This antibacterial compound is used to treat burn victims." @@ -12,7 +153,11 @@ color = "#F0C814" metabolization_rate = 3 -/datum/reagent/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) +/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/M) + M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) if(iscarbon(M)) if(method == TOUCH) M.adjustFireLoss(-volume) @@ -24,11 +169,7 @@ to_chat(M, "You feel sick...") ..() -/datum/reagent/silver_sulfadiazine/on_mob_life(mob/living/M) - M.adjustFireLoss(-2*REM) - ..() - -/datum/reagent/styptic_powder +/datum/reagent/medicine/styptic_powder name = "Styptic Powder" id = "styptic_powder" description = "Styptic (aluminium sulfate) powder helps control bleeding and heal physical wounds." @@ -36,7 +177,11 @@ color = "#C8A5DC" metabolization_rate = 3 -/datum/reagent/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) +/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/M) + M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) if(iscarbon(M)) if(method == TOUCH) M.adjustBruteLoss(-volume) @@ -49,11 +194,7 @@ to_chat(M, "You feel gross!") ..() -/datum/reagent/styptic_powder/on_mob_life(mob/living/M) - M.adjustBruteLoss(-2*REM) - ..() - -/datum/reagent/salglu_solution +/datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds." @@ -62,24 +203,24 @@ penetrates_skin = 1 metabolization_rate = 0.15 -/datum/reagent/salglu_solution/on_mob_life(mob/living/M) +/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M) if(prob(33)) - M.adjustBruteLoss(-2*REM) - M.adjustFireLoss(-2*REM) + M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER) if(ishuman(M)) var/mob/living/carbon/human/H = M if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD) && prob(33)) H.vessel.add_reagent("blood", 1) ..() -/datum/reagent/synthflesh +/datum/reagent/medicine/synthflesh name = "Synthflesh" id = "synthflesh" description = "A resorbable microfibrillar collagen and protein mixture that can rapidly heal injuries when applied topically." reagent_state = LIQUID color = "#FFEBEB" -/datum/reagent/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) +/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1) if(iscarbon(M)) if(method == TOUCH) M.adjustBruteLoss(-1.5*volume) @@ -88,70 +229,27 @@ to_chat(M, "The synthetic flesh integrates itself into your wounds, healing you.") ..() -/datum/reagent/synthflesh/reaction_turf(turf/T, volume) //let's make a mess! +/datum/reagent/medicine/synthflesh/reaction_turf(turf/T, volume) //let's make a mess! if(volume >= 5 && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) -/datum/reagent/charcoal +/datum/reagent/medicine/charcoal name = "Charcoal" id = "charcoal" description = "Activated charcoal helps to absorb toxins." reagent_state = LIQUID color = "#000000" -/datum/reagent/charcoal/on_mob_life(mob/living/M) - M.adjustToxLoss(-1.5*REM) +/datum/reagent/medicine/charcoal/on_mob_life(mob/living/M) + M.adjustToxLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER) if(prob(50)) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,1) ..() -/datum/chemical_reaction/charcoal - name = "Charcoal" - id = "charcoal" - result = "charcoal" - required_reagents = list("ash" = 1, "sodiumchloride" = 1) - result_amount = 2 - mix_message = "The mixture yields a fine black powder." - min_temp = 380 - mix_sound = 'sound/goonstation/misc/fuse.ogg' - -/datum/chemical_reaction/silver_sulfadiazine - name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - result = "silver_sulfadiazine" - required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) - result_amount = 5 - mix_message = "A strong and cloying odor begins to bubble from the mixture." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/chemical_reaction/salglu_solution - name = "Saline-Glucose Solution" - id = "salglu_solution" - result = "salglu_solution" - required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) - result_amount = 3 - -/datum/chemical_reaction/synthflesh - name = "Synthflesh" - id = "synthflesh" - result = "synthflesh" - required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) - result_amount = 3 - mix_message = "The mixture knits together into a fibrous, bloody mass." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/chemical_reaction/styptic_powder - name = "Styptic Powder" - id = "styptic_powder" - result = "styptic_powder" - required_reagents = list("aluminum" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 4 - mix_message = "The solution yields an astringent powder." - -/datum/reagent/omnizine +/datum/reagent/medicine/omnizine name = "Omnizine" id = "omnizine" description = "Omnizine is a highly potent healing medication that can be used to treat a wide range of injuries." @@ -161,16 +259,16 @@ overdose_threshold = 30 addiction_chance = 5 -/datum/reagent/omnizine/on_mob_life(mob/living/M) - M.adjustToxLoss(-1*REM) - M.adjustOxyLoss(-1*REM) - M.adjustBruteLoss(-2*REM) - M.adjustFireLoss(-2*REM) +/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M) + M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER) if(prob(50)) - M.losebreath -= 1 + M.AdjustLoseBreath(-1) ..() -/datum/reagent/omnizine/overdose_process(mob/living/M, severity) +/datum/reagent/medicine/omnizine/overdose_process(mob/living/M, severity) var/effect = ..() if(severity == 1) //lesser M.stuttering += 1 @@ -181,7 +279,7 @@ M.Weaken(4) else if(effect <= 3) M.visible_message("[M] completely spaces out for a moment.") - M.confused += 15 + M.AdjustConfused(15) else if(effect <= 5) M.visible_message("[M] stumbles and staggers.") M.Dizzy(5) @@ -204,7 +302,7 @@ M.Dizzy(5) M.Weaken(3) -/datum/reagent/calomel +/datum/reagent/medicine/calomel name = "Calomel" id = "calomel" description = "This potent purgative rids the body of impurities. It is highly toxic however and close supervision is required." @@ -212,74 +310,48 @@ color = "#22AB35" metabolization_rate = 0.8 -/datum/reagent/calomel/on_mob_life(mob/living/M) +/datum/reagent/medicine/calomel/on_mob_life(mob/living/M) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,5) if(M.health > 20) - M.adjustToxLoss(5*REM) + M.adjustToxLoss(5*REAGENTS_EFFECT_MULTIPLIER) if(prob(6)) M.fakevomit() ..() -/datum/chemical_reaction/calomel - name = "Calomel" - id = "calomel" - result = "calomel" - required_reagents = list("mercury" = 1, "chlorine" = 1) - result_amount = 2 - min_temp = 374 - mix_message = "Stinging vapors rise from the solution." - -/datum/reagent/potass_iodide +/datum/reagent/medicine/potass_iodide name = "Potassium Iodide" id = "potass_iodide" description = "Potassium Iodide is a medicinal drug used to counter the effects of radiation poisoning." reagent_state = LIQUID color = "#B4DCBE" -/datum/reagent/potass_iodide/on_mob_life(mob/living/M) +/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M) if(prob(80)) M.radiation = max(0, M.radiation-1) ..() -/datum/chemical_reaction/potass_iodide - name = "Potassium Iodide" - id = "potass_iodide" - result = "potass_iodide" - required_reagents = list("potassium" = 1, "iodine" = 1) - result_amount = 2 - mix_message = "The solution settles calmly and emits gentle fumes." - -/datum/reagent/pen_acid +/datum/reagent/medicine/pen_acid name = "Pentetic Acid" id = "pen_acid" description = "Pentetic Acid is an aggressive chelation agent. May cause tissue damage. Use with caution." reagent_state = LIQUID color = "#C8A5DC" -/datum/reagent/pen_acid/on_mob_life(mob/living/M) +/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,4) M.radiation = max(0, M.radiation-7) if(prob(75)) - M.adjustToxLoss(-4*REM) + M.adjustToxLoss(-4*REAGENTS_EFFECT_MULTIPLIER) if(prob(33)) - M.adjustBruteLoss(1*REM) - M.adjustFireLoss(1*REM) + M.adjustBruteLoss(1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(1*REAGENTS_EFFECT_MULTIPLIER) ..() - return -/datum/chemical_reaction/pen_acid - name = "Pentetic Acid" - id = "pen_acid" - result = "pen_acid" - required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) - result_amount = 6 - mix_message = "The substance becomes very still, emitting a curious haze." - -/datum/reagent/sal_acid +/datum/reagent/medicine/sal_acid name = "Salicylic Acid" id = "sal_acid" description = "This is a is a standard salicylate pain reliever and fever reducer." @@ -289,25 +361,16 @@ shock_reduction = 25 overdose_threshold = 25 -/datum/reagent/sal_acid/on_mob_life(mob/living/M) +/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/M) if(prob(55)) - M.adjustBruteLoss(-2*REM) + M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.traumatic_shock < 100) H.shock_stage = 0 ..() -/datum/chemical_reaction/sal_acid - name = "Salicyclic Acid" - id = "sal_acid" - result = "sal_acid" - required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 5 - mix_message = "The mixture crystallizes." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/salbutamol +/datum/reagent/medicine/salbutamol name = "Salbutamol" id = "salbutamol" description = "Salbutamol is a common bronchodilation medication for asthmatics. It may help with other breathing problems as well." @@ -315,21 +378,12 @@ color = "#00FFFF" metabolization_rate = 0.2 -/datum/reagent/salbutamol/on_mob_life(mob/living/M) - M.adjustOxyLoss(-6*REM) - M.losebreath = max(0, M.losebreath-4) +/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/M) + M.adjustOxyLoss(-6*REAGENTS_EFFECT_MULTIPLIER) + M.AdjustLoseBreath(-4) ..() -/datum/chemical_reaction/salbutamol - name = "Salbutamol" - id = "salbutamol" - result = "salbutamol" - required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminum" = 1, "bromine" = 1, "ammonia" = 1) - result_amount = 5 - mix_message = "The solution bubbles freely, creating a head of bluish foam." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/perfluorodecalin +/datum/reagent/medicine/perfluorodecalin name = "Perfluorodecalin" id = "perfluorodecalin" description = "This experimental perfluoronated solvent has applications in liquid breathing and tissue oxygenation. Use with caution." @@ -338,27 +392,17 @@ metabolization_rate = 0.2 addiction_chance = 20 -/datum/reagent/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) - M.adjustOxyLoss(-25*REM) +/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) + M.adjustOxyLoss(-25*REAGENTS_EFFECT_MULTIPLIER) if(volume >= 4) - M.losebreath = max(M.losebreath, 6) - M.silent = max(M.silent, 6) + M.LoseBreath(6) + M.Silence(6) if(prob(33)) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) + M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER) ..() -/datum/chemical_reaction/perfluorodecalin - name = "Perfluorodecalin" - id = "perfluorodecalin" - result = "perfluorodecalin" - required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) - result_amount = 3 - min_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/ephedrine +/datum/reagent/medicine/ephedrine name = "Ephedrine" id = "ephedrine" description = "Ephedrine is a plant-derived stimulant." @@ -368,14 +412,13 @@ overdose_threshold = 35 addiction_chance = 25 -/datum/reagent/ephedrine/on_mob_life(mob/living/M) - M.drowsyness = max(0, M.drowsyness-5) +/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) M.AdjustParalysis(-1) M.AdjustStunned(-1) M.AdjustWeakened(-1) - M.adjustStaminaLoss(-1*REM) - if(M.losebreath > 5) - M.losebreath = max(5, M.losebreath-1) + M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.AdjustLoseBreath(-1, bound_lower = 5) if(M.oxyloss > 75) M.adjustOxyLoss(-1) if(M.health < 0 || M.health > 0 && prob(33)) @@ -384,7 +427,7 @@ M.adjustFireLoss(-1) ..() -/datum/reagent/ephedrine/overdose_process(mob/living/M, severity) +/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, severity) var/effect = ..() if(severity == 1) if(effect <= 1) @@ -405,15 +448,7 @@ if(effect <= 15) M.emote("collapse") -/datum/chemical_reaction/ephedrine - name = "Ephedrine" - id = "ephedrine" - result = "ephedrine" - required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) - result_amount = 4 - mix_message = "The solution fizzes and gives off toxic fumes." - -/datum/reagent/diphenhydramine +/datum/reagent/medicine/diphenhydramine name = "Diphenhydramine" id = "diphenhydramine" description = "Anti-allergy medication. May cause drowsiness, do not operate heavy machinery while using this." @@ -421,28 +456,19 @@ color = "#5BCBE1" addiction_chance = 10 -/datum/reagent/diphenhydramine/on_mob_life(mob/living/M) - M.jitteriness = max(0, M.jitteriness-20) +/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/M) + M.AdjustJitter(-20) M.reagents.remove_reagent("histamine",3) M.reagents.remove_reagent("itching_powder",3) if(prob(7)) M.emote("yawn") if(prob(3)) M.Stun(2) - M.drowsyness += 1 + M.AdjustDrowsy(1) M.visible_message("[M] looks a bit dazed.") ..() -/datum/chemical_reaction/diphenhydramine - name = "Diphenhydramine" - id = "diphenhydramine" - result = "diphenhydramine" - required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) - result_amount = 4 - mix_message = "The mixture fizzes gently." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/morphine +/datum/reagent/medicine/morphine name = "Morphine" id = "morphine" description = "A strong but highly addictive opiate painkiller with sedative side effects." @@ -452,60 +478,50 @@ addiction_chance = 50 shock_reduction = 50 -/datum/reagent/morphine/on_mob_life(mob/living/M) - M.jitteriness = max(0, M.jitteriness-25) +/datum/reagent/medicine/morphine/on_mob_life(mob/living/M) + M.AdjustJitter(-25) switch(current_cycle) if(1 to 15) if(prob(7)) M.emote("yawn") if(16 to 35) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(36 to INFINITY) M.Paralyse(15) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.traumatic_shock < 100) H.shock_stage = 0 ..() -/datum/reagent/oculine/on_mob_life(mob/living/M) +/datum/reagent/medicine/oculine + name = "Oculine" + id = "oculine" + description = "Oculine is a saline eye medication with mydriatic and antibiotic effects." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/reagent/medicine/oculine/on_mob_life(mob/living/M) if(prob(80)) if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) if(istype(E)) E.damage = max(E.damage-1, 0) - M.eye_blurry = max(M.eye_blurry-1 , 0) - M.adjustEarDamage(-1,0) + M.AdjustEyeBlurry(-1) + M.AdjustEarDamage(-1) if(prob(50)) - M.disabilities &= ~NEARSIGHTED + M.CureNearsighted() if(prob(30)) - M.disabilities &= ~BLIND - M.eye_blind = 0 + M.CureBlind() + M.SetEyeBlind(0) if(M.ear_damage <= 25) if(prob(30)) - M.setEarDamage(-1,0) + M.SetEarDeaf(0) ..() -/datum/chemical_reaction/oculine - name = "Oculine" - id = "oculine" - result = "oculine" - required_reagents = list("atropine" = 1, "spaceacillin" = 1, "salglu_solution" = 1) - result_amount = 3 - mix_message = "The mixture settles, becoming a milky white." - -/datum/reagent/oculine - name = "Oculine" - id = "oculine" - description = "Oculine is a saline eye medication with mydriatic and antibiotic effects." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.4 - var/cycle_amount = 0 - -/datum/reagent/atropine +/datum/reagent/medicine/atropine name = "Atropine" id = "atropine" description = "Atropine is a potent cardiac resuscitant but it can causes confusion, dizzyness and hyperthermia." @@ -514,33 +530,24 @@ metabolization_rate = 0.2 overdose_threshold = 25 -/datum/reagent/atropine/on_mob_life(mob/living/M) - M.dizziness += 1 - M.confused = max(M.confused, 5) +/datum/reagent/medicine/atropine/on_mob_life(mob/living/M) + M.AdjustDizzy(1) + M.Confused(5) if(prob(4)) M.emote("collapse") - if(M.losebreath > 5) - M.losebreath = max(5, M.losebreath-5) + M.AdjustLoseBreath(-5, bound_lower = 5) if(M.oxyloss > 65) - M.adjustOxyLoss(-10*REM) + M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER) if(M.health < -25) M.adjustToxLoss(-1) - M.adjustBruteLoss(-3*REM) - M.adjustFireLoss(-3*REM) + M.adjustBruteLoss(-3*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-3*REAGENTS_EFFECT_MULTIPLIER) else if(M.health > -60) M.adjustToxLoss(1) M.reagents.remove_reagent("sarin", 20) ..() -/datum/chemical_reaction/atropine - name = "Atropine" - id = "atropine" - result = "atropine" - required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) - result_amount = 5 - mix_message = "A horrid smell like something died drifts from the mixture." - -/datum/reagent/epinephrine +/datum/reagent/medicine/epinephrine name = "Epinephrine" id = "epinephrine" description = "Epinephrine is a potent neurotransmitter, used in medical emergencies to halt anaphylactic shock and prevent cardiac arrest." @@ -549,8 +556,8 @@ metabolization_rate = 0.2 overdose_threshold = 20 -/datum/reagent/epinephrine/on_mob_life(mob/living/M) - M.drowsyness = max(0, M.drowsyness-5) +/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) if(prob(20)) M.AdjustParalysis(-1) if(prob(20)) @@ -562,17 +569,16 @@ if(prob(5)) M.adjustBrainLoss(-1) holder.remove_reagent("histamine", 15) - if(M.losebreath > 3) - M.losebreath-- + M.AdjustLoseBreath(-1, bound_lower = 3) if(M.oxyloss > 35) - M.adjustOxyLoss(-10*REM) + M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER) if(M.health < -10 && M.health > -65) - M.adjustToxLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) + M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER) ..() -/datum/reagent/epinephrine/overdose_process(mob/living/M, severity) +/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M, severity) var/effect = ..() if(severity == 1) if(effect <= 1) @@ -593,16 +599,7 @@ if(effect <= 15) M.emote("collapse") -/datum/chemical_reaction/epinephrine - name = "Epinephrine" - id = "epinephrine" - result = "epinephrine" - required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) - result_amount = 6 - mix_message = "Tiny white crystals precipitate out of the solution." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/strange_reagent +/datum/reagent/medicine/strange_reagent name = "Strange Reagent" id = "strange_reagent" description = "A glowing green fluid highly reminiscent of nuclear waste." @@ -610,7 +607,13 @@ color = "#A0E85E" metabolization_rate = 0.2 -/datum/reagent/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume) +/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/M) + if(prob(10)) + M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER) + M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume) if(isanimal(M)) if(method == TOUCH) var/mob/living/simple_animal/SM = M @@ -642,59 +645,24 @@ add_logs(M, M, "revived", object="strange reagent") //Yes, the logs say you revived yourself. ..() -/datum/reagent/strange_reagent/on_mob_life(mob/living/M) - if(prob(10)) - M.adjustBruteLoss(2*REM) - M.adjustToxLoss(2*REM) - ..() - -/datum/chemical_reaction/strange_reagent - name = "Strange Reagent" - id = "strange_reagent" - result = "strange_reagent" - required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) - result_amount = 3 - mix_message = "The substance begins moving on its own somehow." - -/datum/reagent/life - name = "Life" - id = "life" - description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -/datum/chemical_reaction/life - name = "Life" - id = "life" - result = null - required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) - result_amount = 3 - min_temp = 374 - -/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) - chemical_mob_spawn(holder, 1, "Life") - -/datum/reagent/mannitol/on_mob_life(mob/living/M) - M.adjustBrainLoss(-3) - ..() - -/datum/chemical_reaction/mannitol - name = "Mannitol" - id = "mannitol" - result = "mannitol" - required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) - result_amount = 3 - mix_message = "The mixture bubbles slowly, making a slightly sweet odor." - -/datum/reagent/mannitol +/datum/reagent/medicine/mannitol name = "Mannitol" id = "mannitol" description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling." color = "#D1D1F1" -/datum/reagent/mutadone/on_mob_life(mob/living/carbon/human/M) - M.jitteriness = 0 +/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M) + M.adjustBrainLoss(-3) + ..() + +/datum/reagent/medicine/mutadone + name = "Mutadone" + id = "mutadone" + description = "Mutadone is an experimental bromide that can cure genetic abnomalities." + color = "#5096C8" + +/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M) + M.SetJitter(0) var/needs_update = M.mutations.len > 0 || M.disabilities > 0 if(needs_update) @@ -711,62 +679,38 @@ H.update_mutations() ..() -/datum/chemical_reaction/mutadone - name = "Mutadone" - id = "mutadone" - result = "mutadone" - required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) - result_amount = 3 - mix_message = "A foul astringent liquid emerges from the reaction." - - -/datum/reagent/mutadone - name = "Mutadone" - id = "mutadone" - description = "Mutadone is an experimental bromide that can cure genetic abnomalities." - color = "#5096C8" - -/datum/reagent/antihol +/datum/reagent/medicine/antihol name = "Antihol" id = "antihol" description = "A medicine which quickly eliminates alcohol in the body." color = "#009CA8" -/datum/reagent/antihol/on_mob_life(mob/living/M) - M.slurring = 0 +/datum/reagent/medicine/antihol/on_mob_life(mob/living/M) + M.SetSlur(0) M.AdjustDrunk(-4) - M.reagents.remove_all_type(/datum/reagent/ethanol, 8, 0, 1) + M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 8, 0, 1) if(M.toxloss <= 25) M.adjustToxLoss(-2.0) ..() -/datum/chemical_reaction/antihol - name = "antihol" - id = "antihol" - result = "antihol" - required_reagents = list("ethanol" = 1, "charcoal" = 1) - result_amount = 2 - mix_message = "A minty and refreshing smell drifts from the effervescent mixture." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/stimulants +/datum/reagent/medicine/stimulants name = "Stimulants" id = "stimulants" description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." color = "#C8A5DC" - metabolization_rate = 0.4 + can_synth = 0 -/datum/reagent/stimulants/on_mob_life(mob/living/M) +/datum/reagent/medicine/stimulants/on_mob_life(mob/living/M) if(volume > 5) - M.adjustOxyLoss(-5*REM) - M.adjustToxLoss(-5*REM) - M.adjustBruteLoss(-10*REM) - M.adjustFireLoss(-10*REM) + M.adjustOxyLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustToxLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-10*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-10*REAGENTS_EFFECT_MULTIPLIER) M.setStaminaLoss(0) - M.slowed = 0 - M.dizziness = max(0,M.dizziness-10) - M.drowsyness = max(0,M.drowsyness-10) - M.confused = 0 + M.SetSlowed(0) + M.AdjustDizzy(-10) + M.AdjustDrowsy(-10) + M.SetConfused(0) M.SetSleeping(0) var/status = CANSTUN | CANWEAKEN | CANPARALYSE M.status_flags &= ~status @@ -778,7 +722,7 @@ M.Stun(3) ..() -/datum/reagent/stimulants/reagent_deleted(mob/living/M) +/datum/reagent/medicine/stimulants/on_mob_delete(mob/living/M) M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE ..() @@ -789,57 +733,49 @@ color = "#C8A5DC" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 + can_synth = 0 /datum/reagent/medicine/stimulative_agent/on_mob_life(mob/living/M) M.status_flags |= GOTTAGOFAST if(M.health < 50 && M.health > 0) - M.adjustOxyLoss(-1*REM) - M.adjustToxLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) + M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER) M.AdjustParalysis(-3) M.AdjustStunned(-3) M.AdjustWeakened(-3) - M.adjustStaminaLoss(-5*REM) + M.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) ..() -/datum/reagent/medicine/stimulative_agent/reagent_deleted(mob/living/M) +/datum/reagent/medicine/stimulative_agent/on_mob_delete(mob/living/M) M.status_flags &= ~GOTTAGOFAST ..() /datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity) if(prob(33)) - M.adjustStaminaLoss(2.5*REM) - M.adjustToxLoss(1*REM) - M.losebreath++ + M.adjustStaminaLoss(2.5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) + M.AdjustLoseBreath(1) -/datum/reagent/insulin +/datum/reagent/medicine/insulin name = "Insulin" id = "insulin" description = "A hormone generated by the pancreas responsible for metabolizing carbohydrates and fat in the bloodstream." reagent_state = LIQUID color = "#C8A5DC" -/datum/reagent/insulin/on_mob_life(mob/living/M) +/datum/reagent/medicine/insulin/on_mob_life(mob/living/M) M.reagents.remove_reagent("sugar", 5) ..() - -/datum/reagent/simethicone +/datum/reagent/medicine/simethicone name = "Simethicone" id = "simethicone" description = "This strange liquid seems to have no bubbles on the surface." color = "#14AA46" -/datum/chemical_reaction/Simethicone - name = "Simethicone" - id = "simethicone" - result = "simethicone" - required_reagents = list("hydrogen" = 1, "chlorine" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 4 - - -/datum/reagent/teporone +/datum/reagent/medicine/teporone name = "Teporone" id = "teporone" description = "This experimental plasma-based compound seems to regulate body temperature." @@ -848,30 +784,21 @@ addiction_chance = 20 overdose_threshold = 50 -/datum/reagent/teporone/on_mob_life(mob/living/M) +/datum/reagent/medicine/teporone/on_mob_life(mob/living/M) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) ..() -/datum/chemical_reaction/teporone - name = "Teporone" - id = "teporone" - result = "teporone" - required_reagents = list("acetone" = 1, "silicon" = 1, "plasma" = 1) - result_amount = 2 - mix_message = "The mixture turns an odd lavender color." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/haloperidol +/datum/reagent/medicine/haloperidol name = "Haloperidol" id = "haloperidol" description = "Haloperidol is a powerful antipsychotic and sedative. Will help control psychiatric problems, but may cause brain damage." reagent_state = LIQUID color = "#FFDCFF" -/datum/reagent/haloperidol/on_mob_life(mob/living/M) +/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M) M.reagents.remove_reagent("crank", 5) M.reagents.remove_reagent("methamphetamine", 5) M.reagents.remove_reagent("space_drugs", 5) @@ -882,135 +809,55 @@ M.reagents.remove_reagent("bath_salts", 5) M.reagents.remove_reagent("lsd", 5) M.reagents.remove_reagent("thc", 5) - M.druggy -= 5 - M.hallucination -= 5 - M.jitteriness -= 5 + M.AdjustDruggy(-5) + M.AdjustHallucinate(-5) + M.AdjustJitter(-5) if(prob(50)) - M.drowsyness = max(M.drowsyness, 3) + M.Drowsy(3) if(prob(10)) M.emote("drool") if(prob(20)) M.adjustBrainLoss(1) ..() -/datum/chemical_reaction/haloperidol - name = "Haloperidol" - id = "haloperidol" - result = "haloperidol" - required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1) - result_amount = 4 - mix_message = "The chemicals mix into an odd pink slush." - - -/datum/reagent/ether +/datum/reagent/medicine/ether name = "Ether" id = "ether" description = "A strong anesthetic and sedative." reagent_state = LIQUID color = "#96DEDE" -/datum/reagent/ether/on_mob_life(mob/living/M) - M.jitteriness = max(M.jitteriness-25,0) +/datum/reagent/medicine/ether/on_mob_life(mob/living/M) + M.AdjustJitter(-25) switch(current_cycle) if(1 to 15) if(prob(7)) M.emote("yawn") if(16 to 35) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(36 to INFINITY) M.Paralyse(15) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) ..() -/datum/chemical_reaction/ether - name = "Ether" - id = "ether" - result = "ether" - required_reagents = list("sacid" = 1, "ethanol" = 1, "oxygen" = 1) - result_amount = 1 - mix_message = "The mixture yields a pungent odor, which makes you tired." - -////////////////////////////// -// Synth-Meds // -////////////////////////////// - -//Degreaser: Mild Purgative / Lube Remover -/datum/reagent/degreaser - name = "Degreaser" - id = "degreaser" - description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces." - reagent_state = LIQUID - color = "#CC7A00" - process_flags = SYNTHETIC - -/datum/chemical_reaction/degreaser - name = "Degreaser" - id = "degreaser" - result = "degreaser" - required_reagents = list("oil" = 1, "sterilizine" = 1) - result_amount = 2 - -/datum/reagent/degreaser/reaction_turf(turf/simulated/T, volume) - if(volume >= 1 && istype(T)) - if(T.wet) - T.MakeDry(TURF_WET_LUBE) - -/datum/reagent/degreaser/on_mob_life(mob/living/M) - if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.confused = max(0, M.confused-5) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - if(R.id == "ultralube" || R.id == "lube") - //Flushes lube and ultra-lube even faster than other chems - M.reagents.remove_reagent(R.id, 5) - else - M.reagents.remove_reagent(R.id,1) - ..() - -//Liquid Solder: Mannitol -/datum/reagent/liquid_solder - name = "Liquid Solder" - id = "liquid_solder" - description = "A solution formulated to clean and repair damaged connections in posibrains while in use." - reagent_state = LIQUID - color = "#D7B395" - process_flags = SYNTHETIC - -/datum/reagent/liquid_solder/on_mob_life(mob/living/M) - M.adjustBrainLoss(-3) - ..() - -/datum/chemical_reaction/liquid_solder - name = "Liquid Solder" - id = "liquid_solder" - result = "liquid_solder" - required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1) - result_amount = 3 - min_temp = 370 - mix_message = "The solution gently swirls with a metallic sheen." - - /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" id = "syndicate_nanites" description = "Miniature medical robots that swiftly restore bodily damage. May begin to attack their host's cells in high amounts." reagent_state = SOLID color = "#555555" + can_synth = 0 /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M) - M.adjustBruteLoss(-5*REM) //A ton of healing - this is a 50 telecrystal investment. - M.adjustFireLoss(-5*REM) - M.adjustOxyLoss(-15*REM) - M.adjustToxLoss(-5*REM) - M.adjustBrainLoss(-15*REM) - M.adjustCloneLoss(-3*REM) + M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER) //A ton of healing - this is a 50 telecrystal investment. + M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustOxyLoss(-15*REAGENTS_EFFECT_MULTIPLIER) + M.adjustToxLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBrainLoss(-15*REAGENTS_EFFECT_MULTIPLIER) + M.adjustCloneLoss(-3*REAGENTS_EFFECT_MULTIPLIER) ..() - -/datum/reagent/omnizine_diluted +/datum/reagent/medicine/omnizine_diluted name = "Diluted Omnizine" id = "weak_omnizine" description = "Slowly heals all damage types. A far weaker substitute than actual omnizine." @@ -1019,14 +866,14 @@ overdose_threshold = 30 metabolization_rate = 0.1 -/datum/reagent/omnizine_diluted/on_mob_life(mob/living/M) - M.adjustToxLoss(-0.5*REM) - M.adjustOxyLoss(-0.5*REM) - M.adjustBruteLoss(-0.5*REM) - M.adjustFireLoss(-0.5*REM) +/datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M) + M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustOxyLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) ..() -/datum/reagent/omnizine_diluted/overdose_process(mob/living/M, severity) +/datum/reagent/medicine/omnizine_diluted/overdose_process(mob/living/M, severity) var/effect = ..() if(severity == 1) //lesser M.stuttering += 1 @@ -1037,7 +884,7 @@ M.Weaken(4) else if(effect <= 3) M.visible_message("[M] completely spaces out for a moment.") - M.confused += 15 + M.AdjustConfused(15) else if(effect <= 5) M.visible_message("[M] stumbles and staggers.") M.Dizzy(5) @@ -1059,3 +906,68 @@ M.visible_message("[M] stumbles and staggers.") M.Dizzy(5) M.Weaken(3) + +//virus-specific symptom reagents + +/datum/reagent/medicine/synaphydramine + name = "Diphen-Synaptizine" + id = "synaphydramine" + description = "Reduces drowsiness and hallucinations while also purging histamine from the body." + color = "#EC536D" // rgb: 236, 83, 109 + +/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/M) + M.AdjustDrowsy(-5) + if(holder.has_reagent("lsd")) + holder.remove_reagent("lsd", 5) + if(holder.has_reagent("histamine")) + holder.remove_reagent("histamine", 5) + M.AdjustHallucinate(-10) + if(prob(30)) + M.adjustToxLoss(1) + ..() + +////////////////////////////// +// Synth-Meds // +////////////////////////////// + +//Degreaser: Mild Purgative / Lube Remover +/datum/reagent/medicine/degreaser + name = "Degreaser" + id = "degreaser" + description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces." + reagent_state = LIQUID + color = "#CC7A00" + process_flags = SYNTHETIC + +/datum/reagent/medicine/degreaser/on_mob_life(mob/living/M) + if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.AdjustConfused(-5) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + if(R.id == "ultralube" || R.id == "lube") + //Flushes lube and ultra-lube even faster than other chems + M.reagents.remove_reagent(R.id, 5) + else + M.reagents.remove_reagent(R.id,1) + ..() + +/datum/reagent/medicine/degreaser/reaction_turf(turf/simulated/T, volume) + if(volume >= 1 && istype(T)) + if(T.wet) + T.MakeDry(TURF_WET_LUBE) + +//Liquid Solder: Mannitol +/datum/reagent/medicine/liquid_solder + name = "Liquid Solder" + id = "liquid_solder" + description = "A solution formulated to clean and repair damaged connections in posibrains while in use." + reagent_state = LIQUID + color = "#D7B395" + process_flags = SYNTHETIC + +/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) + M.adjustBrainLoss(-3) + ..() \ No newline at end of file diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/chemistry/reagents/misc.dm similarity index 57% rename from code/modules/reagents/newchem/other.dm rename to code/modules/reagents/chemistry/reagents/misc.dm index 2ff4a18c3d0..bb386d0215c 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -1,9 +1,189 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REM REAGENTS_EFFECT_MULTIPLIER +/*/datum/reagent/silicate + name = "Silicate" + id = "silicate" + description = "A compound that can be used to reinforce glass." + reagent_state = LIQUID + color = "#C7FFFF" // rgb: 199, 255, 255 -var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") +/datum/reagent/silicate/reaction_obj(obj/O, volume) + 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 */ + + +/datum/reagent/oxygen + name = "Oxygen" + id = "oxygen" + description = "A colorless, odorless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + +/datum/reagent/nitrogen + name = "Nitrogen" + id = "nitrogen" + description = "A colorless, odorless, tasteless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + +/datum/reagent/hydrogen + name = "Hydrogen" + id = "hydrogen" + description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + +/datum/reagent/potassium + name = "Potassium" + id = "potassium" + description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + reagent_state = SOLID + color = "#A0A0A0" // rgb: 160, 160, 160 + + +/datum/reagent/sulfur + name = "Sulfur" + id = "sulfur" + description = "A chemical element." + reagent_state = SOLID + color = "#BF8C00" // rgb: 191, 140, 0 + + +/datum/reagent/sodium + name = "Sodium" + id = "sodium" + description = "A chemical element." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + + +/datum/reagent/phosphorus + name = "Phosphorus" + id = "phosphorus" + description = "A chemical element." + reagent_state = SOLID + color = "#832828" // rgb: 131, 40, 40 + + +/datum/reagent/carbon + name = "Carbon" + id = "carbon" + description = "A chemical element." + reagent_state = SOLID + color = "#1C1300" // rgb: 30, 20, 0 + +/datum/reagent/carbon/reaction_turf(turf/T, volume) + if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash. + new /obj/effect/decal/cleanable/dirt(T) + +/datum/reagent/gold + name = "Gold" + id = "gold" + description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." + reagent_state = SOLID + color = "#F7C430" // rgb: 247, 196, 48 + + +/datum/reagent/silver + name = "Silver" + id = "silver" + description = "A lustrous metallic element regarded as one of the precious metals." + reagent_state = SOLID + color = "#D0D0D0" // rgb: 208, 208, 208 + + +/datum/reagent/aluminum + name = "Aluminum" + id = "aluminum" + description = "A silvery white and ductile member of the boron group of chemical elements." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + + +/datum/reagent/silicon + name = "Silicon" + id = "silicon" + description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + + +/datum/reagent/copper + name = "Copper" + id = "copper" + description = "A highly ductile metal." + color = "#6E3B08" // rgb: 110, 59, 8 + + +/datum/reagent/iron + name = "Iron" + id = "iron" + description = "Pure iron is a metal." + reagent_state = SOLID + color = "#C8A5DC" // rgb: 200, 165, 220 + +/datum/reagent/iron/on_mob_life(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD)) + H.vessel.add_reagent("blood", 0.8) + ..() + +//foam +/datum/reagent/fluorosurfactant + name = "Fluorosurfactant" + id = "fluorosurfactant" + description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + reagent_state = LIQUID + color = "#9E6B38" // rgb: 158, 107, 56 + +// metal foaming agent +// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually +/datum/reagent/ammonia + name = "Ammonia" + id = "ammonia" + description = "A caustic substance commonly used in fertilizer or household cleaners." + reagent_state = GAS + color = "#404030" // rgb: 64, 64, 48 + +/datum/reagent/diethylamine + name = "Diethylamine" + id = "diethylamine" + description = "A secondary amine, useful as a plant nutrient and as building block for other compounds." + reagent_state = LIQUID + color = "#322D00" + +// Allows you to make planks from any plant that has this reagent in it. +// Also vines with this reagent are considered dense. +/datum/reagent/woodpulp + name = "Wood Pulp" + id = "woodpulp" + description = "A mass of wood fibers." + reagent_state = LIQUID + color = "#B97A57" /datum/reagent/oil name = "Oil" @@ -64,49 +244,12 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 M.adjustToxLoss(1.5) ..() -/datum/chemical_reaction/acetone - name = "acetone" - id = "acetone" - result = "acetone" - required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) - result_amount = 3 - mix_message = "The smell of paint thinner assaults you as the solution bubbles." - -/datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - result = "carpet" - required_reagents = list("fungus" = 1, "blood" = 1) - result_amount = 2 - mix_message = "The substance turns thick and stiff, yet soft." - - -/datum/chemical_reaction/oil - name = "Oil" - id = "oil" - result = "oil" - required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) - result_amount = 3 - mix_message = "An iridescent black chemical forms in the container." - -/datum/chemical_reaction/phenol - name = "phenol" - id = "phenol" - result = "phenol" - required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) - result_amount = 3 - mix_message = "The mixture bubbles and gives off an unpleasant medicinal odor." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/chemical_reaction/ash - name = "Ash" - id = "ash" - result = "ash" - required_reagents = list("oil" = 1) - result_amount = 0.5 - min_temp = 480 - mix_sound = null - no_message = 1 +/datum/reagent/saltpetre + name = "Saltpetre" + id = "saltpetre" + description = "Volatile." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 /datum/reagent/colorful_reagent name = "Colorful Reagent" @@ -115,14 +258,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 reagent_state = LIQUID color = "#FFFFFF" -/datum/chemical_reaction/colorful_reagent - name = "colorful_reagent" - id = "colorful_reagent" - result = "colorful_reagent" - required_reagents = list("plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1, "stabilizing_agent" = 1) - result_amount = 6 - mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector." - /datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume) if(isanimal(M)) M.color = pick(random_color_list) @@ -138,40 +273,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 T.color = pick(random_color_list) ..() -/datum/chemical_reaction/corgium - name = "corgium" - id = "corgium" - result = null - required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) - result_amount = 3 - min_temp = 374 - -/datum/reagent/corgium - name = "Corgium" - id = "corgium" - description = "Corgi in liquid form. Don't ask." - reagent_state = LIQUID - color = "#F9A635" - -/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /mob/living/simple_animal/pet/corgi(location) - ..() - -/datum/chemical_reaction/flaptonium - name = "Flaptonium" - id = "flaptonium" - result = null - required_reagents = list("egg" = 1, "colorful_reagent" = 1, "chicken_soup" = 1, "strange_reagent" = 1, "blood" = 1) - result_amount = 5 - min_temp = 374 - mix_message = "The substance turns an airy sky-blue and foams up into a new shape." - -/datum/chemical_reaction/flaptonium/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /mob/living/simple_animal/parrot(location) - ..() - /datum/reagent/hair_dye name = "Quantum Hair Dye" id = "hair_dye" @@ -179,13 +280,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 reagent_state = LIQUID color = "#960096" -/datum/chemical_reaction/hair_dye - name = "hair_dye" - id = "hair_dye" - result = "hair_dye" - required_reagents = list("colorful_reagent" = 1, "hairgrownium" = 1) - result_amount = 2 - /datum/reagent/hair_dye/reaction_mob(mob/living/M, volume) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -208,14 +302,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 color = "#5DDA5D" penetrates_skin = 1 -/datum/chemical_reaction/hairgrownium - name = "hairgrownium" - id = "hairgrownium" - result = "hairgrownium" - required_reagents = list("carpet" = 1, "synthflesh" = 1, "ephedrine" = 1) - result_amount = 3 - mix_message = "The liquid becomes slightly hairy." - /datum/reagent/hairgrownium/reaction_mob(mob/living/M, volume) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -234,15 +320,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 color = "#5DD95D" penetrates_skin = 1 - -/datum/chemical_reaction/super_hairgrownium - name = "Super Hairgrownium" - id = "super_hairgrownium" - result = "super_hairgrownium" - required_reagents = list("iron" = 1, "methamphetamine" = 1, "hairgrownium" = 1) - result_amount = 3 - mix_message = "The liquid becomes amazingly furry and smells peculiar." - /datum/reagent/super_hairgrownium/reaction_mob(mob/living/M, volume) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -275,14 +352,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 reagent_state = GAS color = "#D06E27" -/datum/chemical_reaction/fartonium - name = "Fartonium" - id = "fartonium" - result = "fartonium" - required_reagents = list("fake_cheese" = 1, "beans" = 1, "????" = 1, "egg" = 1) - result_amount = 2 - mix_message = "The substance makes a little 'toot' noise and starts to smell pretty bad." - /datum/reagent/fartonium/on_mob_life(mob/living/M) if(prob(66)) M.emote("fart") @@ -299,49 +368,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 M.adjustBruteLoss(4) ..() -/datum/chemical_reaction/soapification - name = "Soapification" - id = "soapification" - result = null - required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles - min_temp = 374 - result_amount = 1 - - -/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/soap/homemade(location) - -/datum/chemical_reaction/candlefication - name = "Candlefication" - id = "candlefication" - result = null - required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // - min_temp = 374 - result_amount = 1 - -/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/candle(location) - -/datum/chemical_reaction/meatification - name = "Meatification" - id = "meatification" - result = null - required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) - result_amount = 1 - -/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location) - -/datum/chemical_reaction/lye - name = "lye" - id = "lye" - result = "lye" - required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1) - result_amount = 3 - /datum/reagent/hugs name = "Pure hugs" id = "hugs" @@ -356,9 +382,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 reagent_state = LIQUID color = "#FF83A5" -/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume) - to_chat(M, "You feel loved!") - /datum/reagent/love/on_mob_life(mob/living/M) if(M.a_intent == I_HARM) M.a_intent = I_HELP @@ -378,13 +401,53 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 break ..() -/datum/chemical_reaction/love - name = "pure love" - id = "love" - result = "love" - required_reagents = list("hugs" = 1, "chocolate" = 1) - result_amount = 2 - mix_message = "The substance gives off a lovely scent!" +/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume) + to_chat(M, "You feel loved!") + +/datum/reagent/royal_bee_jelly + name = "royal bee jelly" + id = "royal_bee_jelly" + description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." + color = "#00ff80" + +/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/M) + if(prob(2)) + M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz...")) + ..() + +/datum/reagent/toxin/coffeepowder + name = "Coffee Grounds" + id = "coffeepowder" + description = "Finely ground Coffee beans, used to make coffee." + reagent_state = SOLID + color = "#5B2E0D" // rgb: 91, 46, 13 + +/datum/reagent/toxin/teapowder + name = "Ground Tea Leaves" + id = "teapowder" + description = "Finely shredded Tea leaves, used for making tea." + reagent_state = SOLID + color = "#7F8400" // rgb: 127, 132, 0 + +//Reagents used for plant fertilizers. +/datum/reagent/toxin/fertilizer + name = "fertilizer" + id = "fertilizer" + description = "A chemical mix good for growing plants with." + reagent_state = LIQUID + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/toxin/fertilizer/eznutrient + name = "EZ Nutrient" + id = "eznutrient" + +/datum/reagent/toxin/fertilizer/left4zed + name = "Left-4-Zed" + id = "left4zed" + +/datum/reagent/toxin/fertilizer/robustharvest + name = "Robust Harvest" + id = "robustharvest" ///Alchemical Reagents @@ -421,22 +484,4 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 id = "triplepiss" description = "Ewwwwwwwww." reagent_state = LIQUID - color = "#857400" - -/datum/reagent/royal_bee_jelly - name = "royal bee jelly" - id = "royal_bee_jelly" - description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." - color = "#00ff80" - -/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/M) - if(prob(2)) - M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz...")) - ..() - -/datum/chemical_reaction/royal_bee_jelly - name = "royal bee jelly" - id = "royal_bee_jelly" - result = "royal_bee_jelly" - required_reagents = list("mutagen" = 10, "honey" = 40) - result_amount = 5 \ No newline at end of file + color = "#857400" \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_paint.dm b/code/modules/reagents/chemistry/reagents/paint.dm similarity index 100% rename from code/modules/reagents/oldchem/reagents/reagents_paint.dm rename to code/modules/reagents/chemistry/reagents/paint.dm diff --git a/code/modules/reagents/newchem/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm similarity index 76% rename from code/modules/reagents/newchem/paradise_pop.dm rename to code/modules/reagents/chemistry/reagents/paradise_pop.dm index 055b96020db..17fdc2cb444 100644 --- a/code/modules/reagents/newchem/paradise_pop.dm +++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm @@ -1,4 +1,3 @@ - /* Paradise Pop reagents Created through the bottler machine via bottler_recipes, not through standard reactions @@ -10,7 +9,7 @@ //Paradise Punch: No effect, aside from maybe messages about how tasty it is or something -/datum/reagent/paradise_punch +/datum/reagent/consumable/drink/paradise_punch name = "Paradise Punch" id = "paradise_punch" description = "Tastes just how you'd think Paradise would if you could bottle it." @@ -18,14 +17,14 @@ color = "#cc0044" //Apple-pocalypse: Low chance to cause a goonchem vortex that pulls things within a very small radius (2 tiles?) towards the drinker -/datum/reagent/apple_pocalypse +/datum/reagent/consumable/drink/apple_pocalypse name = "Apple-pocalypse" id = "apple-pocalypse" description = "If doomsday came in fruit form, it'd probably be apples." reagent_state = LIQUID color = "#44FF44" -/datum/reagent/apple_pocalypse/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) goonchem_vortex(T, 0, 2, 1) @@ -33,61 +32,61 @@ ..() //Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type? -/datum/reagent/berry_banned +/datum/reagent/consumable/drink/berry_banned name = "Berry Banned" id = "berry_banned" description = "Reason for ban: Excessive Flavor." reagent_state = LIQUID color = "#FF44FF" -/datum/reagent/berry_banned/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/berry_banned/on_mob_life(mob/living/M) if(prob(10)) var/heal_type = rand(0, 5) //still prefer the string version switch(heal_type) if(0) - M.adjustBruteLoss(-0.5*REM) + M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) if(1) - M.adjustFireLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) if(2) - M.adjustToxLoss(-0.5*REM) + M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) if(3) - M.adjustOxyLoss(-0.5*REM) + M.adjustOxyLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) if(4) - M.adjustCloneLoss(-0.5*REM) + M.adjustCloneLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) if(5) - M.adjustBrainLoss(-1*REM) + M.adjustBrainLoss(-1*REAGENTS_EFFECT_MULTIPLIER) to_chat(M, "You feel slightly rejuvinated!") ..() //Berry Banned 2: This one is tasty and toxic. Deals toxin damage and MAYBE plays the "BWOINK!" sound if it kills someone? -/datum/reagent/berry_banned2 +/datum/reagent/consumable/drink/berry_banned2 name = "Berry Banned" id = "berry_banned2" description = "Reason for ban: Excessive Flavor." reagent_state = LIQUID color = "#FF44FF" -/datum/reagent/berry_banned2/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/berry_banned2/on_mob_life(mob/living/M) if(prob(50)) - M.adjustToxLoss(2*REM) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often) + M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often) if(prob(10)) to_chat(M, "You feel slightly rejuvinated!") //meta this! ..() -/datum/reagent/berry_banned2/on_mob_death(mob/living/M) +/datum/reagent/consumable/drink/berry_banned2/on_mob_death(mob/living/M) M << sound('sound/effects/adminhelp.ogg',0,1,0,25) to_chat(M, "PM from-Administrator: BWOINK!") ..() //Blackeye Brew: Chance to make the drinker say greytider-themed things like "I thought clown was valid!" -/datum/reagent/blackeye_brew +/datum/reagent/consumable/drink/blackeye_brew name = "Blackeye Brew" id = "blackeye_brew" description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years." reagent_state = LIQUID color = "#4d2600" -/datum/reagent/blackeye_brew/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/blackeye_brew/on_mob_life(mob/living/M) if(prob(25)) var/list/tider_talk = list("CLOWN IS VALID, RIGHT?", "SHITMINS! SHITMINS! SHITMINS!", @@ -103,14 +102,14 @@ ..() //Grape Granade: causes the drinker to sometimes burp, has a low chance to cause a goonchem vortex that pushes things within a very small radius (1-2 tiles) away from the drinker -/datum/reagent/grape_granade +/datum/reagent/consumable/drink/grape_granade name = "Grape Granade" id = "grape_granade" description = "Exploding with grape flavor and a favorite among ERT members system-wide." reagent_state = LIQUID color = "#9933ff" -/datum/reagent/grape_granade/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) goonchem_vortex(T, 1, 1, 2) @@ -121,14 +120,14 @@ ..() //Meteor Malt: Sometimes causes screen shakes for the drinker like a meteor impact, low chance to add 1-5 units of a random mineral reagent to the drinker's blood (iron, copper, silver, gold, uranium, carbon, etc) -/datum/reagent/meteor_malt +/datum/reagent/consumable/drink/meteor_malt name = "Meteor Malt" id = "meteor_malt" description = "Soft drinks have been detected on collision course with your tastebuds." reagent_state = LIQUID color = "#cc9900" -/datum/reagent/meteor_malt/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/meteor_malt/on_mob_life(mob/living/M) if(prob(25)) M << sound('sound/effects/meteorimpact.ogg',0,1,0,25) shake_camera(M, 3, 1) @@ -136,4 +135,4 @@ var/amount = rand(1, 5) var/mineral = pick("copper", "iron", "gold", "carbon", "silver", "aluminum", "silicon", "sodiumchloride", "plasma") M.reagents.add_reagent(mineral, amount) - ..() + ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm new file mode 100644 index 00000000000..a92982a8aaf --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -0,0 +1,302 @@ +/datum/reagent/fuel + name = "Welding fuel" + id = "fuel" + description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil." + reagent_state = LIQUID + color = "#060606" + drink_icon = "dr_gibb_glass" + drink_name = "Glass of welder fuel" + drink_desc = "Unless you are an industrial tool, this is probably not safe for consumption." + +/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite! + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + ..() + +/datum/reagent/plasma + name = "Plasma" + id = "plasma" + description = "The liquid phase of an unusual extraterrestrial compound." + reagent_state = LIQUID + color = "#7A2B94" + +/datum/reagent/plasma/on_mob_life(mob/living/M) + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) + if(holder.has_reagent("epinephrine")) + holder.remove_reagent("epinephrine", 2) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.adjustPlasma(10) + ..() + +/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel! + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + ..() + + +/datum/reagent/thermite + name = "Thermite" + id = "thermite" + description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + reagent_state = SOLID + color = "#673910" // rgb: 103, 57, 16 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume) + if(volume >= 5 && istype(W)) + W.thermite = 1 + W.overlays.Cut() + W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") + +/datum/reagent/glycerol + name = "Glycerol" + id = "glycerol" + description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + reagent_state = LIQUID + color = "#808080" // rgb: 128, 128, 128 + +/datum/reagent/stabilizing_agent + name = "Stabilizing Agent" + id = "stabilizing_agent" + description = "A chemical that stabilises normally volatile compounds, preventing them from reacting immediately." + reagent_state = LIQUID + color = "#FFFF00" + +/datum/reagent/clf3 + name = "Chlorine Trifluoride" + id = "clf3" + description = "An extremely volatile substance, handle with the utmost care." + reagent_state = LIQUID + color = "#FF0000" + metabolization_rate = 4 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/clf3/on_mob_life(mob/living/M) + M.adjust_fire_stacks(2) + var/burndmg = max(0.3*M.fire_stacks, 0.3) + M.adjustFireLoss(burndmg) + ..() + +/datum/reagent/clf3/reaction_turf(turf/simulated/T, volume) + if(istype(T, /turf/simulated/floor/plating)) + var/turf/simulated/floor/plating/F = T + if(prob(1)) + F.ChangeTurf(/turf/space) + if(istype(T, /turf/simulated/floor/)) + var/turf/simulated/floor/F = T + if(prob(volume/10)) + F.make_plating() + if(istype(F, /turf/simulated/floor/)) + new /obj/effect/hotspot(F) + if(istype(T, /turf/simulated/wall/)) + var/turf/simulated/wall/W = T + if(prob(volume/10)) + W.ChangeTurf(/turf/simulated/floor) + if(istype(T, /turf/simulated/shuttle/)) + new /obj/effect/hotspot(T) + +/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + M.adjust_fire_stacks(min(volume/5, 10)) + M.IgniteMob() + M.bodytemperature += 30 + +/datum/reagent/sorium + name = "Sorium" + id = "sorium" + description = "Sends everything flying from the detonation point." + reagent_state = LIQUID + color = "#FFA500" + +/datum/reagent/liquid_dark_matter + name = "Liquid Dark Matter" + id = "liquid_dark_matter" + description = "Sucks everything into the detonation point." + reagent_state = LIQUID + color = "#800080" + +/datum/reagent/blackpowder + name = "Black Powder" + id = "blackpowder" + description = "Explodes. Violently." + reagent_state = LIQUID + color = "#000000" + metabolization_rate = 0.05 + penetrates_skin = 1 + +/datum/reagent/blackpowder/reaction_turf(turf/T, volume) //oh shit + if(volume >= 5 && !istype(T, /turf/space)) + if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf + new /obj/effect/decal/cleanable/dirt/blackpowder(T) + +/* +/datum/reagent/blackpowder/on_ex_act() + var/location = get_turf(holder.my_atom) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + sleep(rand(10,15)) + blackpowder_detonate(holder, volume) + holder.remove_reagent("blackpowder", volume) + return */ + +/datum/reagent/flash_powder + name = "Flash Powder" + id = "flash_powder" + description = "Makes a very bright flash." + reagent_state = LIQUID + color = "#FFFF00" + +/datum/reagent/smoke_powder + name = "Smoke Powder" + id = "smoke_powder" + description = "Makes a large cloud of smoke that can carry reagents." + reagent_state = LIQUID + color = "#808080" + +/datum/reagent/sonic_powder + name = "Sonic Powder" + id = "sonic_powder" + description = "Makes a deafening noise." + reagent_state = LIQUID + color = "#0000FF" + +/datum/reagent/phlogiston + name = "Phlogiston" + id = "phlogiston" + description = "Catches you on fire and makes you ignite." + reagent_state = LIQUID + color = "#FF9999" + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/phlogiston/on_mob_life(mob/living/M) + M.adjust_fire_stacks(1) + var/burndmg = max(0.3*M.fire_stacks, 0.3) + M.adjustFireLoss(burndmg) + ..() + +/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume) + M.IgniteMob() + ..() + +/datum/reagent/napalm + name = "Napalm" + id = "napalm" + description = "Very flammable." + reagent_state = LIQUID + color = "#FF9999" + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/napalm/on_mob_life(mob/living/M) + M.adjust_fire_stacks(1) + ..() + +/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + M.adjust_fire_stacks(min(volume/4, 20)) + +/datum/reagent/cryostylane + name = "Cryostylane" + id = "cryostylane" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." + color = "#B2B2FF" // rgb: 139, 166, 233 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature -= 30 + ..() + +/datum/reagent/cryostylane/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp -= 10 + holder.handle_reactions() + ..() + +/datum/reagent/cryostylane/reaction_turf(turf/T, volume) + if(volume >= 5) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +/datum/reagent/pyrosium + name = "Pyrosium" + id = "pyrosium" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." + color = "#B20000" // rgb: 139, 166, 233 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/pyrosium/on_mob_life(mob/living/M) + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature += 30 + ..() + +/datum/reagent/pyrosium/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp += 10 + holder.handle_reactions() + ..() + +/datum/reagent/firefighting_foam + name = "Firefighting foam" + id = "firefighting_foam" + description = "Carbon Tetrachloride is a foam used for fire suppression." + reagent_state = LIQUID + color = "#A0A090" + var/cooling_temperature = 3 // more effective than water + +/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume) +// Put out fire + if(method == TOUCH) + M.adjust_fire_stacks(-(volume / 5)) // more effective than water + M.ExtinguishMob() + +/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume) + if(istype(O)) + O.extinguish() + +/datum/reagent/firefighting_foam/reaction_turf(turf/simulated/T, volume) + if(!istype(T)) + return + var/CT = cooling_temperature + new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly. + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + +/datum/reagent/plasma_dust + name = "Plasma Dust" + id = "plasma_dust" + description = "A fine dust of plasma. This chemical has unusual mutagenic properties for viruses and slimes alike." + color = "#500064" // rgb: 80, 0, 100 + +/datum/reagent/plasma_dust/on_mob_life(mob/living/M) + M.adjustToxLoss(3) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.adjustPlasma(20) + ..() + +/datum/reagent/plasma_dust/reaction_obj(obj/O, volume) + if((!O) || (!volume)) + return 0 + O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) + +/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume) + if(istype(T)) + T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) + +/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel! + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + return + ..() \ No newline at end of file diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm similarity index 65% rename from code/modules/reagents/newchem/toxins.dm rename to code/modules/reagents/chemistry/reagents/toxins.dm index 56d64d9a62e..3b59ff8e0b7 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -1,8 +1,336 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 +/datum/reagent/toxin + name = "Toxin" + id = "toxin" + description = "A Toxic chemical." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 -#define REM REAGENTS_EFFECT_MULTIPLIER +/datum/reagent/toxin/on_mob_life(mob/living/M) + M.adjustToxLoss(2) + ..() + +/datum/reagent/spider_venom + name = "Spider venom" + id = "spidertoxin" + description = "A toxic venom injected by spacefaring arachnids." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + +/datum/reagent/spider_venom/on_mob_life(mob/living/M) + M.adjustToxLoss(1.5) + ..() + +/datum/reagent/plasticide + name = "Plasticide" + id = "plasticide" + description = "Liquid plastic, do not eat." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + +/datum/reagent/plasticide/on_mob_life(mob/living/M) + M.adjustToxLoss(1.5) + ..() + + +/datum/reagent/minttoxin + name = "Mint Toxin" + id = "minttoxin" + description = "Useful for dealing with undesirable customers." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + +/datum/reagent/minttoxin/on_mob_life(mob/living/M) + if(FAT in M.mutations) + M.gib() + ..() + +/datum/reagent/slimejelly + name = "Slime Jelly" + id = "slimejelly" + description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + reagent_state = LIQUID + color = "#801E28" // rgb: 128, 30, 40 + +/datum/reagent/slimejelly/on_mob_life(mob/living/M) + if(prob(10)) + to_chat(M, "Your insides are burning!") + M.adjustToxLoss(rand(20,60)*REAGENTS_EFFECT_MULTIPLIER) + else if(prob(40)) + M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/slimetoxin + name = "Mutation Toxin" + id = "mutationtoxin" + description = "A corruptive toxin produced by slimes." + reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + can_synth = 0 + +/datum/reagent/slimetoxin/on_mob_life(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/human = M + if(human.species.name != "Shadow") + to_chat(M, "Your flesh rapidly mutates!") + to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.") + to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") + ..() + +/datum/reagent/aslimetoxin + name = "Advanced Mutation Toxin" + id = "amutationtoxin" + description = "An advanced corruptive toxin produced by slimes." + reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + can_synth = 0 + +/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method != TOUCH) + M.ForceContractDisease(new /datum/disease/transformation/slime(0)) + + +/datum/reagent/mercury + name = "Mercury" + id = "mercury" + description = "A chemical element." + reagent_state = LIQUID + color = "#484848" // rgb: 72, 72, 72 + metabolization_rate = 0.2 + penetrates_skin = 1 + +/datum/reagent/mercury/on_mob_life(mob/living/M) + if(prob(70)) + M.adjustBrainLoss(1) + ..() + +/datum/reagent/chlorine + name = "Chlorine" + id = "chlorine" + description = "A chemical element." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + penetrates_skin = 1 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/chlorine/on_mob_life(mob/living/M) + M.adjustFireLoss(1) + ..() + +/datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A highly-reactive chemical element." + reagent_state = GAS + color = "#6A6054" + penetrates_skin = 1 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/fluorine/on_mob_life(mob/living/M) + M.adjustFireLoss(1) + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/radium + name = "Radium" + id = "radium" + description = "Radium is an alkaline earth metal. It is extremely radioactive." + reagent_state = SOLID + color = "#C7C7C7" // rgb: 199,199,199 + penetrates_skin = 1 + +/datum/reagent/radium/on_mob_life(mob/living/M) + if(M.radiation < 80) + M.apply_effect(4, IRRADIATE, negate_armor = 1) + ..() + +/datum/reagent/radium/reaction_turf(turf/T, volume) + if(volume >= 3 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/greenglow(T) + +/datum/reagent/mutagen + name = "Unstable mutagen" + id = "mutagen" + description = "Might cause unpredictable mutations. Keep away from children." + reagent_state = LIQUID + color = "#04DF27" + metabolization_rate = 0.3 + +/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume) + if(!..()) + return + if(!M.dna) + return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + if((method==TOUCH && prob(33)) || method==INGEST) + randmutb(M) + domutcheck(M, null) + M.UpdateAppearance() + +/datum/reagent/mutagen/on_mob_life(mob/living/M) + if(!M.dna) + return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + M.apply_effect(2*REAGENTS_EFFECT_MULTIPLIER, IRRADIATE, negate_armor = 1) + if(prob(4)) + randmutb(M) + ..() + + +/datum/reagent/uranium + name ="Uranium" + id = "uranium" + description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." + reagent_state = SOLID + color = "#B8B8C0" // rgb: 184, 184, 192 + +/datum/reagent/uranium/on_mob_life(mob/living/M) + M.apply_effect(2, IRRADIATE, negate_armor = 1) + ..() + +/datum/reagent/uranium/reaction_turf(turf/T, volume) + if(volume >= 3 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/greenglow(T) + + +/datum/reagent/lexorin + name = "Lexorin" + id = "lexorin" + description = "Lexorin temporarily stops respiration. Causes tissue damage." + reagent_state = LIQUID + color = "#52685D" + metabolization_rate = 0.2 + +/datum/reagent/lexorin/on_mob_life(mob/living/M) + M.adjustToxLoss(1) + ..() + + +/datum/reagent/sacid + name = "Sulphuric acid" + id = "sacid" + description = "A strong mineral acid with the molecular formula H2SO4." + reagent_state = LIQUID + color = "#00D72B" + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/sacid/on_mob_life(mob/living/M) + M.adjustFireLoss(1) + ..() + +/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume) + if(method == TOUCH) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(volume > 25) + + if(H.wear_mask) + to_chat(H, "Your mask protects you from the acid!") + return + + if(H.head) + to_chat(H, "Your helmet protects you from the acid!") + return + + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(5, 10) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(5,10) + else + M.take_organ_damage(5,10) + + if(method == INGEST) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(volume < 10) + to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!") + + if(volume >=10 && volume <=25) + if(!H.unacidable) + M.take_organ_damage(0,min(max(volume-10,2)*2,20)) + M.emote("scream") + + + if(volume > 25) + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(0, 20) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(0,20) + +/datum/reagent/sacid/reaction_obj(obj/O, volume) + if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40)) + if(!O.unacidable) + var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) + I.desc = "Looks like this was \an [O] some time ago." + O.visible_message("[O] melts.") + qdel(O) + +/datum/reagent/carpotoxin + name = "Carpotoxin" + id = "carpotoxin" + description = "A deadly neurotoxin produced by the dreaded spess carp." + reagent_state = LIQUID + color = "#003333" // rgb: 0, 51, 51 + +/datum/reagent/carpotoxin/on_mob_life(mob/living/M) + M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER) + ..() + +/datum/reagent/staminatoxin + name = "Tirizene" + id = "tirizene" + description = "A toxin that affects the stamina of a person when injected into the bloodstream." + reagent_state = LIQUID + color = "#6E2828" + data = 13 + +/datum/reagent/staminatoxin/on_mob_life(mob/living/M) + M.adjustStaminaLoss(REAGENTS_EFFECT_MULTIPLIER * data) + data = max(data - 1, 3) + ..() + + +/datum/reagent/spore + name = "Spore Toxin" + id = "spore" + description = "A natural toxin produced by blob spores that inhibits vision when ingested." + color = "#9ACD32" + +/datum/reagent/spores/on_mob_life(mob/living/M) + M.adjustToxLoss(1) + M.damageoverlaytemp = 60 + M.EyeBlurry(3) + ..() + +/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots + name = "Beer" + id = "beer2" + description = "An alcoholic beverage made from malted grains, hops, yeast, and water." + color = "#664300" // rgb: 102, 67, 0 + metabolization_rate = 1.5 * REAGENTS_METABOLISM + drink_icon ="beerglass" + drink_name = "Beer glass" + drink_desc = "A freezing pint of beer" + +/datum/reagent/beer2/on_mob_life(mob/living/M) + switch(current_cycle) + if(1 to 50) + M.Sleeping(2) + if(51 to INFINITY) + M.Sleeping(2) + M.adjustToxLoss((current_cycle - 50)*REAGENTS_EFFECT_MULTIPLIER) + ..() /datum/reagent/polonium name = "Polonium" @@ -12,12 +340,12 @@ color = "#CF3600" metabolization_rate = 0.1 penetrates_skin = 1 + can_synth = 0 /datum/reagent/polonium/on_mob_life(mob/living/M) M.apply_effect(8, IRRADIATE, negate_armor = 1) ..() - /datum/reagent/histamine name = "Histamine" id = "histamine" @@ -41,7 +369,7 @@ if(prob(10)) to_chat(M, "Your eyes itch.") M.emote(pick("blink", "sneeze")) - M.eye_blurry += 3 + M.AdjustEyeBlurry(3) if(prob(10)) M.visible_message("[M] scratches at an itch.") M.adjustBruteLoss(1) @@ -100,20 +428,11 @@ penetrates_skin = 1 /datum/reagent/formaldehyde/on_mob_life(mob/living/M) - M.adjustToxLoss(1*REM) + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) if(prob(10)) M.reagents.add_reagent("histamine",rand(5,15)) ..() -/datum/chemical_reaction/formaldehyde - name = "formaldehyde" - id = "formaldehyde" - result = "formaldehyde" - required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) - result_amount = 3 - min_temp = 420 - mix_message = "Ugh, it smells like the morgue in here." - /datum/reagent/venom name = "Venom" id = "venom" @@ -122,6 +441,7 @@ color = "#CF3600" metabolization_rate = 0.2 overdose_threshold = 40 + can_synth = 0 /datum/reagent/venom/on_mob_life(mob/living/M) if(prob(25)) @@ -141,7 +461,7 @@ if(prob(4)) M.visible_message("[M] starts convulsing violently!", "You feel as if your body is tearing itself apart!") M.Weaken(15) - M.jitteriness += 1000 + M.AdjustJitter(1000) spawn(rand(20, 100)) M.gib() @@ -159,19 +479,19 @@ current_cycle++ return if(5 to 8) - M.dizziness += 1 - M.confused = max(M.confused, 10) + M.AdjustDizzy(1) + M.Confused(10) if(9 to 12) - M.drowsyness = max(M.drowsyness, 10) - M.dizziness += 1 - M.confused = max(M.confused, 20) + M.Drowsy(10) + M.AdjustDizzy(1) + M.Confused(20) if(13) M.emote("faint") if(14 to INFINITY) M.Paralyse(10) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) - M.jitteriness = max(0, M.jitteriness-30) + M.AdjustJitter(-30) if(M.getBrainLoss() <= 80) M.adjustBrainLoss(1) else @@ -182,16 +502,6 @@ M.adjustToxLoss(1) ..() -/datum/chemical_reaction/neurotoxin2 - name = "neurotoxin2" - id = "neurotoxin2" - result = "neurotoxin2" - required_reagents = list("space_drugs" = 1) - result_amount = 1 - min_temp = 674 - mix_sound = null - no_message = 1 - /datum/reagent/cyanide name = "Cyanide" id = "cyanide" @@ -202,12 +512,12 @@ penetrates_skin = 1 /datum/reagent/cyanide/on_mob_life(mob/living/M) - M.adjustToxLoss(1.5*REM) + M.adjustToxLoss(1.5*REAGENTS_EFFECT_MULTIPLIER) if(prob(5)) M.emote("drool") if(prob(10)) to_chat(M, "You cannot breathe!") - M.losebreath += 1 + M.AdjustLoseBreath(1) M.emote("gasp") if(prob(8)) to_chat(M, "You feel horrendously weak!") @@ -215,23 +525,6 @@ M.adjustToxLoss(2) ..() -/datum/chemical_reaction/cyanide - name = "Cyanide" - id = "cyanide" - result = "cyanide" - required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) - result_amount = 3 - min_temp = 380 - mix_message = "The mixture gives off a faint scent of almonds." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/chemical_reaction/cyanide/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The solution generates a strong vapor!") - for(var/mob/living/carbon/C in range(T, 1)) - if(C.can_breathe_gas()) - C.reagents.add_reagent("cyanide", 7) - /datum/reagent/itching_powder name = "Itching Powder" id = "itching_powder" @@ -261,25 +554,11 @@ to_chat(M, "AHHHHHH!") M.adjustBruteLoss(5) M.Weaken(5) - M.jitteriness += 6 + M.AdjustJitter(6) M.visible_message("[M] falls to the floor, scratching themselves violently!") M.emote("scream") ..() -/datum/chemical_reaction/itching_powder - name = "Itching Powder" - id = "itching_powder" - result = "itching_powder" - required_reagents = list("fuel" = 1, "ammonia" = 1, "fungus" = 1) - result_amount = 3 - mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/reagent/facid/on_mob_life(mob/living/M) - M.adjustToxLoss(1*REM) - M.adjustFireLoss(1) - ..() - /datum/reagent/facid name = "Fluorosulfuric Acid" id = "facid" @@ -288,6 +567,11 @@ color = "#4141D2" process_flags = ORGANIC | SYNTHETIC +/datum/reagent/facid/on_mob_life(mob/living/M) + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) + M.adjustFireLoss(1) + ..() + /datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == TOUCH || method == INGEST) if(ishuman(M)) @@ -338,22 +622,13 @@ O.visible_message("[O] melts.") qdel(O) -/datum/chemical_reaction/facid - name = "Fluorosulfuric Acid" - id = "facid" - result = "facid" - required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) - result_amount = 4 - min_temp = 380 - mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container." - /datum/reagent/initropidril name = "Initropidril" id = "initropidril" description = "A highly potent cardiac poison - can kill within minutes." reagent_state = LIQUID color = "#7F10C0" - metabolization_rate = 0.4 + can_synth = 0 /datum/reagent/initropidril/on_mob_life(mob/living/M) if(prob(33)) @@ -364,11 +639,11 @@ if(prob(10)) to_chat(M, "You cannot breathe!") M.adjustOxyLoss(10) - M.losebreath++ + M.AdjustLoseBreath(1) if(prob(10)) to_chat(M, "Your chest is burning with pain!") M.adjustOxyLoss(10) - M.losebreath++ + M.AdjustLoseBreath(1) M.Stun(3) M.Weaken(2) if(ishuman(M)) @@ -377,30 +652,6 @@ H.heart_attack = 1 // rip in pepperoni ..() -/datum/chemical_reaction/initropidril - name = "Initropidril" - id = "initropidril" - result = "initropidril" - required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1) - result_amount = 4 - mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance." - - -/datum/reagent/concentrated_initro - name = "Concentrated Initropidril" - id = "concentrated_initro" - description = "A guaranteed heart-stopper!" - reagent_state = LIQUID - color = "#AB1CCF" - metabolization_rate = 0.4 - -/datum/reagent/concentrated_initro/on_mob_life(mob/living/M) - if(volume >=5) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.heart_attack = 1 // rip in pepperoni - /datum/reagent/pancuronium name = "Pancuronium" id = "pancuronium" @@ -425,12 +676,12 @@ M.Weaken(20) if(prob(10)) M.emote(pick("drool", "tremble", "gasp")) - M.losebreath++ + M.AdjustLoseBreath(1) if(prob(9)) to_chat(M, "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!") if(prob(7)) to_chat(M, "You can't breathe!") - M.losebreath += 3 + M.AdjustLoseBreath(3) ..() /datum/reagent/sodium_thiopental @@ -440,20 +691,21 @@ reagent_state = LIQUID color = "#5F8BE1" metabolization_rate = 0.7 + can_synth = 0 /datum/reagent/sodium_thiopental/on_mob_life(mob/living/M) switch(current_cycle) if(1) M.emote("drool") - M.confused = max(M.confused, 5) + M.Confused(5) if(2 to 4) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(5) M.emote("faint") M.Weaken(5) if(6 to INFINITY) M.Paralyse(20) - M.jitteriness = max(0, M.jitteriness-50) + M.AdjustJitter(-50) if(prob(10)) M.emote("drool") M.adjustBrainLoss(1) @@ -467,6 +719,7 @@ color = "#646EA0" metabolization_rate = 0.8 penetrates_skin = 1 + can_synth = 0 /datum/reagent/ketamine/on_mob_life(mob/living/M) switch(current_cycle) @@ -474,7 +727,7 @@ if(prob(25)) M.emote("yawn") if(6 to 9) - M.eye_blurry += 5 + M.AdjustEyeBlurry(5) if(prob(35)) M.emote("yawn") if(10) @@ -492,30 +745,21 @@ color = "#6BA688" metabolization_rate = 0.1 -/datum/chemical_reaction/sulfonal - name = "sulfonal" - id = "sulfonal" - result = "sulfonal" - required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) - result_amount = 3 - mix_message = "The mixture gives off quite a stench." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - /datum/reagent/sulfonal/on_mob_life(mob/living/M) - M.jitteriness = max(0, M.jitteriness-30) + M.AdjustJitter(-30) switch(current_cycle) if(1 to 10) if(prob(7)) M.emote("yawn") if(11 to 20) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(21) M.emote("faint") if(22 to INFINITY) if(prob(20)) M.emote("faint") M.Paralyse(5) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) M.adjustToxLoss(1) ..() @@ -526,7 +770,7 @@ reagent_state = LIQUID color = "#D9D9D9" -/datum/reagent/amanitin/reagent_deleted(mob/living/M) +/datum/reagent/amanitin/on_mob_delete(mob/living/M) M.adjustToxLoss(current_cycle*rand(2,4)) ..() @@ -538,13 +782,6 @@ color = "#D1DED1" metabolization_rate = 0.2 -/datum/chemical_reaction/lipolicide - name = "lipolicide" - id = "lipolicide" - result = "lipolicide" - required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) - result_amount = 3 - /datum/reagent/lipolicide/on_mob_life(mob/living/M) if(!M.nutrition) switch(rand(1,3)) @@ -567,10 +804,11 @@ reagent_state = LIQUID color = "#C2D8CD" metabolization_rate = 0.05 + can_synth = 0 /datum/reagent/coniine/on_mob_life(mob/living/M) M.adjustToxLoss(2) - M.losebreath += 5 + M.AdjustLoseBreath(5) ..() /datum/reagent/curare @@ -590,7 +828,7 @@ if(prob(20)) M.emote(pick("drool", "pale", "gasp")) if(6 to 10) - M.eye_blurry += 5 + M.AdjustEyeBlurry(5) if(prob(8)) to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].") M.Stun(1) @@ -598,12 +836,12 @@ M.emote(pick("drool","pale", "gasp")) if(11 to INFINITY) M.Stun(30) - M.drowsyness = max(M.drowsyness, 20) + M.Drowsy(20) if(prob(20)) M.emote(pick("drool", "faint", "pale", "gasp", "collapse")) else if(prob(8)) to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!") - M.losebreath++ + M.AdjustLoseBreath(1) ..() /datum/reagent/sarin @@ -616,42 +854,25 @@ penetrates_skin = 1 overdose_threshold = 25 -/datum/chemical_reaction/sarin - name = "sarin" - id = "sarin" - result = "sarin" - required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1) - result_amount = 3 - mix_message = "The mixture yields a colorless, odorless liquid." - min_temp = 374 - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The solution generates a strong vapor!") - for(var/mob/living/carbon/C in range(T, 2)) - if(C.can_breathe_gas()) - C.reagents.add_reagent("sarin", 4) - /datum/reagent/sarin/on_mob_life(mob/living/M) switch(current_cycle) if(1 to 15) - M.jitteriness += 20 + M.AdjustJitter(20) if(prob(20)) M.emote(pick("twitch","twitch_s","quiver")) if(16 to 30) if(prob(25)) M.emote(pick("twitch","twitch","drool","quiver","tremble")) - M.eye_blurry += 5 - M.stuttering = max(M.stuttering, 5) + M.AdjustEyeBlurry(5) + M.Stuttering(5) if(prob(10)) - M.confused = max(M.confused, 15) + M.Confused(15) if(prob(15)) M.Stun(1) M.emote("scream") if(30 to 60) - M.eye_blurry += 5 - M.stuttering = max(M.stuttering, 5) + M.AdjustEyeBlurry(5) + M.Stuttering(5) if(prob(10)) M.Stun(1) M.emote(pick("twitch","twitch","drool","shake","tremble")) @@ -660,15 +881,15 @@ if(prob(5)) M.Weaken(3) M.visible_message("[M] has a seizure!") - M.jitteriness = 1000 + M.SetJitter(1000) if(prob(5)) to_chat(M, "You can't breathe!") M.emote(pick("gasp", "choke", "cough")) - M.losebreath++ + M.AdjustLoseBreath(1) if(61 to INFINITY) if(prob(15)) M.emote(pick("gasp", "choke", "cough","twitch", "shake", "tremble","quiver","drool", "twitch","collapse")) - M.losebreath = max(5, M.losebreath + 5) + M.LoseBreath(5) M.adjustToxLoss(1) M.adjustBrainLoss(1) M.Weaken(4) @@ -690,8 +911,7 @@ M.adjustToxLoss(2) ..() - // Clear off wallrot fungi -/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume) +/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume) // Clear off wallrot fungi if(istype(W) && W.rotting) W.rotting = 0 for(var/obj/effect/overlay/O in W) @@ -727,14 +947,6 @@ D.adjustHealth(100) ..() -/datum/chemical_reaction/atrazine - name = "atrazine" - id = "atrazine" - result = "atrazine" - required_reagents = list("chlorine" = 1, "hydrogen" = 1, "nitrogen" = 1) - result_amount = 3 - mix_message = "The mixture gives off a harsh odor" - /datum/reagent/capulettium name = "Capulettium" id = "capulettium" @@ -743,27 +955,19 @@ color = "#60A584" heart_rate_stop = 1 -/datum/chemical_reaction/capulettium - name = "capulettium" - id = "capulettium" - result = "capulettium" - required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1) - result_amount = 1 - mix_message = "The smell of death wafts up from the solution." - /datum/reagent/capulettium/on_mob_life(mob/living/M) switch(current_cycle) if(1 to 5) - M.eye_blurry += 10 + M.AdjustEyeBlurry(10) if(6 to 10) - M.drowsyness = max(M.drowsyness, 10) + M.Drowsy(10) if(11) M.Paralyse(10) M.visible_message("[M] seizes up and falls limp, their eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary. if(12 to 60) M.Paralyse(10) if(61 to INFINITY) - M.eye_blurry += 10 + M.AdjustEyeBlurry(10) ..() /datum/reagent/capulettium_plus @@ -774,16 +978,8 @@ color = "#60A584" heart_rate_stop = 1 -/datum/chemical_reaction/capulettium_plus - name = "capulettium_plus" - id = "capulettium_plus" - result = "capulettium_plus" - required_reagents = list("capulettium" = 1, "ephedrine" = 1, "methamphetamine" = 1) - result_amount = 3 - mix_message = "The solution begins to slosh about violently by itself." - /datum/reagent/capulettium_plus/on_mob_life(mob/living/M) - M.silent = max(M.silent, 2) + M.Silence(2) ..() /datum/reagent/toxic_slurry @@ -840,6 +1036,10 @@ color = "#993333" process_flags = ORGANIC | SYNTHETIC +/datum/reagent/ants/on_mob_life(mob/living/M) + M.adjustBruteLoss(2) + ..() + /datum/reagent/ants/reaction_mob(mob/living/M, method=TOUCH, volume) //NOT THE ANTS if(iscarbon(M)) if(method == TOUCH || method==INGEST) @@ -847,11 +1047,6 @@ M.emote("scream") M.adjustBruteLoss(4) - -/datum/reagent/ants/on_mob_life(mob/living/M) - M.adjustBruteLoss(2) - ..() - /datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. name = "Teslium" id = "teslium" @@ -868,20 +1063,4 @@ shock_timer = 0 M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you playsound(M, "sparks", 50, 1) - ..() - -/datum/chemical_reaction/teslium - name = "Teslium" - id = "teslium" - result = "teslium" - required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1) - result_amount = 3 - mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." - min_temp = 400 - mix_sound = null - -/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(6, 1, location) - s.start() \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/chemistry/reagents/water.dm similarity index 85% rename from code/modules/reagents/oldchem/reagents/reagents_water.dm rename to code/modules/reagents/chemistry/reagents/water.dm index bbfcbeb8142..ef00ea54c61 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -15,6 +15,9 @@ color = "#0064C8" // rgb: 0, 100, 200 var/cooling_temperature = 2 process_flags = ORGANIC | SYNTHETIC + drink_icon = "glass_clear" + drink_name = "Glass of Water" + drink_desc = "The father of all refreshments." /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) // Put out fire @@ -133,6 +136,9 @@ id = "blood" reagent_state = LIQUID color = "#C80000" // rgb: 200, 0, 0 + drink_icon = "glass_red" + drink_name = "Glass of Tomato juice" + drink_desc = "Are you sure this is tomato juice?" /datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume) if(data && data["viruses"]) @@ -262,29 +268,32 @@ reagent_state = LIQUID color = "#0064C8" // rgb: 0, 100, 200 process_flags = ORGANIC | SYNTHETIC + drink_icon = "glass_clear" + drink_name = "Glass of Water" + drink_desc = "The father of all refreshments." /datum/reagent/holywater/on_mob_life(mob/living/M) - M.jitteriness = max(M.jitteriness-5,0) + M.AdjustJitter(-5) if(current_cycle >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec - M.stuttering = min(M.stuttering+4, 20) + M.AdjustStuttering(4, bound_lower = 0, bound_upper = 20) M.Dizzy(5) if(iscultist(M) && prob(5)) M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu")) if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds - M.confused += 3 + M.AdjustConfused(3) if(isvampirethrall(M)) ticker.mode.remove_vampire_mind(M.mind) holder.remove_reagent(id, volume) - M.jitteriness = 0 - M.stuttering = 0 - M.confused = 0 + M.SetJitter(0) + M.SetStuttering(0) + M.SetConfused(0) return if(iscultist(M)) ticker.mode.remove_cultist(M.mind) holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? - M.jitteriness = 0 - M.stuttering = 0 - M.confused = 0 + M.SetJitter(0) + M.SetStuttering(0) + M.SetConfused(0) return if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80)) switch(current_cycle) @@ -330,6 +339,47 @@ qdel(R) T.Bless() +/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke + name = "Unholy Water" + id = "unholywater" + description = "Something that shouldn't exist on this plane of existance." + process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it. + metabolization_rate = 1 + +/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M) + M.adjustBrainLoss(3) + if(iscultist(M)) + M.status_flags |= GOTTAGOFAST + M.AdjustDrowsy(-5) + M.AdjustParalysis(-2) + M.AdjustStunned(-2) + M.AdjustWeakened(-2) + else + M.adjustToxLoss(2) + M.adjustFireLoss(2) + M.adjustOxyLoss(2) + M.adjustBruteLoss(2) + ..() + +/datum/reagent/fuel/unholywater/on_mob_delete(mob/living/M) + M.status_flags &= ~GOTTAGOFAST + ..() + +/datum/reagent/hellwater + name = "Hell Water" + id = "hell_water" + description = "YOUR FLESH! IT BURNS!" + process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL. + metabolization_rate = 1 + can_synth = 0 + +/datum/reagent/hellwater/on_mob_life(mob/living/M) + M.fire_stacks = min(5, M.fire_stacks + 3) + M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire + M.adjustToxLoss(1) + M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard? + M.adjustBrainLoss(5) + ..() /datum/reagent/liquidgibs name = "Liquid gibs" @@ -365,4 +415,4 @@ if(istype(O, /obj/item/clothing/shoes/galoshes)) var/t_loc = get_turf(O) qdel(O) - new /obj/item/clothing/shoes/galoshes/dry(t_loc) + new /obj/item/clothing/shoes/galoshes/dry(t_loc) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm new file mode 100644 index 00000000000..28994d10fb2 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes.dm @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////////// +/datum/chemical_reaction + var/name = null + var/id = null + var/result = null + var/list/required_reagents = list() + var/list/required_catalysts = list() + + // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things + var/atom/required_container = null // the container required for the reaction to happen + var/required_other = 0 // an integer required for the reaction to happen + + var/result_amount = 0 + var/secondary = 0 // set to nonzero if secondary reaction + var/list/secondary_results = list() //additional reagents produced by the reaction + var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement + var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this). + var/mix_message = "The solution begins to bubble." + var/mix_sound = 'sound/effects/bubbles.ogg' + var/no_message = 0 + +/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) + return + +var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs +var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs +/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") + if(holder && holder.my_atom) + if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0) + for(var/T in typesof(/mob/living/simple_animal)) + var/mob/living/simple_animal/SA = T + switch(initial(SA.gold_core_spawnable)) + if(CHEM_MOB_SPAWN_HOSTILE) + chemical_mob_spawn_meancritters += T + if(CHEM_MOB_SPAWN_FRIENDLY) + chemical_mob_spawn_nicecritters += T + var/atom/A = holder.my_atom + var/turf/T = get_turf(A) + var/area/my_area = get_area(T) + var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" + message += " (VV)" + + var/mob/M = get(A, /mob) + if(M) + message += " - Carried By: [key_name_admin(M)](?) (FLW)" + else + message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" + + message_admins(message, 0, 1) + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() + for(var/i = 1, i <= amount_to_spawn, i++) + var/chosen + if(reaction_name == "Friendly Gold Slime") + chosen = pick(chemical_mob_spawn_nicecritters) + else + chosen = pick(chemical_mob_spawn_meancritters) + var/mob/living/simple_animal/C = new chosen + C.faction |= mob_faction + C.forceMove(get_turf(holder.my_atom)) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + +/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times) + for(var/atom/movable/X in orange(range, T)) + if(istype(X, /obj/effect)) + continue //stop pulling smoke and hotspots please + if(istype(X, /atom/movable)) + if((X) && !X.anchored) + if(setting_type) + playsound(T, 'sound/effects/bang.ogg', 25, 1) + for(var/i = 0, i < pull_times, i++) + step_away(X,T) + else + playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this. + for(var/i = 0, i < pull_times, i++) + step_towards(X,T) \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/chemistry/recipes/drinks.dm similarity index 86% rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm rename to code/modules/reagents/chemistry/recipes/drinks.dm index 1b69b88e071..d1866a2b2f1 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm +++ b/code/modules/reagents/chemistry/recipes/drinks.dm @@ -676,3 +676,96 @@ required_reagents = list("spacemountainwind" = 1, "coffee" = 1) result_amount = 2 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/ginsonic + name = "ginsonic" + id = "ginsonic" + result = "ginsonic" + required_reagents = list("gintonic" = 1, "methamphetamine" = 1) + result_amount = 2 + mix_message = "The drink turns electric blue and starts quivering violently." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/applejack + name = "applejack" + id = "applejack" + result = "applejack" + required_reagents = list("cider" = 2) + max_temp = 270 + result_amount = 1 + mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind." + mix_sound = null + +/datum/chemical_reaction/jackrose + name = "jackrose" + id = "jackrose" + result = "jackrose" + required_reagents = list("applejack" = 4, "lemonjuice" = 1) + result_amount = 5 + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/synthanol + name = "Synthanol" + id = "synthanol" + result = "synthanol" + required_reagents = list("lube" = 1, "plasma" = 1, "fuel" = 1) + result_amount = 3 + mix_message = "The chemicals mix to create shiny, blue substance." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/synthanol/robottears + name = "Robot Tears" + id = "robottears" + result = "robottears" + required_reagents = list("synthanol" = 1, "oil" = 1, "sodawater" = 1) + result_amount = 3 + mix_message = "The ingredients combine into a stiff, dark goo." + +/datum/chemical_reaction/synthanol/trinary + name = "Trinary" + id = "trinary" + result = "trinary" + required_reagents = list("synthanol" = 1, "limejuice" = 1, "orangejuice" = 1) + result_amount = 3 + mix_message = "The ingredients mix into a colorful substance." + +/datum/chemical_reaction/synthanol/servo + name = "Servo" + id = "servo" + result = "servo" + required_reagents = list("synthanol" = 2, "cream" = 1, "hot_coco" = 1) + result_amount = 4 + mix_message = "The ingredients mix into a dark brown substance." + +/datum/chemical_reaction/synthanol/uplink + name = "Uplink" + id = "uplink" + result = "uplink" + required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1) + result_amount = 5 + mix_message = "The chemicals mix to create a shiny, orange substance." + +/datum/chemical_reaction/synthanol/synthnsoda + name = "Synth 'n Soda" + id = "synthnsoda" + result = "synthnsoda" + required_reagents = list("synthanol" = 1, "cola" = 1) + result_amount = 2 + mix_message = "The chemicals mix to create a smooth, fizzy substance." + +/datum/chemical_reaction/synthanol/synthignon + name = "Synthignon" + id = "synthignon" + result = "synthignon" + required_reagents = list("synthanol" = 1, "wine" = 1) + result_amount = 2 + mix_message = "The chemicals mix to create a fine, red substance." + +/datum/chemical_reaction/triple_citrus + name = "triple_citrus" + id = "triple_citrus" + result = "triple_citrus" + required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) + result_amount = 3 + mix_message = "The citrus juices begin to blend together." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm new file mode 100644 index 00000000000..e44ace8f511 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -0,0 +1,117 @@ +/datum/chemical_reaction/space_drugs + name = "Space Drugs" + id = "space_drugs" + result = "space_drugs" + required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result_amount = 3 + mix_message = "Slightly dizzying fumes drift from the solution." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/crank + name = "Crank" + id = "crank" + result = "crank" + required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) + result_amount = 5 + mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." + mix_sound = 'sound/goonstation/effects/crystalshatter.ogg' + min_temp = 390 + +/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume) + var/turf/T = get_turf(holder.my_atom) + for(var/turf/turf in range(1,T)) + new /obj/effect/hotspot(turf) + explosion(T,0,0,2) + +/datum/chemical_reaction/krokodil + name = "Krokodil" + id = "krokodil" + result = "krokodil" + required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) + result_amount = 6 + mix_message = "The mixture dries into a pale blue powder." + min_temp = 380 + mix_sound = 'sound/goonstation/misc/fuse.ogg' + +/datum/chemical_reaction/methamphetamine + name = "methamphetamine" + id = "methamphetamine" + result = "methamphetamine" + required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) + result_amount = 4 + min_temp = 374 + +/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 1)) + if(C.can_breathe_gas()) + C.emote("gasp") + C.AdjustLoseBreath(1) + C.reagents.add_reagent("toxin", 10) + C.reagents.add_reagent("neurotoxin2", 20) + +/datum/chemical_reaction/bath_salts + name = "bath_salts" + id = "bath_salts" + result = "bath_salts" + required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1) + result_amount = 6 + min_temp = 374 + mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh." + mix_sound = 'sound/goonstation/misc/fuse.ogg' + +/datum/chemical_reaction/jenkem + name = "Jenkem" + id = "jenkem" + result = "jenkem" + required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1) + result_amount = 3 + mix_message = "The mixture ferments into a filthy morass." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/jenkem/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 1)) + if(C.can_breathe_gas()) + C.reagents.add_reagent("jenkem", 25) + +/datum/chemical_reaction/aranesp + name = "Aranesp" + id = "aranesp" + result = "aranesp" + required_reagents = list("epinephrine" = 1, "atropine" = 1, "insulin" = 1) + result_amount = 3 + +/datum/chemical_reaction/fliptonium + name = "fliptonium" + id = "fliptonium" + result = "fliptonium" + required_reagents = list("ephedrine" = 1, "liquid_dark_matter" = 1, "chocolate" = 1, "ginsonic" = 1) + result_amount = 4 + mix_message = "The mixture swirls around excitedly!" + +/datum/chemical_reaction/lsd + name = "Lysergic acid diethylamide" + id = "lsd" + result = "lsd" + required_reagents = list("diethylamine" = 1, "fungus" = 1) + result_amount = 3 + mix_message = "The mixture turns a rather unassuming color and settles." + +/datum/chemical_reaction/lube/ultra + name = "Ultra-Lube" + id = "ultralube" + result = "ultralube" + required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1) + result_amount = 2 + mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol." + +/datum/chemical_reaction/surge + name = "Surge" + id = "surge" + result = "surge" + required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 6 + mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity." \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/chemistry/recipes/food.dm similarity index 51% rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm rename to code/modules/reagents/chemistry/recipes/food.dm index b43c9b344f1..02453d44e31 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm +++ b/code/modules/reagents/chemistry/recipes/food.dm @@ -89,34 +89,6 @@ required_reagents = list("flour" = 15, "water" = 5) required_catalysts = list("enzyme" = 5) -/datum/chemical_reaction/sodiumchloride - name = "Sodium Chloride" - id = "sodiumchloride" - result = "sodiumchloride" - required_reagents = list("sodium" = 1, "chlorine" = 1, "water" = 1) - result_amount = 3 - mix_message = "The solution crystallizes with a brief flare of light." - -/datum/chemical_reaction/ice - name = "Ice" - id = "ice" - result = "ice" - required_reagents = list("water" = 1) - result_amount = 1 - max_temp = 273 - mix_message = "Ice forms as the water freezes." - mix_sound = null - -/datum/chemical_reaction/water - name = "Water" - id = "water" - result = "water" - required_reagents = list("ice" = 1) - result_amount = 1 - min_temp = 301 // In Space.....ice melts at 82F...don't ask - mix_message = "Water pools as the ice melts." - mix_sound = null - /datum/chemical_reaction/dough name = "Dough" id = "dough" @@ -128,4 +100,101 @@ /datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/weapon/reagent_containers/food/snacks/dough(location) \ No newline at end of file + new /obj/item/weapon/reagent_containers/food/snacks/dough(location) + +/datum/chemical_reaction/corn_syrup + name = "corn_syrup" + id = "corn_syrup" + result = "corn_syrup" + required_reagents = list("corn_starch" = 1, "sacid" = 1) + result_amount = 2 + min_temp = 374 + mix_message = "The mixture forms a viscous, clear fluid!" + +/datum/chemical_reaction/vhfcs + name = "vhfcs" + id = "vhfcs" + result = "vhfcs" + required_reagents = list("corn_syrup" = 1) + required_catalysts = list("enzyme" = 1) + result_amount = 1 + mix_message = "The mixture emits a sickly-sweet smell." + +/datum/chemical_reaction/cola + name = "cola" + id = "cola" + result = "cola" + required_reagents = list("carbon" = 1, "oxygen" = 1, "water" = 1, "sugar" = 1) + result_amount = 4 + mix_message = "The mixture begins to fizz." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/cheese + name = "cheese" + id = "cheese" + result = "cheese" + required_reagents = list("vomit" = 1, "milk" = 1) + result_amount = 1 + mix_message = "The mixture curdles up." + +/datum/chemical_reaction/cheese/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("A faint cheesy smell drifts through the air...") + +/datum/chemical_reaction/weird_cheese + name = "Weird cheese" + id = "weird_cheese" + result = "weird_cheese" + required_reagents = list("green_vomit" = 1, "milk" = 1) + result_amount = 1 + mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench." + mix_sound = 'sound/goonstation/misc/gurggle.ogg' + +/datum/chemical_reaction/weird_cheese/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("A horrible smell assaults your nose! What in space is it?") + +/datum/chemical_reaction/hydrogenated_soybeanoil + name = "Partially hydrogenated space-soybean oil" + id = "hydrogenated_soybeanoil" + result = "hydrogenated_soybeanoil" + required_reagents = list("soybeanoil" = 1, "hydrogen" = 1) + result_amount = 2 + min_temp = 520 + mix_message = "The mixture emits a burnt, oily smell." + +/datum/chemical_reaction/meatslurry + name = "Meat Slurry" + id = "meatslurry" + result = "meatslurry" + required_reagents = list("corn_starch" = 1, "blood" = 1) + result_amount = 2 + mix_message = "The mixture congeals into a bloody mass." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/gravy + name = "Gravy" + id = "gravy" + result = "gravy" + required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1) + result_amount = 3 + min_temp = 374 + mix_message = "The substance thickens and takes on a meaty odor." + +/datum/chemical_reaction/beff + name = "Beff" + id = "beff" + result = "beff" + required_reagents = list("hydrogenated_soybeanoil" = 2, "meatslurry" = 1, "plasma" = 1) + result_amount = 4 + mix_message = "The mixture solidifies, taking a crystalline appearance." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/pepperoni + name = "Pepperoni" + id = "pepperoni" + result = "pepperoni" + required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1) + result_amount = 2 + mix_message = "The beff and the synthflesh combine to form a smoky red log." + mix_sound = 'sound/effects/blobattack.ogg' \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm new file mode 100644 index 00000000000..1c22693513f --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -0,0 +1,274 @@ +/datum/chemical_reaction/hydrocodone + name = "Hydrocodone" + id = "hydrocodone" + result = "hydrocodone" + required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1) + result_amount = 2 + +/datum/chemical_reaction/mitocholide + name = "mitocholide" + id = "mitocholide" + result = "mitocholide" + required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) + result_amount = 3 + +/datum/chemical_reaction/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + result = "cryoxadone" + required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1) + result_amount = 4 + mix_message = "The solution bubbles softly." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + result = "spaceacillin" + required_reagents = list("fungus" = 1, "ethanol" = 1) + result_amount = 2 + mix_message = "The solvent extracts an antibiotic compound from the fungus." + +/datum/chemical_reaction/rezadone + name = "Rezadone" + id = "rezadone" + result = "rezadone" + required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1) + result_amount = 3 + +/datum/chemical_reaction/sterilizine + name = "Sterilizine" + id = "sterilizine" + result = "sterilizine" + required_reagents = list("antihol" = 2, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/charcoal + name = "Charcoal" + id = "charcoal" + result = "charcoal" + required_reagents = list("ash" = 1, "sodiumchloride" = 1) + result_amount = 2 + mix_message = "The mixture yields a fine black powder." + min_temp = 380 + mix_sound = 'sound/goonstation/misc/fuse.ogg' + +/datum/chemical_reaction/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + result = "silver_sulfadiazine" + required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) + result_amount = 5 + mix_message = "A strong and cloying odor begins to bubble from the mixture." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + result = "salglu_solution" + required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/synthflesh + name = "Synthflesh" + id = "synthflesh" + result = "synthflesh" + required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) + result_amount = 3 + mix_message = "The mixture knits together into a fibrous, bloody mass." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + result = "styptic_powder" + required_reagents = list("aluminum" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 4 + mix_message = "The solution yields an astringent powder." + +/datum/chemical_reaction/calomel + name = "Calomel" + id = "calomel" + result = "calomel" + required_reagents = list("mercury" = 1, "chlorine" = 1) + result_amount = 2 + min_temp = 374 + mix_message = "Stinging vapors rise from the solution." + +/datum/chemical_reaction/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + result = "potass_iodide" + required_reagents = list("potassium" = 1, "iodine" = 1) + result_amount = 2 + mix_message = "The solution settles calmly and emits gentle fumes." + +/datum/chemical_reaction/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + result = "pen_acid" + required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) + result_amount = 6 + mix_message = "The substance becomes very still, emitting a curious haze." + +/datum/chemical_reaction/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + result = "sal_acid" + required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 5 + mix_message = "The mixture crystallizes." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/salbutamol + name = "Salbutamol" + id = "salbutamol" + result = "salbutamol" + required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminum" = 1, "bromine" = 1, "ammonia" = 1) + result_amount = 5 + mix_message = "The solution bubbles freely, creating a head of bluish foam." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + result = "perfluorodecalin" + required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) + result_amount = 3 + min_temp = 370 + mix_message = "The mixture rapidly turns into a dense pink liquid." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/ephedrine + name = "Ephedrine" + id = "ephedrine" + result = "ephedrine" + required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) + result_amount = 4 + mix_message = "The solution fizzes and gives off toxic fumes." + +/datum/chemical_reaction/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + result = "diphenhydramine" + required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) + result_amount = 4 + mix_message = "The mixture fizzes gently." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/oculine + name = "Oculine" + id = "oculine" + result = "oculine" + required_reagents = list("atropine" = 1, "spaceacillin" = 1, "salglu_solution" = 1) + result_amount = 3 + mix_message = "The mixture settles, becoming a milky white." + +/datum/chemical_reaction/atropine + name = "Atropine" + id = "atropine" + result = "atropine" + required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) + result_amount = 5 + mix_message = "A horrid smell like something died drifts from the mixture." + +/datum/chemical_reaction/epinephrine + name = "Epinephrine" + id = "epinephrine" + result = "epinephrine" + required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) + result_amount = 6 + mix_message = "Tiny white crystals precipitate out of the solution." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/strange_reagent + name = "Strange Reagent" + id = "strange_reagent" + result = "strange_reagent" + required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) + result_amount = 3 + mix_message = "The substance begins moving on its own somehow." + +/datum/chemical_reaction/life + name = "Life" + id = "life" + result = null + required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) + result_amount = 3 + min_temp = 374 + +/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) + chemical_mob_spawn(holder, 1, "Life") + +/datum/chemical_reaction/mannitol + name = "Mannitol" + id = "mannitol" + result = "mannitol" + required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) + result_amount = 3 + mix_message = "The mixture bubbles slowly, making a slightly sweet odor." + +/datum/chemical_reaction/mutadone + name = "Mutadone" + id = "mutadone" + result = "mutadone" + required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) + result_amount = 3 + mix_message = "A foul astringent liquid emerges from the reaction." + +/datum/chemical_reaction/antihol + name = "antihol" + id = "antihol" + result = "antihol" + required_reagents = list("ethanol" = 1, "charcoal" = 1) + result_amount = 2 + mix_message = "A minty and refreshing smell drifts from the effervescent mixture." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/simethicone + name = "simethicone" + id = "simethicone" + result = "simethicone" + required_reagents = list("hydrogen" = 1, "chlorine" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 4 + +/datum/chemical_reaction/teporone + name = "Teporone" + id = "teporone" + result = "teporone" + required_reagents = list("acetone" = 1, "silicon" = 1, "plasma" = 1) + result_amount = 2 + mix_message = "The mixture turns an odd lavender color." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/haloperidol + name = "Haloperidol" + id = "haloperidol" + result = "haloperidol" + required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1) + result_amount = 4 + mix_message = "The chemicals mix into an odd pink slush." + +/datum/chemical_reaction/ether + name = "Ether" + id = "ether" + result = "ether" + required_reagents = list("sacid" = 1, "ethanol" = 1, "oxygen" = 1) + result_amount = 1 + mix_message = "The mixture yields a pungent odor, which makes you tired." + +/datum/chemical_reaction/degreaser + name = "Degreaser" + id = "degreaser" + result = "degreaser" + required_reagents = list("oil" = 1, "sterilizine" = 1) + result_amount = 2 + +/datum/chemical_reaction/liquid_solder + name = "Liquid Solder" + id = "liquid_solder" + result = "liquid_solder" + required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1) + result_amount = 3 + min_temp = 370 + mix_message = "The solution gently swirls with a metallic sheen." \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm new file mode 100644 index 00000000000..b97deb0ae8f --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -0,0 +1,482 @@ +// foam and foam precursor + +/datum/chemical_reaction/surfactant + name = "Foam surfactant" + id = "foam surfactant" + result = "fluorosurfactant" + required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + result_amount = 5 + mix_message = "A head of foam results from the mixture's constant fizzing." + +/datum/chemical_reaction/foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 + +/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + holder.my_atom.visible_message("The solution spews out foam!") + + var/datum/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 0) + s.start() + holder.clear_reagents() + + +/datum/chemical_reaction/metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 + +/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + + holder.my_atom.visible_message("The solution spews out a metalic foam!") + + var/datum/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, MFOAM_ALUMINUM) + s.start() + + +/datum/chemical_reaction/ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 + +/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + + holder.my_atom.visible_message("= 5 && !istype(T, /turf/space)) - if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf - new /obj/effect/decal/cleanable/dirt/blackpowder(T) - /datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -190,17 +136,6 @@ sleep(rand(20,30)) blackpowder_detonate(holder, created_volume) -/* -/datum/reagent/blackpowder/on_ex_act() - var/location = get_turf(holder.my_atom) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - sleep(rand(10,15)) - blackpowder_detonate(holder, volume) - holder.remove_reagent("blackpowder", volume) - return */ - /proc/blackpowder_detonate(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) var/ex_severe = round(created_volume / 100) @@ -213,20 +148,28 @@ spawn(0) qdel(holder.my_atom) -/datum/reagent/flash_powder - name = "Flash Powder" - id = "flash_powder" - description = "Makes a very bright flash." - reagent_state = LIQUID - color = "#FFFF00" - -/datum/chemical_reaction/flash_powder +datum/chemical_reaction/flash_powder name = "Flash powder" id = "flash_powder" result = "flash_powder" required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1) result_amount = 3 +/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/location = get_turf(holder.my_atom) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in viewers(5, location)) + if(C.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + holder.remove_reagent("flash_powder", created_volume) + /datum/chemical_reaction/flash_powder_flash name = "Flash powder activation" id = "flash_powder_flash" @@ -246,29 +189,6 @@ continue C.Stun(5) - -/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in viewers(5, location)) - if(C.flash_eyes()) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - holder.remove_reagent("flash_powder", created_volume) - -/datum/reagent/smoke_powder - name = "Smoke Powder" - id = "smoke_powder" - description = "Makes a large cloud of smoke that can carry reagents." - reagent_state = LIQUID - color = "#808080" - /datum/chemical_reaction/smoke_powder name = "smoke_powder" id = "smoke_powder" @@ -318,13 +238,6 @@ forbidden_reagents = list("stimulants") mix_sound = null -/datum/reagent/sonic_powder - name = "Sonic Powder" - id = "sonic_powder" - description = "Makes a deafening noise." - reagent_state = LIQUID - color = "#0000FF" - /datum/chemical_reaction/sonic_powder name = "sonic_powder" id = "sonic_powder" @@ -332,6 +245,35 @@ required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) result_amount = 3 +/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/M in hearers(5, location)) + var/ear_safety = 0 + var/distance = max(1,get_dist(src,T)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + ear_safety++ + to_chat(C, "BANG") + if(!ear_safety) + M.Stun(max(10/distance, 3)) + M.Weaken(max(10/distance, 3)) + M.AdjustEarDamage(rand(0, 5)) + M.EarDeaf(15) + if(M.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(M.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.disabilities |= DEAF + else + if(M.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") + holder.remove_reagent("sonic_powder", created_volume) /datum/chemical_reaction/sonic_powder_deafen name = "sonic_powder_deafen" @@ -356,53 +298,17 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) + M.AdjustEarDamage(rand(0, 5)) + M.EarDeaf(15) if(M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) + if(prob(M.ear_damage - 5)) to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF + M.BecomeDeaf() else if(M.ear_damage >= 5) to_chat(M, "Your ears start to ring!") -/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/M in hearers(5, location)) - var/ear_safety = 0 - var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - to_chat(C, "BANG") - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) - if(M.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) - to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") - holder.remove_reagent("sonic_powder", created_volume) - -/datum/reagent/phlogiston - name = "Phlogiston" - id = "phlogiston" - description = "Catches you on fire and makes you ignite." - reagent_state = LIQUID - color = "#FF9999" - process_flags = ORGANIC | SYNTHETIC - /datum/chemical_reaction/phlogiston name = "phlogiston" id = "phlogiston" @@ -417,32 +323,6 @@ for(var/turf/simulated/turf in range(min(created_volume/10,4),T)) new /obj/effect/hotspot(turf) -/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume) - M.IgniteMob() - ..() - -/datum/reagent/phlogiston/on_mob_life(mob/living/M) - M.adjust_fire_stacks(1) - var/burndmg = max(0.3*M.fire_stacks, 0.3) - M.adjustFireLoss(burndmg) - ..() - -/datum/reagent/napalm - name = "Napalm" - id = "napalm" - description = "Very flammable." - reagent_state = LIQUID - color = "#FF9999" - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/napalm/on_mob_life(mob/living/M) - M.adjust_fire_stacks(1) - ..() - -/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - M.adjust_fire_stacks(min(volume/4, 20)) - /datum/chemical_reaction/napalm name = "Napalm" id = "napalm" @@ -450,13 +330,6 @@ required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) result_amount = 1 -/datum/reagent/cryostylane - name = "Cryostylane" - id = "cryostylane" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." - color = "#B2B2FF" // rgb: 139, 166, 233 - process_flags = ORGANIC | SYNTHETIC - /datum/chemical_reaction/cryostylane name = "cryostylane" id = "cryostylane" @@ -465,31 +338,6 @@ result_amount = 3 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature -= 30 - ..() - -/datum/reagent/cryostylane/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp -= 10 - holder.handle_reactions() - ..() - -/datum/reagent/cryostylane/reaction_turf(turf/T, volume) - if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) - -/datum/reagent/pyrosium - name = "Pyrosium" - id = "pyrosium" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." - color = "#B20000" // rgb: 139, 166, 233 - process_flags = ORGANIC | SYNTHETIC - /datum/chemical_reaction/pyrosium name = "pyrosium" id = "pyrosium" @@ -497,19 +345,6 @@ required_reagents = list("plasma" = 1, "radium" = 1, "phosphorus" = 1) result_amount = 3 -/datum/reagent/pyrosium/on_mob_life(mob/living/M) - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature += 30 - ..() - -/datum/reagent/pyrosium/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp += 10 - holder.handle_reactions() - ..() - /datum/chemical_reaction/azide name = "azide" id = "azide" @@ -523,14 +358,6 @@ var/location = get_turf(holder.my_atom) explosion(location, 0, 1, 4) -/datum/reagent/firefighting_foam - name = "Firefighting foam" - id = "firefighting_foam" - description = "Carbon Tetrachloride is a foam used for fire suppression." - reagent_state = LIQUID - color = "#A0A090" - var/cooling_temperature = 3 // more effective than water - /datum/chemical_reaction/firefighting_foam name = "firefighting_foam" id = "firefighting_foam" @@ -540,29 +367,6 @@ mix_message = "The mixture bubbles gently." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume) -// Put out fire - if(method == TOUCH) - M.adjust_fire_stacks(-(volume / 5)) // more effective than water - M.ExtinguishMob() - -/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume) - if(istype(O)) - O.extinguish() - -/datum/reagent/firefighting_foam/reaction_turf(turf/simulated/T, volume) - if(!istype(T)) - return - var/CT = cooling_temperature - new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly. - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) - lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0) - lowertemp.react() - T.assume_air(lowertemp) - qdel(hotspot) - /datum/chemical_reaction/clf3_firefighting name = "clf3_firefighting" id = "clf3_firefighting" @@ -593,30 +397,9 @@ holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") -/datum/reagent/plasma_dust - name = "Plasma Dust" - id = "plasma_dust" - description = "A fine dust of plasma. This chemical has unusual mutagenic properties for viruses and slimes alike." - color = "#500064" // rgb: 80, 0, 100 - -/datum/reagent/plasma_dust/on_mob_life(mob/living/M) - M.adjustToxLoss(3) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.adjustPlasma(20) - ..() - -/datum/reagent/plasma_dust/reaction_obj(obj/O, volume) - if((!O) || (!volume)) - return 0 - O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) - -/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume) - if(istype(T)) - T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) - -/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel! - if(method == TOUCH) - M.adjust_fire_stacks(volume / 5) - return - ..() \ No newline at end of file +/datum/chemical_reaction/thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm similarity index 100% rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm rename to code/modules/reagents/chemistry/recipes/slime_extracts.dm diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm new file mode 100644 index 00000000000..2181401b2da --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -0,0 +1,142 @@ +/datum/chemical_reaction/formaldehyde + name = "formaldehyde" + id = "formaldehyde" + result = "formaldehyde" + required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) + result_amount = 3 + min_temp = 420 + mix_message = "Ugh, it smells like the morgue in here." + +/datum/chemical_reaction/neurotoxin2 + name = "neurotoxin2" + id = "neurotoxin2" + result = "neurotoxin2" + required_reagents = list("space_drugs" = 1) + result_amount = 1 + min_temp = 674 + mix_sound = null + no_message = 1 + +/datum/chemical_reaction/cyanide + name = "Cyanide" + id = "cyanide" + result = "cyanide" + required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) + result_amount = 3 + min_temp = 380 + mix_message = "The mixture gives off a faint scent of almonds." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/cyanide/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 1)) + if(C.can_breathe_gas()) + C.reagents.add_reagent("cyanide", 7) + +/datum/chemical_reaction/itching_powder + name = "Itching Powder" + id = "itching_powder" + result = "itching_powder" + required_reagents = list("fuel" = 1, "ammonia" = 1, "fungus" = 1) + result_amount = 3 + mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/facid + name = "Fluorosulfuric Acid" + id = "facid" + result = "facid" + required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) + result_amount = 4 + min_temp = 380 + mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container." + +/datum/chemical_reaction/initropidril + name = "Initropidril" + id = "initropidril" + result = "initropidril" + required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1) + result_amount = 4 + mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance." + +/datum/chemical_reaction/sulfonal + name = "sulfonal" + id = "sulfonal" + result = "sulfonal" + required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + result_amount = 3 + mix_message = "The mixture gives off quite a stench." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/lipolicide + name = "lipolicide" + id = "lipolicide" + result = "lipolicide" + required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + result_amount = 3 + +/datum/chemical_reaction/sarin + name = "sarin" + id = "sarin" + result = "sarin" + required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1) + result_amount = 3 + mix_message = "The mixture yields a colorless, odorless liquid." + min_temp = 374 + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 2)) + if(C.can_breathe_gas()) + C.reagents.add_reagent("sarin", 4) + +/datum/chemical_reaction/atrazine + name = "atrazine" + id = "atrazine" + result = "atrazine" + required_reagents = list("chlorine" = 1, "hydrogen" = 1, "nitrogen" = 1) + result_amount = 3 + mix_message = "The mixture gives off a harsh odor" + +/datum/chemical_reaction/capulettium + name = "capulettium" + id = "capulettium" + result = "capulettium" + required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1) + result_amount = 1 + mix_message = "The smell of death wafts up from the solution." + +/datum/chemical_reaction/capulettium_plus + name = "capulettium_plus" + id = "capulettium_plus" + result = "capulettium_plus" + required_reagents = list("capulettium" = 1, "ephedrine" = 1, "methamphetamine" = 1) + result_amount = 3 + mix_message = "The solution begins to slosh about violently by itself." + +/datum/chemical_reaction/teslium + name = "Teslium" + id = "teslium" + result = "teslium" + required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1) + result_amount = 3 + mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." + min_temp = 400 + mix_sound = null + +/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(6, 1, location) + s.start() + +/datum/chemical_reaction/mutagen + name = "Unstable mutagen" + id = "mutagen" + result = "mutagen" + required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1) + result_amount = 3 + mix_message = "The substance turns neon green and bubbles unnervingly." \ No newline at end of file diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm deleted file mode 100644 index def94ba9a2c..00000000000 --- a/code/modules/reagents/newchem/disease.dm +++ /dev/null @@ -1,320 +0,0 @@ -/datum/reagent/spider_eggs - name = "spider eggs" - id = "spidereggs" - description = "A fine dust containing spider eggs. Oh gosh." - reagent_state = SOLID - color = "#FFFFFF" - -/datum/reagent/spider_eggs/on_mob_life(mob/living/M) - if(volume > 2.5) - if(iscarbon(M)) - if(!M.get_int_organ(/obj/item/organ/internal/body_egg)) - new/obj/item/organ/internal/body_egg/spider_eggs(M) //Yes, even Xenos can fall victim to the plague that is spider infestation. - ..() - - -/datum/reagent/nanomachines - name = "Nanomachines" - id = "nanomachines" - description = "Microscopic construction robots." - color = "#535E66" // rgb: 83, 94, 102 - -/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M) - if(volume > 1.5) - M.ForceContractDisease(new /datum/disease/transformation/robot(0)) - ..() - - -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - color = "#535E66" // rgb: 83, 94, 102 - -/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M) - if(volume > 1.5) - M.ContractDisease(new /datum/disease/transformation/xeno(0)) - ..() - -/datum/reagent/fungalspores - name = "Tubercle bacillus Cosmosis microbes" - id = "fungalspores" - description = "Active fungal spores." - color = "#92D17D" // rgb: 146, 209, 125 - -/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M) - if(volume > 2.5) - M.ForceContractDisease(new /datum/disease/tuberculosis(0)) - ..() - -/datum/reagent/jagged_crystals - name = "Jagged Crystals" - id = "jagged_crystals" - description = "Rapid chemical decomposition has warped these crystals into twisted spikes." - reagent_state = SOLID - color = "#FA0000" // rgb: 250, 0, 0 - -/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M) - M.ForceContractDisease(new /datum/disease/berserker(0)) - ..() - -/datum/reagent/salmonella - name = "Salmonella" - id = "salmonella" - description = "A nasty bacteria found in spoiled food." - reagent_state = LIQUID - color = "#1E4600" - -/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) - M.ForceContractDisease(new /datum/disease/food_poisoning(0)) - ..() - -/datum/reagent/gibbis - name = "Gibbis" - id = "gibbis" - description = "Liquid gibbis." - reagent_state = LIQUID - color = "#FF0000" - -/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) - if(volume > 2.5) - M.ForceContractDisease(new /datum/disease/gbs/curable(0)) - ..() - -/datum/reagent/prions - name = "Prions" - id = "prions" - description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material." - reagent_state = LIQUID - color = "#FFFFFF" - -/datum/reagent/prions/on_mob_life(mob/living/carbon/M) - if(volume > 4.5) - M.ForceContractDisease(new /datum/disease/kuru(0)) - ..() - -/datum/reagent/grave_dust - name = "Grave Dust" - id = "grave_dust" - description = "Moldy old dust taken from a grave site." - reagent_state = LIQUID - color = "#465046" - -/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M) - if(volume > 4.5) - M.ForceContractDisease(new /datum/disease/vampire(0)) - ..() - -/datum/reagent/heartworms - name = "Space heartworms" - id = "heartworms" - description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!" - reagent_state = SOLID - color = "#925D6C" - -/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M) - if(volume > 4.5) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart) - if(ate_heart) - ate_heart.remove(H) - qdel(ate_heart) - ..() - -//virus-specific symptom reagents - -/datum/reagent/synaphydramine - name = "Diphen-Synaptizine" - id = "synaphydramine" - description = "Reduces drowsiness and hallucinations while also purging histamine from the body." - color = "#EC536D" // rgb: 236, 83, 109 - -/datum/reagent/synaphydramine/on_mob_life(mob/living/M) - M.drowsyness = max(M.drowsyness-5, 0) - if(holder.has_reagent("lsd")) - holder.remove_reagent("lsd", 5) - if(holder.has_reagent("histamine")) - holder.remove_reagent("histamine", 5) - M.hallucination = max(0, M.hallucination - 10) - if(prob(30)) - M.adjustToxLoss(1) - ..() - -//virus food -/datum/reagent/virus_food - name = "Virus Food" - id = "virusfood" - description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#899613" // rgb: 137, 150, 19 - -/datum/reagent/virus_food/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor * REAGENTS_EFFECT_MULTIPLIER - ..() - -/datum/reagent/mutagen/mutagenvirusfood - name = "mutagenic agar" - id = "mutagenvirusfood" - description = "mutates blood" - color = "#A3C00F" // rgb: 163,192,15 - -/datum/reagent/mutagen/mutagenvirusfood/sugar - name = "sucrose agar" - id = "sugarvirusfood" - color = "#41B0C0" // rgb: 65,176,192 - -/datum/reagent/diphenhydramine/diphenhydraminevirusfood - name = "virus rations" - id = "diphenhydraminevirusfood" - description = "mutates blood" - color = "#D18AA5" // rgb: 209,138,165 - -/datum/reagent/plasma_dust/plasmavirusfood - name = "virus plasma" - id = "plasmavirusfood" - description = "mutates blood" - color = "#A69DA9" // rgb: 166,157,169 - -/datum/reagent/plasma_dust/plasmavirusfood/weak - name = "weakened virus plasma" - id = "weakplasmavirusfood" - color = "#CEC3C6" // rgb: 206,195,198 - -//reactions -/datum/chemical_reaction/virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/virus_food_mutagen - name = "mutagenic agar" - id = "mutagenvirusfood" - result = "mutagenvirusfood" - required_reagents = list("mutagen" = 1, "virusfood" = 1) - result_amount = 1 - -/datum/chemical_reaction/virus_food_diphenhydramine - name = "virus rations" - id = "diphenhydraminevirusfood" - result = "diphenhydraminevirusfood" - required_reagents = list("diphenhydramine" = 1, "virusfood" = 1) - result_amount = 1 - -/datum/chemical_reaction/virus_food_plasma - name = "virus plasma" - id = "plasmavirusfood" - result = "plasmavirusfood" - required_reagents = list("plasma_dust" = 1, "virusfood" = 1) - result_amount = 1 - -/datum/chemical_reaction/virus_food_plasma_diphenhydramine - name = "weakened virus plasma" - id = "weakplasmavirusfood" - result = "weakplasmavirusfood" - required_reagents = list("diphenhydramine" = 1, "plasmavirusfood" = 1) - result_amount = 2 - -/datum/chemical_reaction/virus_food_mutagen_sugar - name = "sucrose agar" - id = "sugarvirusfood" - result = "sugarvirusfood" - required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1) - result_amount = 2 - -/datum/chemical_reaction/virus_food_mutagen_salineglucose - name = "sucrose agar" - id = "salineglucosevirusfood" - result = "sugarvirusfood" - required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1) - result_amount = 2 - - -//mix virus -/datum/chemical_reaction/mix_virus - name = "Mix Virus" - id = "mixvirus" - required_reagents = list("virusfood" = 1) - required_catalysts = list("blood" = 1) - var/level_min = 0 - var/level_max = 2 - -/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level_min, level_max) - - -/datum/chemical_reaction/mix_virus/mix_virus_2 - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 1) - level_min = 2 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_3 - name = "Mix Virus 3" - id = "mixvirus3" - required_reagents = list("plasma_dust" = 1) - level_min = 4 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_4 - name = "Mix Virus 4" - id = "mixvirus4" - required_reagents = list("uranium" = 1) - level_min = 5 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_5 - name = "Mix Virus 5" - id = "mixvirus5" - required_reagents = list("mutagenvirusfood" = 1) - level_min = 3 - level_max = 3 - -/datum/chemical_reaction/mix_virus/mix_virus_6 - name = "Mix Virus 6" - id = "mixvirus6" - required_reagents = list("sugarvirusfood" = 1) - level_min = 4 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_7 - name = "Mix Virus 7" - id = "mixvirus7" - required_reagents = list("weakplasmavirusfood" = 1) - level_min = 5 - level_max = 5 - -/datum/chemical_reaction/mix_virus/mix_virus_8 - name = "Mix Virus 8" - id = "mixvirus8" - required_reagents = list("plasmavirusfood" = 1) - level_min = 6 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_9 - name = "Mix Virus 9" - id = "mixvirus9" - required_reagents = list("diphenhydraminevirusfood" = 1) - level_min = 1 - level_max = 1 - -/datum/chemical_reaction/mix_virus/rem_virus - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("diphenhydramine" = 1) - required_catalysts = list("blood" = 1) - -/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() \ No newline at end of file diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm deleted file mode 100644 index b1f789b7f22..00000000000 --- a/code/modules/reagents/newchem/drinks.dm +++ /dev/null @@ -1,238 +0,0 @@ -/datum/reagent/ginsonic - name = "Gin and sonic" - id = "ginsonic" - description = "GOTTA GET CRUNK FAST BUT LIQUOR TOO SLOW" - reagent_state = LIQUID - color = "#1111CF" - -/datum/chemical_reaction/ginsonic - name = "ginsonic" - id = "ginsonic" - result = "ginsonic" - required_reagents = list("gintonic" = 1, "methamphetamine" = 1) - result_amount = 2 - mix_message = "The drink turns electric blue and starts quivering violently." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/ginsonic/on_mob_life(mob/living/M) - M.drowsyness = max(0, M.drowsyness-5) - if(prob(25)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - if(prob(8)) - M.reagents.add_reagent("methamphetamine",1.2) - var/sonic_message = pick("Gotta go fast!", "Time to speed, keed!", "I feel a need for speed!", "Let's juice.", "Juice time.", "Way Past Cool!") - if(prob(50)) - M.say("[sonic_message]") - else - to_chat(M, "[sonic_message ]") - ..() - -/datum/reagent/ethanol/applejack - name = "Applejack" - id = "applejack" - description = "A highly concentrated alcoholic beverage made by repeatedly freezing cider and removing the ice." - color = "#997A00" - alcohol_perc = 0.4 - -/datum/chemical_reaction/applejack - name = "applejack" - id = "applejack" - result = "applejack" - required_reagents = list("cider" = 2) - max_temp = 270 - result_amount = 1 - mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind." - mix_sound = null - -/datum/reagent/ethanol/jackrose - name = "Jack Rose" - id = "jackrose" - description = "A classic cocktail that had fallen out of fashion, but never out of taste," - color = "#664300" - alcohol_perc = 0.4 - -/datum/chemical_reaction/jackrose - name = "jackrose" - id = "jackrose" - result = "jackrose" - required_reagents = list("applejack" = 4, "lemonjuice" = 1) - result_amount = 5 - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - - -/datum/reagent/ethanol/dragons_breath //inaccessible to players, but here for admin shennanigans - name = "Dragon's Breath" - id = "dragonsbreath" - description = "Possessing this stuff probably breaks the Geneva convention." - reagent_state = LIQUID - color = "#DC0000" - alcohol_perc = 1 - -/datum/reagent/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST && prob(20)) - if(M.on_fire) - M.adjust_fire_stacks(3) - -/datum/reagent/ethanol/dragons_breath/on_mob_life(mob/living/M) - if(M.reagents.has_reagent("milk")) - to_chat(M, "The milk stops the burning. Ahhh.") - M.reagents.del_reagent("milk") - M.reagents.del_reagent("dragonsbreath") - return - if(prob(8)) - to_chat(M, "Oh god! Oh GODD!!") - if(prob(50)) - to_chat(M, "Your throat burns terribly!") - M.emote(pick("scream","cry","choke","gasp")) - M.Stun(1) - if(prob(8)) - to_chat(M, "Why!? WHY!?") - if(prob(8)) - to_chat(M, "ARGHHHH!") - if(prob(2 * volume)) - to_chat(M, "OH GOD OH GOD PLEASE NO!!
") - if(M.on_fire) - M.adjust_fire_stacks(5) - if(prob(50)) - to_chat(M, "IT BURNS!!!!") - M.visible_message("[M] is consumed in flames!") - M.dust() - return - ..() - -// ROBOT ALCOHOL PAST THIS POINT -// WOOO! - - -/datum/reagent/ethanol/synthanol - name = "Synthanol" - id = "synthanol" - description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics." - reagent_state = LIQUID - color = "#1BB1FF" - process_flags = ORGANIC | SYNTHETIC - metabolization_rate = 0.4 - alcohol_perc = 0.5 - -/datum/chemical_reaction/synthanol - name = "Synthanol" - id = "synthanol" - result = "synthanol" - required_reagents = list("lube" = 1, "plasma" = 1, "fuel" = 1) - result_amount = 3 - mix_message = "The chemicals mix to create shiny, blue substance." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/ethanol/synthanol/on_mob_life(mob/living/M) - if(!M.isSynthetic()) - holder.remove_reagent(id, 3.6) //gets removed from organics very fast - if(prob(25)) - holder.remove_reagent(id, 15) - M.fakevomit() - ..() - -/datum/reagent/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume) - if(M.isSynthetic()) - return - if(method == INGEST) - to_chat(M, pick("That was awful!", "Yuck!")) - -/datum/reagent/ethanol/synthanol/robottears - name = "Robot Tears" - id = "robottears" - description = "An oily substance that an IPC could technically consider a 'drink'." - reagent_state = LIQUID - color = "#363636" - alcohol_perc = 0.25 - -/datum/chemical_reaction/synthanol/robottears - name = "Robot Tears" - id = "robottears" - result = "robottears" - required_reagents = list("synthanol" = 1, "oil" = 1, "sodawater" = 1) - result_amount = 3 - mix_message = "The ingredients combine into a stiff, dark goo." - -/datum/reagent/ethanol/synthanol/trinary - name = "Trinary" - id = "trinary" - description = "A fruit drink meant only for synthetics, however that works." - reagent_state = LIQUID - color = "#adb21f" - alcohol_perc = 0.2 - -/datum/chemical_reaction/synthanol/trinary - name = "Trinary" - id = "trinary" - result = "trinary" - required_reagents = list("synthanol" = 1, "limejuice" = 1, "orangejuice" = 1) - result_amount = 3 - mix_message = "The ingredients mix into a colorful substance." - -/datum/reagent/ethanol/synthanol/servo - name = "Servo" - id = "servo" - description = "A drink containing some organic ingredients, but meant only for synthetics." - reagent_state = LIQUID - color = "#5b3210" - alcohol_perc = 0.25 - -/datum/chemical_reaction/synthanol/servo - name = "Servo" - id = "servo" - result = "servo" - required_reagents = list("synthanol" = 2, "cream" = 1, "hot_coco" = 1) - result_amount = 4 - mix_message = "The ingredients mix into a dark brown substance." - -/datum/reagent/ethanol/synthanol/uplink - name = "Uplink" - id = "uplink" - description = "A potent mix of alcohol and synthanol. Will only work on synthetics." - reagent_state = LIQUID - color = "#e7ae04" - alcohol_perc = 0.15 - -/datum/chemical_reaction/synthanol/uplink - name = "Uplink" - id = "uplink" - result = "uplink" - required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1) - result_amount = 5 - mix_message = "The chemicals mix to create a shiny, orange substance." - -/datum/reagent/ethanol/synthanol/synthnsoda - name = "Synth 'n Soda" - id = "synthnsoda" - description = "The classic drink adjusted for a robot's tastes." - reagent_state = LIQUID - color = "#7204e7" - alcohol_perc = 0.25 - -/datum/chemical_reaction/synthanol/synthnsoda - name = "Synth 'n Soda" - id = "synthnsoda" - result = "synthnsoda" - required_reagents = list("synthanol" = 1, "cola" = 1) - result_amount = 2 - mix_message = "The chemicals mix to create a smooth, fizzy substance." - -/datum/reagent/ethanol/synthanol/synthignon - name = "Synthignon" - id = "synthignon" - description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself." - reagent_state = LIQUID - color = "#d004e7" - alcohol_perc = 0.25 - -/datum/chemical_reaction/synthanol/synthignon - name = "Synthignon" - id = "synthignon" - result = "synthignon" - required_reagents = list("synthanol" = 1, "wine" = 1) - result_amount = 2 - mix_message = "The chemicals mix to create a fine, red substance." - -// ROBOT ALCOHOL ENDS diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm deleted file mode 100644 index 7f529b6b815..00000000000 --- a/code/modules/reagents/newchem/food.dm +++ /dev/null @@ -1,557 +0,0 @@ -/datum/reagent/questionmark // food poisoning - name = "????" - id = "????" - description = "A gross and unidentifiable substance." - reagent_state = LIQUID - color = "#63DE63" - metabolization_rate = 0.4 - -/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - M.Stun(2) - M.Weaken(2) - to_chat(M, "Ugh! Eating that was a terrible idea!") - M.ForceContractDisease(new /datum/disease/food_poisoning(0)) - -/datum/reagent/egg - name = "Egg" - id = "egg" - description = "A runny and viscous mixture of clear and yellow fluids." - reagent_state = LIQUID - color = "#F0C814" - -/datum/reagent/egg/on_mob_life(mob/living/M) - if(prob(8)) - M.emote("fart") - if(prob(3)) - M.reagents.add_reagent("cholesterol", rand(1,2)) - ..() - -/datum/reagent/triple_citrus - name = "Triple Citrus" - id = "triple_citrus" - description = "A refreshing mixed drink of orange, lemon and lime juice." - reagent_state = LIQUID - color = "#23A046" - -/datum/chemical_reaction/triple_citrus - name = "triple_citrus" - id = "triple_citrus" - result = "triple_citrus" - required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) - result_amount = 3 - mix_message = "The citrus juices begin to blend together." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - M.adjustToxLoss(-rand(1,2)) - -/datum/reagent/corn_starch - name = "Corn Starch" - id = "corn_starch" - description = "The powdered starch of maize, derived from the kernel's endosperm. Used as a thickener for gravies and puddings." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/corn_syrup - name = "corn_syrup" - id = "corn_syrup" - result = "corn_syrup" - required_reagents = list("corn_starch" = 1, "sacid" = 1) - result_amount = 2 - min_temp = 374 - mix_message = "The mixture forms a viscous, clear fluid!" - -/datum/reagent/corn_syrup - name = "Corn Syrup" - id = "corn_syrup" - description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/reagent/corn_syrup/on_mob_life(mob/living/M) - M.reagents.add_reagent("sugar", 1.2) - ..() - -/datum/chemical_reaction/vhfcs - name = "vhfcs" - id = "vhfcs" - result = "vhfcs" - required_reagents = list("corn_syrup" = 1) - required_catalysts = list("enzyme" = 1) - result_amount = 1 - mix_message = "The mixture emits a sickly-sweet smell." - -/datum/reagent/vhfcs - name = "Very-high-fructose corn syrup" - id = "vhfcs" - description = "An incredibly sweet syrup, created from corn syrup treated with enzymes to convert its sugars into fructose." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/reagent/vhfcs/on_mob_life(mob/living/M) - M.reagents.add_reagent("sugar", 2.4) - ..() - -/datum/chemical_reaction/cola - name = "cola" - id = "cola" - result = "cola" - required_reagents = list("carbon" = 1, "oxygen" = 1, "water" = 1, "sugar" = 1) - result_amount = 4 - mix_message = "The mixture begins to fizz." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/reagent/honey - name = "Honey" - id = "honey" - description = "A sweet substance produced by bees through partial digestion. Bee barf." - reagent_state = LIQUID - color = "#d3a308" - -/datum/reagent/honey/on_mob_life(mob/living/M) - M.reagents.add_reagent("sugar", 0.4) - if(prob(20)) - M.heal_organ_damage(3,1) - ..() - -/datum/reagent/chocolate - name = "Chocolate" - id = "chocolate" - description = "Chocolate is a delightful product derived from the seeds of the theobroma cacao tree." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM //same as pure cocoa powder, because it makes no sense that chocolate won't fill you up and make you fat - color = "#2E2418" - -/datum/reagent/chocolate/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - M.reagents.add_reagent("sugar", 0.8) - ..() - -/datum/reagent/chocolate/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T) - -/datum/reagent/mugwort - name = "Mugwort" - id = "mugwort" - description = "A rather bitter herb once thought to hold magical protective properties." - reagent_state = LIQUID - color = "#21170E" - -/datum/reagent/mugwort/on_mob_life(mob/living/M) - if(ishuman(M) && M.mind) - if(M.mind.special_role == SPECIAL_ROLE_WIZARD) - M.adjustToxLoss(-1*REM) - M.adjustOxyLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - -/datum/reagent/porktonium - name = "Porktonium" - id = "porktonium" - description = "A highly-radioactive pork byproduct first discovered in hotdogs." - reagent_state = LIQUID - color = "#AB5D5D" - metabolization_rate = 0.2 - overdose_threshold = 133 - -/datum/reagent/porktonium/overdose_process(mob/living/M, severity) - if(prob(15)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent("radium", 15) - M.reagents.add_reagent("cyanide", 10) - -/datum/reagent/fungus - name = "Space fungus" - id = "fungus" - description = "Scrapings of some unknown fungus found growing on the station walls." - reagent_state = LIQUID - color = "#C87D28" - -/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - var/ranchance = rand(1,10) - if(ranchance == 1) - to_chat(M, "You feel very sick.") - M.reagents.add_reagent("toxin", rand(1,5)) - else if(ranchance <= 5) - to_chat(M, "That tasted absolutely FOUL.") - M.ForceContractDisease(new /datum/disease/food_poisoning(0)) - else - to_chat(M, "Yuck!") - -/datum/reagent/chicken_soup - name = "Chicken soup" - id = "chicken_soup" - description = "An old household remedy for mild illnesses." - reagent_state = LIQUID - color = "#B4B400" - metabolization_rate = 0.2 - -/datum/reagent/chicken_soup/on_mob_life(mob/living/M) - M.nutrition += 2 - ..() - -/datum/reagent/msg - name = "Monosodium glutamate" - id = "msg" - description = "Monosodium Glutamate is a sodium salt known chiefly for its use as a controversial flavor enhancer." - reagent_state = LIQUID - color = "#F5F5F5" - metabolization_rate = 0.2 - -/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - to_chat(M, "That tasted amazing!") - - -/datum/reagent/msg/on_mob_life(mob/living/M) - if(prob(5)) - if(prob(10)) - M.adjustToxLoss(rand(2.4)) - if(prob(7)) - to_chat(M, "A horrible migraine overpowers you.") - M.Stun(rand(2,5)) - ..() - -/datum/reagent/cheese - name = "Cheese" - id = "cheese" - description = "Some cheese. Pour it out to make it solid." - reagent_state = SOLID - color = "#FFFF00" - metabolization_rate = 0 //heheheh - - -/datum/reagent/cheese/on_mob_life(mob/living/M) - if(prob(3)) - M.reagents.add_reagent("cholesterol", rand(1,2)) - ..() - -/datum/reagent/cheese/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T) - -/datum/chemical_reaction/cheese - name = "cheese" - id = "cheese" - result = "cheese" - required_reagents = list("vomit" = 1, "milk" = 1) - result_amount = 1 - mix_message = "The mixture curdles up." - -/datum/chemical_reaction/cheese/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("A faint cheesy smell drifts through the air...") - -/datum/reagent/fake_cheese - name = "Cheese substitute" - id = "fake_cheese" - description = "A cheese-like substance derived loosely from actual cheese." - reagent_state = LIQUID - color = "#B2B139" - overdose_threshold = 50 - -/datum/reagent/fake_cheese/overdose_process(mob/living/M, severity) - if(prob(8)) - to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") - M.adjustToxLoss(rand(1,2)) - -/datum/reagent/weird_cheese - name = "Weird cheese" - id = "weird_cheese" - description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid." - reagent_state = SOLID - color = "#50FF00" - metabolization_rate = 0 //heheheh - addiction_chance = 5 - -/datum/reagent/weird_cheese/on_mob_life(mob/living/M) - if(prob(5)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - ..() - -/datum/reagent/weird_cheese/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T) - -/datum/chemical_reaction/weird_cheese - name = "Weird cheese" - id = "weird_cheese" - result = "weird_cheese" - required_reagents = list("green_vomit" = 1, "milk" = 1) - result_amount = 1 - mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench." - mix_sound = 'sound/goonstation/misc/gurggle.ogg' - -/datum/chemical_reaction/weird_cheese/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("A horrible smell assaults your nose! What in space is it?") - -/datum/reagent/beans - name = "Refried beans" - id = "beans" - description = "A dish made of mashed beans cooked with lard." - reagent_state = LIQUID - color = "#684435" - -/datum/reagent/beans/on_mob_life(mob/living/M) - if(prob(10)) - M.emote("fart") - ..() - -/datum/reagent/bread - name = "Bread" - id = "bread" - description = "Bread! Yep, bread." - reagent_state = SOLID - color = "#9C5013" - -/datum/reagent/bread/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T) - -/datum/reagent/vomit - name = "Vomit" - id = "vomit" - description = "Looks like someone lost their lunch. And then collected it. Yuck." - reagent_state = LIQUID - color = "#FFFF00" - -/datum/reagent/vomit/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/effect/decal/cleanable/vomit(T) - playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) - -/datum/reagent/greenvomit - name = "Green vomit" - id = "green_vomit" - description = "Whoa, that can't be natural. That's horrible." - reagent_state = LIQUID - color = "#78FF74" - -/datum/reagent/greenvomit/reaction_turf(turf/T, volume) - if(volume >= 5 && !istype(T, /turf/space)) - new /obj/effect/decal/cleanable/vomit/green(T) - playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) - - -/datum/reagent/ectoplasm - name = "Ectoplasm" - id = "ectoplasm" - description = "A bizarre gelatinous substance supposedly derived from ghosts." - reagent_state = LIQUID - color = "#8EAE7B" - process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell - -/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.") - to_chat(M, "[spooky_eat]") - -/datum/reagent/ectoplasm/on_mob_life(mob/living/M) - var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...") - if(prob(8)) - to_chat(M, "[spooky_message]") - ..() - -/datum/reagent/ectoplasm/reaction_turf(turf/T, volume) - if(volume >= 10 && !istype(T, /turf/space)) - new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T) - -/datum/reagent/soybeanoil - name = "Space-soybean oil" - id = "soybeanoil" - description = "An oil derived from extra-terrestrial soybeans." - reagent_state = LIQUID - color = "#B1B0B0" - -/datum/reagent/soybeanoil/on_mob_life(mob/living/M) - if(prob(10)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent("porktonium", 5) - ..() - -/datum/reagent/hydrogenated_soybeanoil - name = "Partially hydrogenated space-soybean oil" - id = "hydrogenated_soybeanoil" - description = "An oil derived from extra-terrestrial soybeans, with additional hydrogen atoms added to convert it into a saturated form." - reagent_state = LIQUID - color = "#B1B0B0" - metabolization_rate = 0.2 - overdose_threshold = 75 - -/datum/reagent/hydrogenated_soybeanoil/on_mob_life(mob/living/M) - if(prob(15)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent("porktonium", 5) - if(volume >= 75) - metabolization_rate = 0.4 - else - metabolization_rate = 0.2 - ..() - -/datum/reagent/hydrogenated_soybeanoil/overdose_process(mob/living/M, severity) - if(prob(33)) - to_chat(M, "You feel horribly weak.") - if(prob(10)) - to_chat(M, "You cannot breathe!") - M.adjustOxyLoss(5) - if(prob(5)) - to_chat(M, "You feel a sharp pain in your chest!") - M.adjustOxyLoss(25) - M.Stun(5) - M.Paralyse(10) - -/datum/chemical_reaction/hydrogenated_soybeanoil - name = "Partially hydrogenated space-soybean oil" - id = "hydrogenated_soybeanoil" - result = "hydrogenated_soybeanoil" - required_reagents = list("soybeanoil" = 1, "hydrogen" = 1) - result_amount = 2 - min_temp = 520 - mix_message = "The mixture emits a burnt, oily smell." - -/datum/reagent/meatslurry - name = "Meat Slurry" - id = "meatslurry" - description = "A paste comprised of highly-processed organic material. Uncomfortably similar to deviled ham spread." - reagent_state = LIQUID - color = "#EBD7D7" - -/datum/reagent/meatslurry/on_mob_life(mob/living/M) - if(prob(4)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - ..() - -/datum/reagent/meatslurry/reaction_turf(turf/T, volume) - if(volume >= 5 && prob(10) && !istype(T, /turf/space)) - new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) - playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) - -/datum/chemical_reaction/meatslurry - name = "Meat Slurry" - id = "meatslurry" - result = "meatslurry" - required_reagents = list("corn_starch" = 1, "blood" = 1) - result_amount = 2 - mix_message = "The mixture congeals into a bloody mass." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/reagent/mashedpotatoes - name = "Mashed potatoes" - id = "mashedpotatoes" - description = "A starchy food paste made from boiled potatoes." - reagent_state = SOLID - color = "#D6D9C1" - -/datum/reagent/gravy - name = "Gravy" - id = "gravy" - description = "A savory sauce made from a simple meat-dripping roux and milk." - reagent_state = LIQUID - color = "#B4641B" - -/datum/chemical_reaction/gravy - name = "Gravy" - id = "gravy" - result = "gravy" - required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1) - result_amount = 3 - min_temp = 374 - mix_message = "The substance thickens and takes on a meaty odor." - -/datum/reagent/beff - name = "Beff" - id = "beff" - description = "An advanced blend of mechanically-recovered meat and textured synthesized protein product notable for its unusual crystalline grain when sliced." - reagent_state = SOLID - color = "#AC7E67" - -/datum/reagent/beff/on_mob_life(mob/living/M) - if(prob(5)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8) - else if(prob(6)) - to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]") - M.emote(pick("groan","moan")) - ..() - -/datum/chemical_reaction/beff - name = "Beff" - id = "beff" - result = "beff" - required_reagents = list("hydrogenated_soybeanoil" = 2, "meatslurry" = 1, "plasma" = 1) - result_amount = 4 - mix_message = "The mixture solidifies, taking a crystalline appearance." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/reagent/pepperoni - name = "Pepperoni" - id = "pepperoni" - description = "An Italian-American variety of salami usually made from beef and pork" - reagent_state = SOLID - color = "#AC7E67" - -/datum/reagent/pepperoni/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(H.wear_mask) - to_chat(H, "The pepperoni bounces off your mask!") - return - - if(H.head) - to_chat(H, "Your mask protects you from the errant pepperoni!") - return - - if(prob(50)) - M.adjustBruteLoss(1) - playsound(M, 'sound/effects/woodhit.ogg', 50, 1) - to_chat(M, "A slice of pepperoni slaps you!") - else - M.emote("burp") - to_chat(M, "My goodness, that was tasty!") - - -/datum/chemical_reaction/pepperoni - name = "Pepperoni" - id = "pepperoni" - result = "pepperoni" - required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1) - result_amount = 2 - mix_message = "The beff and the synthflesh combine to form a smoky red log." - mix_sound = 'sound/effects/blobattack.ogg' - -/datum/reagent/cholesterol - name = "cholesterol" - id = "cholesterol" - description = "Pure cholesterol. Probably not very good for you." - reagent_state = LIQUID - color = "#FFFAC8" - -/datum/reagent/cholesterol/on_mob_life(mob/living/M) - if(volume >= 25 && prob(volume*0.15)) - to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!") - M.adjustToxLoss(rand(1,2)) - else if(volume >= 45 && prob(volume*0.08)) - to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!") - M.adjustToxLoss(rand(2,4)) - M.Stun(1) - else if(volume >= 150 && prob(volume*0.01)) - to_chat(M, "Your chest is burning with pain!") - M.Stun(1) - M.Weaken(1) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.heart_attack = 1 - ..() \ No newline at end of file diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm deleted file mode 100644 index 7ad083407d9..00000000000 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ /dev/null @@ -1,212 +0,0 @@ -#define ADDICTION_TIME 4800 //8 minutes - -/datum/reagent - var/overdose_threshold = 0 - var/addiction_chance = 0 - var/addiction_stage = 1 - var/last_addiction_dose = 0 - var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. - var/current_cycle = 1 - -/datum/reagents/proc/metabolize(mob/living/M) - if(M) - chem_temp = M.bodytemperature - handle_reactions() - for(var/A in reagent_list) - var/datum/reagent/R = A - if(!istype(R)) // How are non-reagents ending up in the reagents_list? - continue - if(!R.holder) - continue - if(!M) - M = R.holder.my_atom - if(ishuman(M)) - var/mob/living/carbon/human/H = M - //Check if this mob's species is set and can process this type of reagent - var/can_process = 0 - //If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!) - if(H.species && H.species.reagent_tag) - if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN - can_process = 1 - if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG - can_process = 1 - //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater - if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO)) - can_process = 1 - - //If handle_reagents returns 0, it's doing the reagent removal on its own - var/species_handled = !(H.species.handle_reagents(H, R)) - can_process = can_process && !species_handled - //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent - if(can_process == 0) - if(!species_handled) - R.holder.remove_reagent(R.id, R.metabolization_rate) - continue - //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) - else - if(R.process_flags == SYNTHETIC) - R.holder.remove_reagent(R.id, R.metabolization_rate) - continue - //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here. - if(M && R) - R.on_mob_life(M) - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) - R.overdosed = 1 - R.overdose_start(M) - if(R.volume < R.overdose_threshold && R.overdosed) - R.overdosed = 0 - if(R.overdosed) - R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1) - - for(var/A in addiction_list) - var/datum/reagent/R = A - if(M && R) - if(R.addiction_stage < 5) - if(prob(5)) - R.addiction_stage++ - switch(R.addiction_stage) - if(1) - R.addiction_act_stage1(M) - if(2) - R.addiction_act_stage2(M) - if(3) - R.addiction_act_stage3(M) - if(4) - R.addiction_act_stage4(M) - if(5) - R.addiction_act_stage5(M) - if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end - to_chat(M, "You no longer feel reliant on [R.name]!") - addiction_list.Remove(R) - update_total() - -/datum/reagents/proc/death_metabolize(mob/living/M) - if(!M) - return - if(M.stat != DEAD) //what part of DEATH_metabolize don't you get? - return - for(var/A in reagent_list) - var/datum/reagent/R = A - if(!istype(R)) - continue - if(M && R) - R.on_mob_death(M) - -/datum/reagents/proc/overdose_list() - var/od_chems[0] - for(var/datum/reagent/R in reagent_list) - if(R.overdosed) - od_chems.Add(R.id) - return od_chems - - -/datum/reagents/proc/reagent_on_tick() - for(var/datum/reagent/R in reagent_list) - R.on_tick() - return - -// Called every time reagent containers process. -/datum/reagent/proc/on_tick(data) - return - -// Called when the reagent container is hit by an explosion -/datum/reagent/proc/on_ex_act(severity) - return - -// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -/datum/reagent/proc/overdose_process(mob/living/M, severity) - var/effect = rand(1, 100) - severity - if(effect <= 8) - M.adjustToxLoss(severity) - return effect - -/datum/reagent/proc/overdose_start(mob/living/M) - return - -/datum/reagent/proc/addiction_act_stage1(mob/living/M) - return - -/datum/reagent/proc/addiction_act_stage2(mob/living/M) - if(prob(8)) - M.emote("shiver") - if(prob(8)) - M.emote("sneeze") - if(prob(4)) - to_chat(M, "You feel a dull headache.") - -/datum/reagent/proc/addiction_act_stage3(mob/living/M) - if(prob(8)) - M.emote("twitch_s") - if(prob(8)) - M.emote("shiver") - if(prob(4)) - to_chat(M, "You begin craving [name]!") - -/datum/reagent/proc/addiction_act_stage4(mob/living/M) - if(prob(8)) - M.emote("twitch") - if(prob(4)) - to_chat(M, "You have the strong urge for some [name]!") - if(prob(4)) - to_chat(M, "You REALLY crave some [name]!") - -/datum/reagent/proc/addiction_act_stage5(mob/living/M) - if(prob(8)) - M.emote("twitch") - if(prob(6)) - to_chat(M, "Your stomach lurches painfully!") - M.visible_message("[M] gags and retches!") - M.Stun(rand(2,4)) - M.Weaken(rand(2,4)) - if(prob(5)) - to_chat(M, "You feel like you can't live without [name]!") - if(prob(5)) - to_chat(M, "You would DIE for some [name] right now!") - -/datum/reagent/proc/reagent_deleted() - return - -var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs -var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs -/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") - if(holder && holder.my_atom) - if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - switch(initial(SA.gold_core_spawnable)) - if(CHEM_MOB_SPAWN_HOSTILE) - chemical_mob_spawn_meancritters += T - if(CHEM_MOB_SPAWN_FRIENDLY) - chemical_mob_spawn_nicecritters += T - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" - message += " (VV)" - - var/mob/M = get(A, /mob) - if(M) - message += " - Carried By: [key_name_admin(M)](?) (FLW)" - else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_eyes() - for(var/i = 1, i <= amount_to_spawn, i++) - var/chosen - if(reaction_name == "Friendly Gold Slime") - chosen = pick(chemical_mob_spawn_nicecritters) - else - chosen = pick(chemical_mob_spawn_meancritters) - var/mob/living/simple_animal/C = new chosen - C.faction |= mob_faction - C.forceMove(get_turf(holder.my_atom)) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - -#undef ADDICTION_TIME \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm deleted file mode 100644 index 3b4cc507415..00000000000 --- a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm +++ /dev/null @@ -1,23 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/datum/chemical_reaction - var/name = null - var/id = null - var/result = null - var/list/required_reagents = list() - var/list/required_catalysts = list() - - // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things - var/atom/required_container = null // the container required for the reaction to happen - var/required_other = 0 // an integer required for the reaction to happen - - var/result_amount = 0 - var/secondary = 0 // set to nonzero if secondary reaction - var/list/secondary_results = list() //additional reagents produced by the reaction - var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement - var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this). - var/mix_message = "The solution begins to bubble." - var/mix_sound = 'sound/effects/bubbles.ogg' - var/no_message = 0 - -/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) - return \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm deleted file mode 100644 index afcd0d398ce..00000000000 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm +++ /dev/null @@ -1,71 +0,0 @@ -//Anything for harm or hostile intents go here (explosions, EMPs, thermite, mutagen) -/datum/chemical_reaction/explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 - mix_message = "The mixture explodes!" - -/datum/chemical_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume) - var/datum/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) - e.start() - holder.clear_reagents() - -/datum/chemical_reaction/emp_pulse - name = "EMP Pulse" - id = "emp_pulse" - result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - result_amount = 2 - -/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) - holder.clear_reagents() - -/datum/chemical_reaction/mutagen - name = "Unstable mutagen" - id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1) - result_amount = 3 - mix_message = "The substance turns neon green and bubbles unnervingly." - -/datum/chemical_reaction/thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 - -/datum/chemical_reaction/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) - result_amount = 2 - -/datum/chemical_reaction/nitroglycerin/on_reaction(datum/reagents/holder, created_volume) - var/datum/effect/system/reagents_explosion/e = new() - e.set_up(round(created_volume/2, 1), holder.my_atom, 0, 0) - e.start() - holder.clear_reagents() - -/datum/chemical_reaction/condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 2) - required_catalysts = list("plasma" = 5) - result_amount = 1 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm deleted file mode 100644 index 0550813849c..00000000000 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/chemical_reaction/hydrocodone - name = "Hydrocodone" - id = "hydrocodone" - result = "hydrocodone" - required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1) - result_amount = 2 - -/datum/chemical_reaction/mitocholide - name = "mitocholide" - id = "mitocholide" - result = "mitocholide" - required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) - result_amount = 3 - -/datum/chemical_reaction/cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - result = "cryoxadone" - required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1) - result_amount = 4 - mix_message = "The solution bubbles softly." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - -/datum/chemical_reaction/spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - result = "spaceacillin" - required_reagents = list("fungus" = 1, "ethanol" = 1) - result_amount = 2 - mix_message = "The solvent extracts an antibiotic compound from the fungus." - -/datum/chemical_reaction/rezadone - name = "Rezadone" - id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1) - result_amount = 3 - -/datum/chemical_reaction/sterilizine - name = "Sterilizine" - id = "sterilizine" - result = "sterilizine" - required_reagents = list("antihol" = 2, "chlorine" = 1) - result_amount = 3 diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm deleted file mode 100644 index 8a5dedf218b..00000000000 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ /dev/null @@ -1,147 +0,0 @@ -// foam and foam precursor - -/datum/chemical_reaction/surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) - result_amount = 5 - mix_message = "A head of foam results from the mixture's constant fizzing." - -/datum/chemical_reaction/foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 - -/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - holder.my_atom.visible_message("The solution spews out foam!") - - var/datum/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 0) - s.start() - holder.clear_reagents() - - -/datum/chemical_reaction/metalfoam - name = "Metal Foam" - id = "metalfoam" - result = null - required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1) - result_amount = 5 - -/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - - holder.my_atom.visible_message("The solution spews out a metalic foam!") - - var/datum/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, MFOAM_ALUMINUM) - s.start() - - -/datum/chemical_reaction/ironfoam - name = "Iron Foam" - id = "ironlfoam" - result = null - required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1) - result_amount = 5 - -/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - - holder.my_atom.visible_message("= 5) - var/obj/item/weapon/book/affectedbook = O - affectedbook.dat = null - to_chat(usr, "The solution melts away the ink on the book.") - else - to_chat(usr, "It wasn't enough...") - -/datum/reagent/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel. - if(method == TOUCH) - M.adjust_fire_stacks(volume / 15) - - -/datum/reagent/ethanol/beer - name = "Beer" - id = "beer" - description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/cider - name = "Cider" - id = "cider" - description = "An alcoholic beverage derived from apples." - color = "#174116" - alcohol_perc = 0.2 - -/datum/reagent/ethanol/whiskey - name = "Whiskey" - id = "whiskey" - description = "A superb and well-aged single-malt whiskey. Damn." - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/specialwhiskey - name = "Special Blend Whiskey" - id = "specialwhiskey" - description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/gin - name = "Gin" - id = "gin" - description = "It's gin. In space. I say, good sir." - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 3 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/absinthe - name = "Absinthe" - id = "absinthe" - description = "Watch out that the Green Fairy doesn't come for you!" - color = "#33EE00" // rgb: lots, ??, ?? - overdose_threshold = 30 - dizzy_adj = 5 - alcohol_perc = 0.7 - -//copy paste from LSD... shoot me -/datum/reagent/ethanol/absinthe/on_mob_life(mob/living/M) - M.hallucination += 5 - ..() - -/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity) - M.adjustToxLoss(1) - -/datum/reagent/ethanol/rum - name = "Rum" - id = "rum" - description = "Popular with the sailors. Not very popular with everyone else." - color = "#664300" // rgb: 102, 67, 0 - overdose_threshold = 30 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/rum/on_mob_life(mob/living/M) - M.dizziness +=5 - ..() - -/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity) - M.adjustToxLoss(1) - -/datum/reagent/ethanol/mojito - name = "Mojito" - id = "mojito" - description = "If it's good enough for Spesscuba, it's good enough for you." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/vodka - name = "Vodka" - id = "vodka" - description = "Number one drink AND fueling choice for Russians worldwide." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/sake - name = "Sake" - id = "sake" - description = "Anime's favorite drink." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/tequila - name = "Tequila" - id = "tequila" - description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" - color = "#A8B0B7" // rgb: 168, 176, 183 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/vermouth - name = "Vermouth" - id = "vermouth" - description = "You suddenly feel a craving for a martini..." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/wine - name = "Wine" - id = "wine" - description = "An premium alchoholic beverage made from distilled grape juice." - color = "#7E4043" // rgb: 126, 64, 67 - dizzy_adj = 2 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/cognac - name = "Cognac" - id = "cognac" - description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning". - name = "Suicider" - id = "suicider" - description = "An unbelievably strong and potent variety of Cider." - color = "#CF3811" - dizzy_adj = 20 - alcohol_perc = 1 //because that's a thing it's supposed to do, I guess - -/datum/reagent/ethanol/ale - name = "Ale" - id = "ale" - description = "A dark alchoholic beverage made by malted barley and yeast." - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.1 - -/datum/reagent/ethanol/thirteenloko - name = "Thirteen Loko" - id = "thirteenloko" - description = "A potent mixture of caffeine and alcohol." - reagent_state = LIQUID - color = "#102000" // rgb: 16, 32, 0 - alcohol_perc = 0.3 - heart_rate_increase = 1 - -/datum/reagent/ethanol/thirteenloko/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - M.drowsyness = max(0, M.drowsyness-7) - M.AdjustSleeping(-2) - if(M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) - M.Jitter(5) - ..() - - -/////////////////////////////////////////////////////////////////cocktail entities////////////////////////////////////////////// - -/datum/reagent/ethanol/bilk - name = "Bilk" - id = "bilk" - description = "This appears to be beer mixed with milk. Disgusting." - reagent_state = LIQUID - color = "#895C4C" // rgb: 137, 92, 76 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/atomicbomb - name = "Atomic Bomb" - id = "atomicbomb" - description = "Nuclear proliferation never tasted so good." - reagent_state = LIQUID - color = "#666300" // rgb: 102, 99, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/threemileisland - name = "THree Mile Island Iced Tea" - id = "threemileisland" - description = "Made for a woman, strong enough for a man." - reagent_state = LIQUID - color = "#666340" // rgb: 102, 99, 64 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/goldschlager - name = "Goldschlager" - id = "goldschlager" - description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/patron - name = "Patron" - id = "patron" - description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." - reagent_state = LIQUID - color = "#585840" // rgb: 88, 88, 64 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/gintonic - name = "Gin and Tonic" - id = "gintonic" - description = "An all time classic, mild cocktail." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/cuba_libre - name = "Cuba Libre" - id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolution." - reagent_state = LIQUID - color = "#3E1B00" // rgb: 62, 27, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/whiskey_cola - name = "Whiskey Cola" - id = "whiskeycola" - description = "Whiskey, mixed with cola. Surprisingly refreshing." - reagent_state = LIQUID - color = "#3E1B00" // rgb: 62, 27, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/martini - name = "Classic Martini" - id = "martini" - description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/vodkamartini - name = "Vodka Martini" - id = "vodkamartini" - description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/white_russian - name = "White Russian" - id = "whiterussian" - description = "That's just, like, your opinion, man..." - reagent_state = LIQUID - color = "#A68340" // rgb: 166, 131, 64 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/screwdrivercocktail - name = "Screwdriver" - id = "screwdrivercocktail" - description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." - reagent_state = LIQUID - color = "#A68310" // rgb: 166, 131, 16 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/booger - name = "Booger" - id = "booger" - description = "Ewww..." - reagent_state = LIQUID - color = "#A68310" // rgb: 166, 131, 16 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/bloody_mary - name = "Bloody Mary" - id = "bloodymary" - description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - description = "Whoah, this stuff looks volatile!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.7 //ouch - -/datum/reagent/ethanol/brave_bull - name = "Brave Bull" - id = "bravebull" - description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/tequila_sunrise - name = "Tequila Sunrise" - id = "tequilasunrise" - description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/toxins_special - name = "Toxins Special" - id = "toxinsspecial" - description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/toxins_special/on_mob_life(mob/living/M) - if(M.bodytemperature < 330) - M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - -/datum/reagent/ethanol/beepsky_smash - name = "Beepsky Smash" - id = "beepskysmash" - description = "Deny drinking this and prepare for THE LAW." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/beepsky_smash/on_mob_life(mob/living/M) - M.Stun(1) - ..() - -/datum/reagent/ethanol/irish_cream - name = "Irish Cream" - id = "irishcream" - description = "Whiskey-imbued cream, what else would you expect from the Irish." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/manly_dorf - name = "The Manly Dorf" - id = "manlydorf" - description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/longislandicedtea - name = "Long Island Iced Tea" - id = "longislandicedtea" - description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/moonshine - name = "Moonshine" - id = "moonshine" - description = "You've really hit rock bottom now... your liver packed its bags and left last night." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.8 //yeeehaw - -/datum/reagent/ethanol/b52 - name = "B-52" - id = "b52" - description = "Coffee, Irish Cream, and congac. You will get bombed." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/irishcoffee - name = "Irish Coffee" - id = "irishcoffee" - description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/margarita - name = "Margarita" - id = "margarita" - description = "On the rocks with salt on the rim. Arriba~!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/black_russian - name = "Black Russian" - id = "blackrussian" - description = "For the lactose-intolerant. Still as classy as a White Russian." - reagent_state = LIQUID - color = "#360000" // rgb: 54, 0, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/manhattan - name = "Manhattan" - id = "manhattan" - description = "The Detective's undercover drink of choice. He never could stomach gin..." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/manhattan_proj - name = "Manhattan Project" - id = "manhattan_proj" - description = "A scienitst's drink of choice, for pondering ways to blow up the station." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/whiskeysoda - name = "Whiskey Soda" - id = "whiskeysoda" - description = "Ultimate refreshment." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/antifreeze - name = "Anti-freeze" - id = "antifreeze" - description = "Ultimate refreshment." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/antifreeze/on_mob_life(mob/living/M) - if(M.bodytemperature < 330) - M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - -/datum/reagent/ethanol/barefoot - name = "Barefoot" - id = "barefoot" - description = "Barefoot and pregnant" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/snowwhite - name = "Snow White" - id = "snowwhite" - description = "A cold refreshment" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/demonsblood - name = "Demons Blood" - id = "demonsblood" - description = "AHHHH!!!!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 10 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/vodkatonic - name = "Vodka and Tonic" - id = "vodkatonic" - description = "For when a gin and tonic isn't russian enough." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/ginfizz - name = "Gin Fizz" - id = "ginfizz" - description = "Refreshingly lemony, deliciously dry." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/bahama_mama - name = "Bahama mama" - id = "bahama_mama" - description = "Tropic cocktail." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/singulo - name = "Singulo" - id = "singulo" - description = "A blue-space beverage!" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - dizzy_adj = 15 - alcohol_perc = 0.7 - -/datum/reagent/ethanol/sbiten - name = "Sbiten" - id = "sbiten" - description = "A spicy Vodka! Might be a little hot for the little guys!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/sbiten/on_mob_life(mob/living/M) - if(M.bodytemperature < 360) - M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - -/datum/reagent/ethanol/devilskiss - name = "Devils Kiss" - id = "devilskiss" - description = "Creepy time!" - reagent_state = LIQUID - color = "#A68310" // rgb: 166, 131, 16 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/red_mead - name = "Red Mead" - id = "red_mead" - description = "The true Viking drink! Even though it has a strange red color." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/mead - name = "Mead" - id = "mead" - description = "A Vikings drink, though a cheap one." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/iced_beer - name = "Iced Beer" - id = "iced_beer" - description = "A beer which is so cold the air around it freezes." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/iced_beer/on_mob_life(mob/living/M) - if(M.bodytemperature > 270) - M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - -/datum/reagent/ethanol/grog - name = "Grog" - id = "grog" - description = "Watered down rum, Nanotrasen approves!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/aloe - name = "Aloe" - id = "aloe" - description = "So very, very, very good." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/andalusia - name = "Andalusia" - id = "andalusia" - description = "A nice, strange named drink." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.4 - -/datum/reagent/ethanol/alliescocktail - name = "Allies Cocktail" - id = "alliescocktail" - description = "A drink made from your allies." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/acid_spit - name = "Acid Spit" - id = "acidspit" - description = "A drink by Nanotrasen. Made from live aliens." - reagent_state = LIQUID - color = "#365000" // rgb: 54, 80, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/amasec - name = "Amasec" - id = "amasec" - description = "Official drink of the Imperium." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/neurotoxin - name = "Neuro-toxin" - id = "neurotoxin" - description = "A strong neurotoxin that puts the subject into a death-like state." - reagent_state = LIQUID - color = "#2E2E61" // rgb: 46, 46, 97 - dizzy_adj = 6 - alcohol_perc = 0.7 - heart_rate_decrease = 1 - -/datum/reagent/ethanol/neurotoxin/on_mob_life(mob/living/M) - M.weakened = max(M.weakened, 3) - if(current_cycle >=55) - M.druggy = max(M.druggy, 55) - if(current_cycle >=200) - M.adjustToxLoss(2) - ..() - -/datum/reagent/ethanol/changelingsting - name = "Changeling Sting" - id = "changelingsting" - description = "A stingy drink." - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - alcohol_perc = 0.7 - -/datum/reagent/ethanol/changelingsting/on_mob_life(mob/living/M) - M.dizziness +=5 - ..() - -/datum/reagent/ethanol/irishcarbomb - name = "Irish Car Bomb" - id = "irishcarbomb" - description = "Mmm, tastes like chocolate cake..." - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - alcohol_perc = 0.3 - -/datum/reagent/ethanol/irishcarbomb/on_mob_life(mob/living/M) - M.dizziness +=5 - ..() - -/datum/reagent/ethanol/syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - description = "A Syndicate bomb" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - description = "The surprise is, it's green!" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/driestmartini - name = "Driest Martini" - id = "driestmartini" - description = "Only for the experienced. You think you see sand floating in the glass." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#2E6671" // rgb: 46, 102, 113 - alcohol_perc = 0.5 - -/datum/reagent/ethanol/driestmartini/on_mob_life(mob/living/M) - M.dizziness +=10 - if(current_cycle >= 55 && current_cycle < 115) - M.stuttering += 10 - ..() - -/datum/reagent/ethanol/kahlua - name = "Kahlua" - id = "kahlua" - description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" - color = "#664300" // rgb: 102, 67, 0 - alcohol_perc = 0.2 - -/datum/reagent/ethanol/kahlua/on_mob_life(mob/living/M) - M.dizziness = max(0, M.dizziness-5) - M.drowsyness = max(0, M.drowsyness-3) - M.AdjustSleeping(-2) - M.Jitter(5) - ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm deleted file mode 100644 index 26bad6c1665..00000000000 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ /dev/null @@ -1,285 +0,0 @@ -/datum/reagent/drink/orangejuice - name = "Orange juice" - id = "orangejuice" - description = "Both delicious AND rich in Vitamin C, what more do you need?" - color = "#E78108" // rgb: 231, 129, 8 - -/datum/reagent/drink/orangejuicde/on_mob_life(mob/living/M) - if(M.getOxyLoss() && prob(30)) - M.adjustOxyLoss(-1*REM) - ..() - -/datum/reagent/drink/tomatojuice - name = "Tomato Juice" - id = "tomatojuice" - description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" - color = "#731008" // rgb: 115, 16, 8 - -/datum/reagent/drink/tomatojuice/on_mob_life(mob/living/M) - if(M.getFireLoss() && prob(20)) - M.adjustFireLoss(-1) - ..() - -/datum/reagent/drink/limejuice - name = "Lime Juice" - id = "limejuice" - description = "The sweet-sour juice of limes." - color = "#365E30" // rgb: 54, 94, 48 - -/datum/reagent/drink/limejuice/on_mob_life(mob/living/M) - if(M.getToxLoss() && prob(20)) - M.adjustToxLoss(-1) - ..() - -/datum/reagent/drink/carrotjuice - name = "Carrot juice" - id = "carrotjuice" - description = "It is just like a carrot but without crunching." - color = "#973800" // rgb: 151, 56, 0 - -/datum/reagent/drink/carrotjuicde/on_mob_life(mob/living/M) - M.eye_blurry = max(M.eye_blurry-1 , 0) - M.eye_blind = max(M.eye_blind-1 , 0) - switch(current_cycle) - if(1 to 20) - //nothing - if(21 to INFINITY) - if(prob(current_cycle-10)) - M.disabilities &= ~NEARSIGHTED - ..() - -/datum/reagent/drink/doctor_delight - name = "The Doctor's Delight" - id = "doctorsdelight" - description = "A gulp a day keeps the MediBot away. That's probably for the best." - reagent_state = LIQUID - color = "#FF8CFF" // rgb: 255, 140, 255 - -/datum/reagent/drink/doctors_delight/on_mob_life(mob/living/M) - if(M.getToxLoss() && prob(20)) - M.adjustToxLoss(-1) - ..() - -/datum/reagent/drink/berryjuice - name = "Berry Juice" - id = "berryjuice" - description = "A delicious blend of several different kinds of berries." - color = "#863333" // rgb: 134, 51, 51 - -/datum/reagent/drink/poisonberryjuice - name = "Poison Berry Juice" - id = "poisonberryjuice" - description = "A tasty juice blended from various kinds of very deadly and toxic berries." - color = "#863353" // rgb: 134, 51, 83 - -/datum/reagent/drink/poisonberryjuice/on_mob_life(mob/living/M) - M.adjustToxLoss(1) - ..() - -/datum/reagent/drink/watermelonjuice - name = "Watermelon Juice" - id = "watermelonjuice" - description = "Delicious juice made from watermelon." - color = "#863333" // rgb: 134, 51, 51 - -/datum/reagent/drink/lemonjuice - name = "Lemon Juice" - id = "lemonjuice" - description = "This juice is VERY sour." - color = "#863333" // rgb: 175, 175, 0 - -/datum/reagent/drink/grapejuice - name = "Grape Juice" - id = "grapejuice" - description = "This juice is known to stain shirts." - color = "#993399" // rgb: 153, 51, 153 - -/datum/reagent/drink/banana - name = "Banana Juice" - id = "banana" - description = "The raw essence of a banana." - color = "#863333" // rgb: 175, 175, 0 - -/datum/reagent/drink/banana/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - ..() - -/datum/reagent/drink/nothing - name = "Nothing" - id = "nothing" - description = "Absolutely nothing." - -/datum/reagent/drink/nothing/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if(ishuman(M) && M.job in list("Mime")) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - ..() - -/datum/reagent/drink/potato_juice - name = "Potato Juice" - id = "potato" - description = "Juice of the potato. Bleh." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/drink/milk - name = "Milk" - id = "milk" - description = "An opaque white liquid produced by the mammary glands of mammals." - color = "#DFDFDF" // rgb: 223, 223, 223 - -/datum/reagent/drink/milk/on_mob_life(mob/living/M) - if(M.getBruteLoss() && prob(20)) - M.adjustBruteLoss(-1) - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 2) - ..() - -/datum/reagent/drink/milk/soymilk - name = "Soy Milk" - id = "soymilk" - description = "An opaque white liquid made from soybeans." - color = "#DFDFC7" // rgb: 223, 223, 199 - -/datum/reagent/drink/milk/cream - name = "Cream" - id = "cream" - description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" - color = "#DFD7AF" // rgb: 223, 215, 175 - -/datum/reagent/drink/milk/chocolate_milk - name = "Chocolate milk" - id ="chocolate_milk" - description = "Chocolate-flavored milk, tastes like being a kid again." - color = "#85432C" - -/datum/reagent/drink/hot_coco - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And coco beans." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - adj_temp_hot = 5 - -/datum/reagent/drink/coffee - name = "Coffee" - id = "coffee" - description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." - color = "#482000" // rgb: 72, 32, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 - adj_temp_hot = 25 - overdose_threshold = 45 - addiction_chance = 1 // It's true. - heart_rate_increase = 1 - -/datum/reagent/drink/coffee/on_mob_life(mob/living/M) - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) - if(prob(50)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - ..() - -/datum/reagent/drink/coffee/overdose_process(mob/living/M, severity) - if(volume > 45) - M.Jitter(5) - -/datum/reagent/drink/coffee/icecoffee - name = "Iced Coffee" - id = "icecoffee" - description = "Coffee and ice, refreshing and cool." - color = "#102838" // rgb: 16, 40, 56 - adj_temp_hot = 0 - adj_temp_cool = 5 - -/datum/reagent/drink/coffee/soy_latte - name = "Soy Latte" - id = "soy_latte" - description = "A nice and tasty beverage while you are reading your hippie books." - color = "#664300" // rgb: 102, 67, 0 - adj_sleepy = 0 - adj_temp_hot = 5 - -/datum/reagent/drink/coffee/soy_latte/on_mob_life(mob/living/M) - ..() - M.SetSleeping(0) - if(M.getBruteLoss() && prob(20)) - M.adjustBruteLoss(-1) - -/datum/reagent/drink/coffee/cafe_latte - name = "Cafe Latte" - id = "cafe_latte" - description = "A nice, strong and tasty beverage while you are reading." - color = "#664300" // rgb: 102, 67, 0 - adj_sleepy = 0 - adj_temp_hot = 5 - -/datum/reagent/drink/coffee/cafe_latte/on_mob_life(mob/living/M) - ..() - M.SetSleeping(0) - if(M.getBruteLoss() && prob(20)) - M.adjustBruteLoss(-1) - -/datum/reagent/drink/coffee/cafe_latte/cafe_mocha - name = "Cafe Mocha" - id = "cafe_mocha" - description = "The perfect blend of coffe, milk, and chocolate." - color = "#673629" - -/datum/reagent/drink/tea - name = "Tea" - id = "tea" - description = "Tasty black tea: It has antioxidants. It's good for you!" - color = "#101000" // rgb: 16, 16, 0 - adj_dizzy = -2 - adj_drowsy = -1 - adj_sleepy = -3 - adj_temp_hot = 20 - -/datum/reagent/drink/tea/on_mob_life(mob/living/M) - if(M.getToxLoss() && prob(20)) - M.adjustToxLoss(-1) - ..() - -/datum/reagent/drink/tea/icetea - name = "Iced Tea" - id = "icetea" - description = "No relation to a certain rap artist/ actor." - color = "#104038" // rgb: 16, 64, 56 - adj_temp_hot = 0 - adj_temp_cool = 5 - -/datum/reagent/drink/bananahonk - name = "Banana Mama" - id = "bananahonk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - -/datum/reagent/drink/bananahonk/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - ..() - -/datum/reagent/drink/silencer - name = "Silencer" - id = "silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - -/datum/reagent/drink/silencer/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if(ishuman(M) && M.job in list("Mime")) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm deleted file mode 100644 index fe54ed97246..00000000000 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm +++ /dev/null @@ -1,124 +0,0 @@ -/datum/reagent/drink/cold - name = "Cold drink" - adj_temp_cool = 5 - -/datum/reagent/drink/cold/tonic - name = "Tonic Water" - id = "tonic" - description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." - color = "#664300" // rgb: 102, 67, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 - -/datum/reagent/drink/cold/sodawater - name = "Soda Water" - id = "sodawater" - description = "A can of club soda. Why not make a scotch and soda?" - color = "#619494" // rgb: 97, 148, 148 - adj_dizzy = -5 - adj_drowsy = -3 - -/datum/reagent/drink/cold/ice - name = "Ice" - id = "ice" - description = "Frozen water, your dentist wouldn't like you chewing this." - reagent_state = SOLID - color = "#619494" // rgb: 97, 148, 148 - adj_temp_cool = 0 - -/datum/reagent/drink/cold/ice/on_mob_life(mob/living/M) - M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) - ..() - -/datum/reagent/drink/cold/space_cola - name = "Cola" - id = "cola" - description = "A refreshing beverage." - reagent_state = LIQUID - color = "#100800" // rgb: 16, 8, 0 - adj_drowsy = -5 - -/datum/reagent/drink/cold/nuka_cola - name = "Nuka Cola" - id = "nuka_cola" - description = "Cola, cola never changes." - color = "#100800" // rgb: 16, 8, 0 - adj_sleepy = -2 - -/datum/reagent/drink/cold/nuka_cola/on_mob_life(mob/living/M) - M.Jitter(20) - M.druggy = max(M.druggy, 30) - M.dizziness +=5 - M.drowsyness = 0 - M.status_flags |= GOTTAGOFAST - ..() - -/datum/reagent/drink/cold/nuka_cola/reagent_deleted(mob/living/M) - M.status_flags &= ~GOTTAGOFAST - ..() - -/datum/reagent/drink/cold/spacemountainwind - name = "Space Mountain Wind" - id = "spacemountainwind" - description = "Blows right through you like a space wind." - color = "#102000" // rgb: 16, 32, 0 - adj_drowsy = -7 - adj_sleepy = -1 - -/datum/reagent/drink/cold/dr_gibb - name = "Dr. Gibb" - id = "dr_gibb" - description = "A delicious blend of 42 different flavours" - color = "#102000" // rgb: 16, 32, 0 - adj_drowsy = -6 - -/datum/reagent/drink/cold/space_up - name = "Space-Up" - id = "space_up" - description = "Tastes like a hull breach in your mouth." - color = "#202800" // rgb: 32, 40, 0 - adj_temp_cool = 8 - -/datum/reagent/drink/cold/lemon_lime - name = "Lemon Lime" - description = "A tangy substance made of 0.5% natural citrus!" - id = "lemon_lime" - color = "#878F00" // rgb: 135, 40, 0 - adj_temp_cool = 8 - -/datum/reagent/drink/cold/lemonade - name = "Lemonade" - description = "Oh the nostalgia..." - id = "lemonade" - color = "#FFFF00" // rgb: 255, 255, 0 - -/datum/reagent/drink/cold/kiraspecial - name = "Kira Special" - description = "Long live the guy who everyone had mistaken for a girl. Baka!" - id = "kiraspecial" - color = "#CCCC99" // rgb: 204, 204, 153 - -/datum/reagent/drink/cold/brownstar - name = "Brown Star" - description = "It's not what it sounds like..." - id = "brownstar" - color = "#9F3400" // rgb: 159, 052, 000 - adj_temp_cool = 2 - -/datum/reagent/drink/cold/milkshake - name = "Milkshake" - description = "Glorious brainfreezing mixture." - id = "milkshake" - color = "#AEE5E4" // rgb" 174, 229, 228 - adj_temp_cool = 9 - -/datum/reagent/drink/cold/rewriter - name = "Rewriter" - description = "The secert of the sanctuary of the Libarian..." - id = "rewriter" - color = "#485000" // rgb:72, 080, 0 - -/datum/reagent/drink/cold/rewriter/on_mob_life(mob/living/M) - M.Jitter(5) - ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm deleted file mode 100644 index ccc617d2aaa..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm +++ /dev/null @@ -1,76 +0,0 @@ -/datum/reagent/adminordrazine //An OP chemical for admins - name = "Adminordrazine" - id = "adminordrazine" - description = "It's magic. We don't have to explain it." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds! - admin_only = 1 - -/datum/reagent/adminordrazine/on_mob_life(mob/living/carbon/M) - M.setCloneLoss(0) - M.setOxyLoss(0) - M.radiation = 0 - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - M.adjustToxLoss(-5) - M.hallucination = 0 - M.setBrainLoss(0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - for(var/name in H.internal_organs) - var/obj/item/organ/internal/I = H.get_int_organ(name) - I.damage = max(0, I.damage-5) - for(var/obj/item/organ/external/E in H.organs) - if(E.mend_fracture()) - E.perma_injury = 0 - M.disabilities = 0 - M.eye_blurry = 0 - M.eye_blind = 0 - M.SetWeakened(0) - M.SetStunned(0) - M.SetParalysis(0) - M.silent = 0 - M.dizziness = 0 - M.drowsyness = 0 - M.stuttering = 0 - M.slurring = 0 - M.confused = 0 - M.SetSleeping(0) - M.jitteriness = 0 - for(var/datum/disease/D in M.viruses) - if(D.severity == NONTHREAT) - continue - D.spread_text = "Remissive" - D.stage-- - if(D.stage < 1) - D.cure() - ..() - -/datum/reagent/adminordrazine/nanites - name = "Nanites" - id = "nanites" - description = "Nanomachines that aid in rapid cellular regeneration." - - -// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents - -/proc/adminReagentCheck(var/list/incoming) - var/list/outgoing[0] - for(var/tocheck in incoming) - if(ispath(tocheck)) - var/check = new tocheck - if(istype(check, /atom)) - var/atom/reagentCheck = check - var/datum/reagents/reagents = reagentCheck.reagents - var/admin = 0 - for(var/reag in reagents.reagent_list) - var/datum/reagent/reagent = reag - if(reagent.admin_only) - admin = 1 - break - if(!(admin)) - outgoing += tocheck - else - outgoing += tocheck - return outgoing \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm deleted file mode 100644 index 7cbc79b41b0..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm +++ /dev/null @@ -1,115 +0,0 @@ -/datum/reagent/serotrotium - name = "Serotrotium" - id = "serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - reagent_state = LIQUID - color = "#202040" // rgb: 20, 20, 40 - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -/datum/reagent/serotrotium/on_mob_life(mob/living/M) - if(ishuman(M)) - if(prob(7)) - M.emote(pick("twitch","drool","moan","gasp")) - ..() - - -/datum/reagent/lithium - name = "Lithium" - id = "lithium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - -/datum/reagent/lithium/on_mob_life(mob/living/M) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove && !M.restrained()) - step(M, pick(cardinal)) - if(prob(5)) M.emote(pick("twitch","drool","moan")) - ..() - - -/datum/reagent/hippies_delight - name = "Hippie's Delight" - id = "hippiesdelight" - description = "You just don't get it maaaan." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - metabolization_rate = 0.2 * REAGENTS_METABOLISM - -/datum/reagent/hippies_delight/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 50) - switch(current_cycle) - if(1 to 5) - if(!M.stuttering) M.stuttering = 1 - M.Dizzy(10) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(20) - M.Dizzy(20) - M.druggy = max(M.druggy, 45) - if(prob(20)) M.emote(pick("twitch","giggle")) - if(10 to INFINITY) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(40) - M.Dizzy(40) - M.druggy = max(M.druggy, 60) - if(prob(30)) M.emote(pick("twitch","giggle")) - ..() - -/datum/reagent/lsd - name = "Lysergic acid diethylamide" - id = "lsd" - description = "A highly potent hallucinogenic substance. Far out, maaaan." - reagent_state = LIQUID - color = "#0000D8" - -/datum/reagent/lsd/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 15) - M.hallucination += 10 - ..() - -/datum/reagent/space_drugs - name = "Space drugs" - id = "space_drugs" - description = "An illegal chemical compound used as drug." - reagent_state = LIQUID - color = "#9087A2" - metabolization_rate = 0.2 - addiction_chance = 65 - heart_rate_decrease = 1 - -/datum/reagent/space_drugs/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 15) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove && !M.restrained()) - step(M, pick(cardinal)) - if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) - ..() - -/datum/reagent/psilocybin - name = "Psilocybin" - id = "psilocybin" - description = "A strong psycotropic derived from certain species of mushroom." - color = "#E700E7" // rgb: 231, 0, 231 - -/datum/reagent/psilocybin/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 30) - switch(current_cycle) - if(1 to 5) - if(!M.stuttering) M.stuttering = 1 - M.Dizzy(5) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(10) - M.Dizzy(10) - M.druggy = max(M.druggy, 35) - if(prob(20)) M.emote(pick("twitch","giggle")) - if(10 to INFINITY) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(20) - M.Dizzy(20) - M.druggy = max(M.druggy, 40) - if(prob(30)) M.emote(pick("twitch","giggle")) - ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm deleted file mode 100644 index 52d33e21e07..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/reagent/fuel - name = "Welding fuel" - id = "fuel" - description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil." - reagent_state = LIQUID - color = "#060606" - -/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite! - if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - ..() - -/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke - name = "Unholy Water" - id = "unholywater" - description = "Something that shouldn't exist on this plane of existance." - process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it. - metabolization_rate = 1 - -/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M) - M.adjustBrainLoss(3) - if(iscultist(M)) - M.status_flags |= GOTTAGOFAST - M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustParalysis(-2) - M.AdjustStunned(-2) - M.AdjustWeakened(-2) - else - M.adjustToxLoss(2) - M.adjustFireLoss(2) - M.adjustOxyLoss(2) - M.adjustBruteLoss(2) - ..() - -/datum/reagent/fuel/unholywater/reagent_deleted(mob/living/M) - M.status_flags &= ~GOTTAGOFAST - ..() - -/datum/reagent/plasma - name = "Plasma" - id = "plasma" - description = "The liquid phase of an unusual extraterrestrial compound." - reagent_state = LIQUID - color = "#7A2B94" - -/datum/reagent/plasma/on_mob_life(mob/living/M) - M.adjustToxLoss(1*REM) - if(holder.has_reagent("epinephrine")) - holder.remove_reagent("epinephrine", 2) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.adjustPlasma(10) - ..() - -/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel! - if(method == TOUCH) - M.adjust_fire_stacks(volume / 5) - ..() - - -/datum/reagent/thermite - name = "Thermite" - id = "thermite" - description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." - reagent_state = SOLID - color = "#673910" // rgb: 103, 57, 16 - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume) - if(volume >= 5 && istype(W)) - W.thermite = 1 - W.overlays.Cut() - W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") - -/datum/reagent/glycerol - name = "Glycerol" - id = "glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." - reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm deleted file mode 100644 index 1dbe1f05a20..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ /dev/null @@ -1,394 +0,0 @@ -/////////////////////////Food Reagents//////////////////////////// -// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food -// condiments, additives, and such go. -/datum/reagent/nutriment // Pure nutriment, universally digestable and thus slightly less effective - name = "Nutriment" - id = "nutriment" - description = "A questionable mixture of various pure nutrients commonly found in processed foods." - reagent_state = SOLID - nutriment_factor = 12 * REAGENTS_METABOLISM - color = "#664330" // rgb: 102, 67, 48 - var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN - -/datum/reagent/nutriment/on_mob_life(mob/living/M) - if(!(M.mind in ticker.mode.vampires)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients - H.nutrition += nutriment_factor // For hunger and fatness - if(prob(50)) - M.adjustBruteLoss(-1) - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.4) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.4) - ..() - -/datum/reagent/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores - name = "Protein" - id = "protein" - description = "Various essential proteins and fats commonly found in animal flesh and blood." - nutriment_factor = 15 * REAGENTS_METABOLISM - diet_flags = DIET_CARN | DIET_OMNI - -/datum/reagent/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores - name = "Plant-matter" - id = "plantmatter" - description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce." - nutriment_factor = 15 * REAGENTS_METABOLISM - diet_flags = DIET_HERB | DIET_OMNI - - -/datum/reagent/vitamin - name = "Vitamin" - id = "vitamin" - description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#664330" // rgb: 102, 67, 48 - -/datum/reagent/vitamin/on_mob_life(mob/living/M) //everyone needs vitamins, so this works on everyone, regardless of diet or if they're a vampire. - M.nutrition += nutriment_factor - if(prob(50)) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.5) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.5) - ..() - -/datum/reagent/soysauce - name = "Soysauce" - id = "soysauce" - description = "A salty sauce made from the soy plant." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#792300" // rgb: 121, 35, 0 - -/datum/reagent/ketchup - name = "Ketchup" - id = "ketchup" - description = "Ketchup, catsup, whatever. It's tomato paste." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#731008" // rgb: 115, 16, 8 - - -/datum/reagent/capsaicin - name = "Capsaicin Oil" - id = "capsaicin" - description = "This is what makes chilis hot." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - -/datum/reagent/capsaicin/on_mob_life(mob/living/M) - switch(current_cycle) - if(1 to 15) - M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) - if(isslime(M)) - M.bodytemperature += rand(5,20) - if(15 to 25) - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - M.bodytemperature += rand(10,20) - if(25 to 35) - M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - M.bodytemperature += rand(15,20) - if(35 to INFINITY) - M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - M.bodytemperature += rand(20,25) - ..() - -/datum/reagent/frostoil - name = "Frost Oil" - id = "frostoil" - description = "A special oil that noticably chills the body. Extraced from Icepeppers." - reagent_state = LIQUID - color = "#8BA6E9" // rgb: 139, 166, 233 - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/frostoil/on_mob_life(mob/living/M) - switch(current_cycle) - if(1 to 15) - M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) - if(isslime(M)) - M.bodytemperature -= rand(5,20) - if(15 to 25) - M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - M.bodytemperature -= rand(10,20) - if(25 to 35) - M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) - M.emote("shiver") - if(isslime(M)) - M.bodytemperature -= rand(15,20) - if(35 to INFINITY) - M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) - M.emote("shiver") - if(isslime(M)) - M.bodytemperature -= rand(20,25) - ..() - -/datum/reagent/frostoil/reaction_turf(turf/T, volume) - if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) - - -/datum/reagent/sodiumchloride - name = "Salt" - id = "sodiumchloride" - description = "Sodium chloride, common table salt." - reagent_state = SOLID - color = "#B1B0B0" - overdose_threshold = 100 - -/datum/reagent/sodiumchloride/overdose_process(mob/living/M, severity) - if(prob(70)) - M.adjustBrainLoss(1) - ..() - -/datum/reagent/blackpepper - name = "Black Pepper" - id = "blackpepper" - description = "A powder ground from peppercorns. *AAAACHOOO*" - reagent_state = SOLID - -/datum/reagent/cocoa - name = "Cocoa Powder" - id = "cocoa" - description = "A fatty, bitter paste made from cocoa beans." - reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/cocoa/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - -/datum/reagent/hot_coco - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And cocoa beans." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - -/datum/reagent/hot_coco/on_mob_life(mob/living/M) - if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) - M.nutrition += nutriment_factor - ..() - -/datum/reagent/sprinkles - name = "Sprinkles" - id = "sprinkles" - description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FF00FF" // rgb: 255, 0, 255 - -/datum/reagent/sprinkles/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - ..() - - -/datum/reagent/cornoil - name = "Corn Oil" - id = "cornoil" - description = "An oil derived from various types of corn." - reagent_state = LIQUID - nutriment_factor = 20 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/cornoil/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - -/datum/reagent/cornoil/reaction_turf(turf/simulated/T, volume) - if(!istype(T)) - return - if(volume >= 3) - T.MakeSlippery() - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles()) - lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) - lowertemp.react() - T.assume_air(lowertemp) - qdel(hotspot) - - -/datum/reagent/enzyme - name = "Denatured Enzyme" - id = "enzyme" - description = "Heated beyond usefulness, this enzyme is now worthless." - reagent_state = LIQUID - color = "#282314" // rgb: 54, 94, 48 - - -/datum/reagent/dry_ramen - name = "Dry Ramen" - id = "dry_ramen" - description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/dry_ramen/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - - -/datum/reagent/hot_ramen - name = "Hot Ramen" - id = "hot_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/hot_ramen/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) - ..() - - -/datum/reagent/hell_ramen - name = "Hell Ramen" - id = "hell_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - -/datum/reagent/hell_ramen/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - ..() - - -/datum/reagent/flour - name = "flour" - id = "flour" - description = "This is what you rub all over yourself to pretend to be a ghost." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 - -/datum/reagent/flour/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - -/datum/reagent/flour/reaction_turf(turf/T, volume) - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/flour(T) - - -/datum/reagent/rice - name = "Rice" - id = "rice" - description = "Enjoy the great taste of nothing." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 - -/datum/reagent/rice/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - - -/datum/reagent/cherryjelly - name = "Cherry Jelly" - id = "cherryjelly" - description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." - reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#801E28" // rgb: 128, 30, 40 - -/datum/reagent/cherryjelly/on_mob_life(mob/living/M) - M.nutrition += nutriment_factor - ..() - -/datum/reagent/toxin/coffeepowder - name = "Coffee Grounds" - id = "coffeepowder" - description = "Finely ground Coffee beans, used to make coffee." - reagent_state = SOLID - color = "#5B2E0D" // rgb: 91, 46, 13 - -/datum/reagent/toxin/teapowder - name = "Ground Tea Leaves" - id = "teapowder" - description = "Finely shredded Tea leaves, used for making tea." - reagent_state = SOLID - color = "#7F8400" // rgb: 127, 132, 0 - -//Reagents used for plant fertilizers. -/datum/reagent/toxin/fertilizer - name = "fertilizer" - id = "fertilizer" - description = "A chemical mix good for growing plants with." - reagent_state = LIQUID - color = "#664330" // rgb: 102, 67, 48 - -/datum/reagent/toxin/fertilizer/eznutrient - name = "EZ Nutrient" - id = "eznutrient" - -/datum/reagent/toxin/fertilizer/left4zed - name = "Left-4-Zed" - id = "left4zed" - -/datum/reagent/toxin/fertilizer/robustharvest - name = "Robust Harvest" - id = "robustharvest" - - -/datum/reagent/sugar - name = "Sugar" - id = "sugar" - description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 255, 255, 255 - overdose_threshold = 200 // Hyperglycaemic shock - -/datum/reagent/sugar/on_mob_life(mob/living/M) - M.drowsyness = max(0, M.drowsyness-5) - if(current_cycle >= 90) - M.jitteriness += 2 - if(prob(50)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - if(prob(4)) - M.reagents.add_reagent("epinephrine", 1.2) - ..() - -/datum/reagent/sugar/overdose_start(mob/living/M) - to_chat(M, "You pass out from hyperglycemic shock!") - M.emote("collapse") - ..() - -/datum/reagent/sugar/overdose_process(mob/living/M, severity) - M.Paralyse(3 * severity) - M.Weaken(4 * severity) - if(prob(8)) - M.adjustToxLoss(severity) - diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm deleted file mode 100644 index cc5592dd42e..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ /dev/null @@ -1,142 +0,0 @@ -/datum/reagent/hydrocodone - name = "Hydrocodone" - id = "hydrocodone" - description = "An extremely effective painkiller; may have long term abuse consequences." - reagent_state = LIQUID - color = "#C805DC" - metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units - shock_reduction = 200 - -/datum/reagent/hydrocodone/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.traumatic_shock < 100) - H.shock_stage = 0 - ..() - -/datum/reagent/sterilizine - name = "Sterilizine" - id = "sterilizine" - description = "Sterilizes wounds in preparation for surgery." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - - //makes you squeaky clean -/datum/reagent/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - M.germ_level -= min(volume*20, M.germ_level) - -/datum/reagent/sterilizine/reaction_obj(obj/O, volume) - O.germ_level -= min(volume*20, O.germ_level) - -/datum/reagent/sterilizine/reaction_turf(turf/T, volume) - T.germ_level -= min(volume*20, T.germ_level) - -/datum/reagent/synaptizine - name = "Synaptizine" - id = "synaptizine" - description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis." - reagent_state = LIQUID - color = "#FA46FA" - overdose_threshold = 40 - -/datum/reagent/synaptizine/on_mob_life(mob/living/M) - M.drowsyness = max(0, M.drowsyness-5) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.SetSleeping(0) - if(prob(50)) - M.adjustBrainLoss(-1.0) - ..() - -/datum/reagent/synaptizine/overdose_process(mob/living/M, severity) - var/effect = ..() - if(severity == 1) - if(effect <= 1) - M.visible_message("[M] suddenly and violently vomits!") - M.fakevomit(no_text = 1) - else if(effect <= 3) - M.emote(pick("groan","moan")) - if(effect <= 8) - M.adjustToxLoss(1) - else if(severity == 2) - if(effect <= 2) - M.visible_message("[M] suddenly and violently vomits!") - M.fakevomit(no_text = 1) - else if(effect <= 5) - M.visible_message("[M] staggers and drools, their eyes bloodshot!") - M.Dizzy(8) - M.Weaken(4) - if(effect <= 15) - M.adjustToxLoss(1) - -/datum/reagent/mitocholide - name = "Mitocholide" - id = "mitocholide" - description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - -/datum/reagent/mitocholide/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - //Mitocholide is hard enough to get, it's probably fair to make this all internal organs - for(var/name in H.internal_organs) - var/obj/item/organ/internal/I = H.get_int_organ(name) - if(I.damage > 0) - I.damage = max(I.damage-0.4, 0) - ..() - -/datum/reagent/mitocholide/reaction_obj(obj/O, volume) - if(istype(O, /obj/item/organ)) - var/obj/item/organ/Org = O - Org.rejuvenate() - -/datum/reagent/cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly." - reagent_state = LIQUID - color = "#0000C8" // rgb: 200, 165, 220 - heart_rate_decrease = 1 - -/datum/reagent/cryoxadone/on_mob_life(mob/living/M) - if(M.bodytemperature < 265) - M.adjustCloneLoss(-4) - M.adjustOxyLoss(-10) - M.adjustToxLoss(-3) - M.adjustBruteLoss(-12) - M.adjustFireLoss(-12) - M.status_flags &= ~DISFIGURED - ..() - -/datum/reagent/rezadone - name = "Rezadone" - id = "rezadone" - description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - overdose_threshold = 30 - -/datum/reagent/rezadone/on_mob_life(mob/living/M) - M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. - M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate. - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - M.status_flags &= ~DISFIGURED - ..() - -/datum/reagent/rezadone/overdose_process(mob/living/M, severity) - M.adjustToxLoss(1) - M.Dizzy(5) - M.Jitter(5) - -/datum/reagent/spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - description = "An all-purpose antibiotic agent extracted from space fungus." - reagent_state = LIQUID - color = "#0AB478" - metabolization_rate = 0.2 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm deleted file mode 100644 index ff729dcdf3f..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_misc.dm +++ /dev/null @@ -1,189 +0,0 @@ -/*/datum/reagent/silicate - name = "Silicate" - id = "silicate" - description = "A compound that can be used to reinforce glass." - reagent_state = LIQUID - color = "#C7FFFF" // rgb: 199, 255, 255 - -/datum/reagent/silicate/reaction_obj(obj/O, volume) - 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 */ - - -/datum/reagent/oxygen - name = "Oxygen" - id = "oxygen" - description = "A colorless, odorless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - -/datum/reagent/nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "A colorless, odorless, tasteless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - -/datum/reagent/hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - -/datum/reagent/potassium - name = "Potassium" - id = "potassium" - description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." - reagent_state = SOLID - color = "#A0A0A0" // rgb: 160, 160, 160 - - -/datum/reagent/sulfur - name = "Sulfur" - id = "sulfur" - description = "A chemical element." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - - -/datum/reagent/sodium - name = "Sodium" - id = "sodium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - - -/datum/reagent/phosphorus - name = "Phosphorus" - id = "phosphorus" - description = "A chemical element." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - - -/datum/reagent/carbon - name = "Carbon" - id = "carbon" - description = "A chemical element." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - -/datum/reagent/carbon/reaction_turf(turf/T, volume) - if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash. - new /obj/effect/decal/cleanable/dirt(T) - -/datum/reagent/gold - name = "Gold" - id = "gold" - description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." - reagent_state = SOLID - color = "#F7C430" // rgb: 247, 196, 48 - - -/datum/reagent/silver - name = "Silver" - id = "silver" - description = "A lustrous metallic element regarded as one of the precious metals." - reagent_state = SOLID - color = "#D0D0D0" // rgb: 208, 208, 208 - - -/datum/reagent/aluminum - name = "Aluminum" - id = "aluminum" - description = "A silvery white and ductile member of the boron group of chemical elements." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - - -/datum/reagent/silicon - name = "Silicon" - id = "silicon" - description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - - -/datum/reagent/copper - name = "Copper" - id = "copper" - description = "A highly ductile metal." - color = "#6E3B08" // rgb: 110, 59, 8 - - -/datum/reagent/iron - name = "Iron" - id = "iron" - description = "Pure iron is a metal." - reagent_state = SOLID - color = "#C8A5DC" // rgb: 200, 165, 220 - -/datum/reagent/iron/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.8) - ..() - - -//foam -/datum/reagent/fluorosurfactant - name = "Fluorosurfactant" - id = "fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." - reagent_state = LIQUID - color = "#9E6B38" // rgb: 158, 107, 56 - -// metal foaming agent -// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually -/datum/reagent/ammonia - name = "Ammonia" - id = "ammonia" - description = "A caustic substance commonly used in fertilizer or household cleaners." - reagent_state = GAS - color = "#404030" // rgb: 64, 64, 48 - -/datum/reagent/diethylamine - name = "Diethylamine" - id = "diethylamine" - description = "A secondary amine, useful as a plant nutrient and as building block for other compounds." - reagent_state = LIQUID - color = "#322D00" - - -// Ported from Bay as part of the Botany Update -// Allows you to make planks from any plant that has this reagent in it. -// Also vines with this reagent are considered dense. -/datum/reagent/woodpulp - name = "Wood Pulp" - id = "woodpulp" - description = "A mass of wood fibers." - reagent_state = LIQUID - color = "#B97A57" \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm deleted file mode 100644 index bbdf92b8693..00000000000 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ /dev/null @@ -1,414 +0,0 @@ -/datum/reagent/toxin - name = "Toxin" - id = "toxin" - description = "A Toxic chemical." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - -/datum/reagent/toxin/on_mob_life(mob/living/M) - M.adjustToxLoss(2) - ..() - -/datum/reagent/spider_venom - name = "Spider venom" - id = "spidertoxin" - description = "A toxic venom injected by spacefaring arachnids." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - -/datum/reagent/spider_venom/on_mob_life(mob/living/M) - M.adjustToxLoss(1.5) - ..() - -/datum/reagent/plasticide - name = "Plasticide" - id = "plasticide" - description = "Liquid plastic, do not eat." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - -/datum/reagent/plasticide/on_mob_life(mob/living/M) - M.adjustToxLoss(1.5) - ..() - - -/datum/reagent/minttoxin - name = "Mint Toxin" - id = "minttoxin" - description = "Useful for dealing with undesirable customers." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - -/datum/reagent/minttoxin/on_mob_life(mob/living/M) - if(FAT in M.mutations) - M.gib() - ..() - -/datum/reagent/slimejelly - name = "Slime Jelly" - id = "slimejelly" - description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." - reagent_state = LIQUID - color = "#801E28" // rgb: 128, 30, 40 - -/datum/reagent/slimejelly/on_mob_life(mob/living/M) - if(prob(10)) - to_chat(M, "Your insides are burning!") - M.adjustToxLoss(rand(20,60)*REM) - else if(prob(40)) - M.adjustBruteLoss(-5*REM) - ..() - -/datum/reagent/slimetoxin - name = "Mutation Toxin" - id = "mutationtoxin" - description = "A corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - -/datum/reagent/slimetoxin/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/human = M - if(human.species.name != "Shadow") - to_chat(M, "Your flesh rapidly mutates!") - to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") - ..() - -/datum/reagent/aslimetoxin - name = "Advanced Mutation Toxin" - id = "amutationtoxin" - description = "An advanced corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - -/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method != TOUCH) - M.ForceContractDisease(new /datum/disease/transformation/slime(0)) - - -/datum/reagent/mercury - name = "Mercury" - id = "mercury" - description = "A chemical element." - reagent_state = LIQUID - color = "#484848" // rgb: 72, 72, 72 - metabolization_rate = 0.2 - penetrates_skin = 1 - -/datum/reagent/mercury/on_mob_life(mob/living/M) - if(prob(70)) - M.adjustBrainLoss(1) - ..() - -/datum/reagent/chlorine - name = "Chlorine" - id = "chlorine" - description = "A chemical element." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - penetrates_skin = 1 - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/chlorine/on_mob_life(mob/living/M) - M.adjustFireLoss(1) - ..() - -/datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "A highly-reactive chemical element." - reagent_state = GAS - color = "#6A6054" - penetrates_skin = 1 - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/fluorine/on_mob_life(mob/living/M) - M.adjustFireLoss(1) - M.adjustToxLoss(1*REM) - ..() - -/datum/reagent/radium - name = "Radium" - id = "radium" - description = "Radium is an alkaline earth metal. It is extremely radioactive." - reagent_state = SOLID - color = "#C7C7C7" // rgb: 199,199,199 - metabolization_rate = 0.4 - penetrates_skin = 1 - -/datum/reagent/radium/on_mob_life(mob/living/M) - if(M.radiation < 80) - M.apply_effect(4, IRRADIATE, negate_armor = 1) - ..() - -/datum/reagent/radium/reaction_turf(turf/T, volume) - if(volume >= 3 && !istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) - -/datum/reagent/mutagen - name = "Unstable mutagen" - id = "mutagen" - description = "Might cause unpredictable mutations. Keep away from children." - reagent_state = LIQUID - color = "#04DF27" - metabolization_rate = 0.3 - -/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!..()) - return - if(!M.dna) - return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - if((method==TOUCH && prob(33)) || method==INGEST) - randmutb(M) - domutcheck(M, null) - M.UpdateAppearance() - -/datum/reagent/mutagen/on_mob_life(mob/living/M) - if(!M.dna) - return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - M.apply_effect(2*REM, IRRADIATE, negate_armor = 1) - if(prob(4)) - randmutb(M) - ..() - - -/datum/reagent/uranium - name ="Uranium" - id = "uranium" - description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." - reagent_state = SOLID - color = "#B8B8C0" // rgb: 184, 184, 192 - -/datum/reagent/uranium/on_mob_life(mob/living/M) - M.apply_effect(2, IRRADIATE, negate_armor = 1) - ..() - -/datum/reagent/uranium/reaction_turf(turf/T, volume) - if(volume >= 3 && !istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) - - -/datum/reagent/lexorin - name = "Lexorin" - id = "lexorin" - description = "Lexorin temporarily stops respiration. Causes tissue damage." - reagent_state = LIQUID - color = "#52685D" - metabolization_rate = 0.2 - -/datum/reagent/lexorin/on_mob_life(mob/living/M) - M.adjustToxLoss(1) - ..() - - -/datum/reagent/sacid - name = "Sulphuric acid" - id = "sacid" - description = "A strong mineral acid with the molecular formula H2SO4." - reagent_state = LIQUID - color = "#00D72B" - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/sacid/on_mob_life(mob/living/M) - M.adjustFireLoss(1) - ..() - -/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(volume > 25) - - if(H.wear_mask) - to_chat(H, "Your mask protects you from the acid!") - return - - if(H.head) - to_chat(H, "Your helmet protects you from the acid!") - return - - if(!M.unacidable) - if(prob(75)) - var/obj/item/organ/external/affecting = H.get_organ("head") - if(affecting) - affecting.take_damage(5, 10) - H.UpdateDamageIcon() - H.emote("scream") - else - M.take_organ_damage(5,10) - else - M.take_organ_damage(5,10) - - if(method == INGEST) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(volume < 10) - to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!") - - if(volume >=10 && volume <=25) - if(!H.unacidable) - M.take_organ_damage(0,min(max(volume-10,2)*2,20)) - M.emote("scream") - - - if(volume > 25) - if(!M.unacidable) - if(prob(75)) - var/obj/item/organ/external/affecting = H.get_organ("head") - if(affecting) - affecting.take_damage(0, 20) - H.UpdateDamageIcon() - H.emote("scream") - else - M.take_organ_damage(0,20) - -/datum/reagent/sacid/reaction_obj(obj/O, volume) - if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40)) - if(!O.unacidable) - var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) - I.desc = "Looks like this was \an [O] some time ago." - O.visible_message("[O] melts.") - qdel(O) - - -/datum/reagent/hellwater - name = "Hell Water" - id = "hell_water" - description = "YOUR FLESH! IT BURNS!" - process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL. - metabolization_rate = 1 - -/datum/reagent/hellwater/on_mob_life(mob/living/M) - M.fire_stacks = min(5, M.fire_stacks + 3) - M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire - M.adjustToxLoss(1) - M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard? - M.adjustBrainLoss(5) - ..() - - -/datum/reagent/carpotoxin - name = "Carpotoxin" - id = "carpotoxin" - description = "A deadly neurotoxin produced by the dreaded spess carp." - reagent_state = LIQUID - color = "#003333" // rgb: 0, 51, 51 - -/datum/reagent/carpotoxin/on_mob_life(mob/living/M) - M.adjustToxLoss(2*REM) - ..() - -/datum/reagent/staminatoxin - name = "Tirizene" - id = "tirizene" - description = "A toxin that affects the stamina of a person when injected into the bloodstream." - reagent_state = LIQUID - color = "#6E2828" - data = 13 - -/datum/reagent/staminatoxin/on_mob_life(mob/living/M) - M.adjustStaminaLoss(REM * data) - data = max(data - 1, 3) - ..() - - -/datum/reagent/spore - name = "Spore Toxin" - id = "spore" - description = "A natural toxin produced by blob spores that inhibits vision when ingested." - color = "#9ACD32" - -/datum/reagent/spores/on_mob_life(mob/living/M) - M.adjustToxLoss(1) - M.damageoverlaytemp = 60 - M.eye_blurry = max(M.eye_blurry, 3) - ..() - -/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots - name = "Beer" - id = "beer2" - description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - color = "#664300" // rgb: 102, 67, 0 - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -/datum/reagent/beer2/on_mob_life(mob/living/M) - switch(current_cycle) - if(1 to 50) - M.AdjustSleeping(1) - if(51 to INFINITY) - M.AdjustSleeping(1) - M.adjustToxLoss((current_cycle - 50)*REM) - ..() - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/reagent/condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - description = "This shit goes in pepperspray." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - -/datum/reagent/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/victim = M - var/mouth_covered = 0 - var/eyes_covered = 0 - var/obj/item/safe_thing = null - if( victim.wear_mask ) - if( victim.wear_mask.flags & MASKCOVERSEYES ) - eyes_covered = 1 - safe_thing = victim.wear_mask - if( victim.wear_mask.flags & MASKCOVERSMOUTH ) - mouth_covered = 1 - safe_thing = victim.wear_mask - if( victim.head ) - if( victim.head.flags & MASKCOVERSEYES ) - eyes_covered = 1 - safe_thing = victim.head - if( victim.head.flags & MASKCOVERSMOUTH ) - mouth_covered = 1 - safe_thing = victim.head - if(victim.glasses) - eyes_covered = 1 - if( !safe_thing ) - safe_thing = victim.glasses - if( eyes_covered && mouth_covered ) - to_chat(victim, "Your [safe_thing] protects you from the pepperspray!") - return - else if( mouth_covered ) // Reduced effects if partially protected - to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!") - if(prob(5)) - victim.emote("scream") - victim.eye_blurry = max(M.eye_blurry, 3) - victim.eye_blind = max(M.eye_blind, 1) - victim.confused = max(M.confused, 3) - victim.damageoverlaytemp = 60 - victim.Weaken(3) - victim.drop_item() - return - else if( eyes_covered ) // Eye cover is better than mouth cover - to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!") - victim.eye_blurry = max(M.eye_blurry, 3) - victim.damageoverlaytemp = 30 - return - else // Oh dear :D - if(prob(5)) - victim.emote("scream") - to_chat(victim, "You're sprayed directly in the eyes with pepperspray!") - victim.eye_blurry = max(M.eye_blurry, 5) - victim.eye_blind = max(M.eye_blind, 2) - victim.confused = max(M.confused, 6) - victim.damageoverlaytemp = 75 - victim.Weaken(5) - victim.drop_item() - -/datum/reagent/condensedcapsaicin/on_mob_life(mob/living/M) - if(prob(5)) - M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") - ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index f8e6f626bb1..f46d4010e69 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -29,9 +29,7 @@ ..() if(!possible_transfer_amounts) verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT - var/datum/reagents/R = new/datum/reagents(volume) - reagents = R - R.my_atom = src + create_reagents(volume) processing_objects.Add(src) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 634e0875aaf..c69c7b4a0ef 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -118,4 +118,4 @@ empty = 0 if(empty) - to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") + to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index a22802a4a45..d46ba85c3c9 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -1,4 +1,3 @@ - //Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle @@ -331,4 +330,4 @@ name = "BVAK bottle" desc = "A small bottle containing Bio Virus Antidote Kit." icon_state = "wide_bottle" - list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) + list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 32836a15cc9..60c924e0515 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -1,4 +1,4 @@ - //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// /// (Mixing)Glass. //////////////////////////////////////////////////////////////////////////////// /obj/item/weapon/reagent_containers/glass @@ -331,7 +331,7 @@ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_HEAD flags = OPENCONTAINER - + /obj/item/weapon/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() if(slot == slot_head && reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 6533dbf52c2..490f46e0a52 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -110,4 +110,4 @@ amount_per_transfer_from_this = 50 possible_transfer_amounts = list(50) volume = 50 - list_reagents = list("stimulants" = 50) + list_reagents = list("stimulants" = 50) \ No newline at end of file diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/reagent_containers/patch.dm similarity index 100% rename from code/modules/reagents/newchem/patch.dm rename to code/modules/reagents/reagent_containers/patch.dm diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 1da5f07b2e5..a6fd792e795 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -80,12 +80,6 @@ icon_state = "pill8" list_reagents = list("haloperidol" = 15) -/obj/item/weapon/reagent_containers/food/pill/paroxetine - name = "Paroxetine pill" - desc = "Heavy anti-depressant." - icon_state = "pill8" - list_reagents = list("paroxetine" = 15) - /obj/item/weapon/reagent_containers/food/pill/happy name = "Happy pill" desc = "Happy happy joy joy!" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 3972f0a4a13..a706d443d90 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -216,4 +216,4 @@ if(istype(A, /obj/effect/blob)) // blob damage in blob code return - ..() + ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index f5225daeae1..4c2d2caa6b8 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -16,9 +16,7 @@ return /obj/structure/reagent_dispensers/New() - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src + create_reagents(1000) if(!possible_transfer_amounts) verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT ..() diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 6ff39d21b0d..1e56d9d6d57 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -23,12 +23,12 @@ id = "round_end_belt" -// Auto conveyour is always on unless unpowered +// Auto conveyor is always on unless unpowered /obj/machinery/conveyor/auto/New(loc, newdir) ..(loc, newdir) operating = 1 - setmove() + update_move_direction() /obj/machinery/conveyor/auto/update() if(stat & BROKEN) @@ -48,6 +48,10 @@ ..(loc) if(newdir) dir = newdir + update_move_direction() + + +/obj/machinery/conveyor/proc/update_move_direction() switch(dir) if(NORTH) forwards = NORTH @@ -77,14 +81,13 @@ var/temp = forwards forwards = backwards backwards = temp - -/obj/machinery/conveyor/proc/setmove() if(operating == 1) movedir = forwards else movedir = backwards update() + /obj/machinery/conveyor/proc/update() if(stat & BROKEN) icon_state = "conveyor-broken" @@ -113,12 +116,31 @@ step(A,movedir) CHECK_TICK + + // attack with item, place item on conveyor -/obj/machinery/conveyor/attackby(var/obj/item/I, mob/user, params) - if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts - user.drop_item() - if(I && I.loc) I.loc = src.loc - return +/obj/machinery/conveyor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + if(!(stat & BROKEN)) + var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + to_chat(usr,"You remove the conveyor belt.") + qdel(src) + + else if(istype(I, /obj/item/weapon/wrench)) + if(!(stat & BROKEN)) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + dir = turn(dir,-45) + update_move_direction() + to_chat(user, "You rotate [src].") + + else if(user.a_intent != "harm") + if(user.drop_item()) + I.forceMove(loc) + else + return ..() + // attack with hand, move pulled object onto conveyor /obj/machinery/conveyor/attack_hand(mob/user as mob) @@ -176,6 +198,7 @@ var/position = 0 // 0 off, -1 reverse, 1 forward var/last_pos = -1 // last direction setting var/operated = 1 // true if just operated + var/convdir = 0 // 0 is two way switch, 1 and -1 means one way var/id = "" // must match conveyor IDs to control them @@ -184,16 +207,19 @@ speed_process = 1 -/obj/machinery/conveyor_switch/New() - ..() +/obj/machinery/conveyor_switch/New(newloc, newid) + ..(newloc) + if(!id) + id = newid update() - spawn(5) // allow map load + spawn(5) conveyors = list() - for(var/obj/machinery/conveyor/C in world) + for(var/obj/machinery/conveyor/C in machines) if(C.id == id) conveyors += C + // update the icon depending on the position /obj/machinery/conveyor_switch/proc/update() @@ -215,23 +241,28 @@ for(var/obj/machinery/conveyor/C in conveyors) C.operating = position - C.setmove() + C.update_move_direction() CHECK_TICK +/obj/machinery/conveyor_switch/oneway + convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.) - Cargo uses a reverse belt. + // attack with hand, switch position /obj/machinery/conveyor_switch/attack_hand(mob/user) - if(!allowed(user)) + if(!allowed(user)) //this is in Para but not TG. I don't think there's any which are set anyway. to_chat(user, "Access denied.") return - - + add_fingerprint(user) if(position == 0) - if(last_pos < 0) - position = 1 - last_pos = 0 + if(convdir) //is it a oneway switch + position = convdir else - position = -1 - last_pos = 0 + if(last_pos < 0) + position = 1 + last_pos = 0 + else + position = -1 + last_pos = 0 else last_pos = position position = 0 @@ -246,22 +277,92 @@ S.update() CHECK_TICK -/obj/machinery/conveyor_switch/oneway - var/convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.) - desc = "A conveyor control switch. It appears to only go in one direction." -// attack with hand, switch position -/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user) - if(position == 0) - position = convdir - else - position = 0 +/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + to_chat(user,"You deattach the conveyor switch.") + qdel(src) - operated = 1 - update() + else if(istype(I, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 - // 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() + +/obj/machinery/conveyor_switch/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + ..() + if("toggle_logic" in href_list) + convdir = !convdir //reverses? + + +/obj/machinery/conveyor_switch/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + return {" + "} + + + +// +// CONVEYOR CONSTRUCTION STARTS HERE +// + +/obj/item/conveyor_construct + icon = 'icons/obj/recycling.dmi' + icon_state = "conveyor0" + name = "conveyor belt assembly" + desc = "A conveyor belt assembly." + w_class = 4 + var/id = "" //inherited by the belt + +/obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/conveyor_switch_construct)) + to_chat(user, "You link the switch to the conveyor belt assembly.") + var/obj/item/conveyor_switch_construct/C = I + id = C.id + +/obj/item/conveyor_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle)) + return + var/cdir = get_dir(A, user) + if(A == user.loc) + to_chat(user, "You cannot place a conveyor belt under yourself.") + return + var/obj/machinery/conveyor/C = new/obj/machinery/conveyor(A,cdir) + C.id = id + transfer_fingerprints_to(C) + qdel(src) + +/obj/item/conveyor_switch_construct + name = "conveyor switch assembly" + desc = "A conveyor control switch assembly." + icon = 'icons/obj/recycling.dmi' + icon_state = "switch-off" + w_class = 4 + var/id = "" //inherited by the switch + +/obj/item/conveyor_switch_construct/New() + ..() + id = rand() //this couldn't possibly go wrong + +/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle)) + return + var/found = 0 + for(var/obj/machinery/conveyor/C in view()) + if(C.id == src.id) + found = 1 + break + if(!found) + to_chat(usr, "\icon[src]The conveyor switch did not detect any linked conveyor belts in range.") + return + var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) + transfer_fingerprints_to(NC) + qdel(src) + +/obj/item/weapon/paper/conveyor + name = "paper- 'Nano-it-up U-build series, #9: Build your very own conveyor belt, in SPACE'" + info = "

Congratulations!

You are now the proud owner of the best conveyor set available for space mail order! We at Nano-it-up know you love to prepare your own structures without wasting time, so we have devised a special streamlined assembly procedure that puts all other mail-order products to shame!

Firstly, you need to link the conveyor switch assembly to each of the conveyor belt assemblies. After doing so, you simply need to install the belt assemblies onto the floor, et voila, belt built. Our special Nano-it-up smart switch will detected any linked assemblies as far as the eye can see!

Set single directional switches by using your multitool on the switch after you've installed the switch assembly.

This convenience, you can only have it when you Nano-it-up. Stay nano!

" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 85657dd2b5b..232d2a9b3c5 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -255,20 +255,20 @@ /obj/machinery/disposal/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] - var/pressure = 100 * air_contents.return_pressure() / (SEND_PRESSURE) + var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) var/pressure_round = round(pressure,1) data["isAI"] = isAI(user) data["flushing"] = flush data["mode"] = mode if(mode <= 0) - data["pumpstatus"] = "" + data["pumpstatus"] = "N/A" else if(mode == 1) - data["pumpstatus"] = "(pressurizing)" + data["pumpstatus"] = "Pressurizing" else if(mode == 2) - data["pumpstatus"] = "(ready)" + data["pumpstatus"] = "Ready" else - data["pumpstatus"] = "(idle)" + data["pumpstatus"] = "Idle" data["pressure"] = pressure_round ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 8337e0ffaf7..f34d9797124 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -713,3 +713,19 @@ materials = list(MAT_GLASS = 750, MAT_METAL = 250) build_path = /obj/item/weapon/circuitboard/vendor category = list("initial", "Electronics") + +/datum/design/conveyor_belt + name = "Conveyor belt" + id = "conveyor_belt" + build_type = AUTOLATHE + materials = list(MAT_METAL = 5000) + build_path = /obj/item/conveyor_construct + category = list("initial", "Construction") + +/datum/design/conveyor_switch + name = "Conveyor belt switch" + id = "conveyor_switch" + build_type = AUTOLATHE + materials = list(MAT_METAL = 450, MAT_GLASS = 190) + build_path = /obj/item/conveyor_switch_construct + category = list("initial", "Construction") \ No newline at end of file diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index c373513a5f1..702afa68f2f 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -953,7 +953,7 @@ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." id = "mech_plasma_cutter" build_type = MECHFAB - req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasma" = 2) + req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasmatech" = 2) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma materials = list(MAT_METAL=1500, MAT_GLASS=500, MAT_PLASMA=200) construction_time = 100 diff --git a/code/modules/research/designs/spacepod_designs.dm b/code/modules/research/designs/spacepod_designs.dm index 759af82404d..4638a1bb830 100644 --- a/code/modules/research/designs/spacepod_designs.dm +++ b/code/modules/research/designs/spacepod_designs.dm @@ -121,7 +121,7 @@ desc = "Allows for the construction of a spacepod mounted laser." id = "podgun_laser" build_type = PODFAB - req_tech = list("materials" = 3, "combat" = 3, "plasma" = 2) + req_tech = list("materials" = 3, "combat" = 3, "plasmatech" = 2) build_path = /obj/item/device/spacepod_equipment/weaponry/laser category = list("Pod_Weaponry") materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000) @@ -250,4 +250,4 @@ build_type = PODFAB materials = list(MAT_METAL=500) build_path = /obj/item/device/spacepod_key - category = list("Pod_Parts") \ No newline at end of file + category = list("Pod_Parts") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 1fec6186c60..421f0cf8e92 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -680,7 +680,7 @@ warn_admins(user, "Flash") /obj/item/weapon/relic/proc/petSpray(mob/user) - var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!" + var/message = "[src] begins to shake, and in the distance the sound of rampaging animals arises!" visible_message(message) to_chat(user, message) var/animals = rand(1,25) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index cc6d48dc269..84fc3573bae 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -31,6 +31,18 @@ won't update every console in existence) but it's more of a hassle to do. Also, */ +// Who likes #defines? +// I don't! +// but I gotta add 'em anyways because we have a bias against /const statements for some reason +#define TECH_UPDATE_DELAY 50 +#define DESIGN_UPDATE_DELAY 50 +#define PROTOLATHE_CONSTRUCT_DELAY 32 +#define SYNC_RESEARCH_DELAY 30 +#define DECONSTRUCT_DELAY 24 +#define SYNC_DEVICE_DELAY 20 +#define RESET_RESEARCH_DELAY 20 +#define IMPRINTER_DELAY 16 + /obj/machinery/computer/rdconsole name = "\improper R&D console" icon_screen = "rdcomp" @@ -50,6 +62,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/menu = 0 // Current menu. var/submenu = 0 var/wait_message = 0 + var/wait_message_timer = 0 var/id = 0 //ID of the computer (for server restrictions). var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console @@ -139,6 +152,17 @@ won't update every console in existence) but it's more of a hassle to do. Also, ..() SyncRDevices() +/obj/machinery/computer/rdconsole/Destroy() + if(wait_message_timer) + deltimer(wait_message_timer) + wait_message_timer = 0 + return ..() + +/* Instead of calling this every tick, it is only being called when needed +/obj/machinery/computer/rdconsole/process() + griefProtection() +*/ + /obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params) //Loading a disk into it. @@ -206,9 +230,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, selected_category = "Viewing Category [href_list["category"]]" else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk. - wait_message = "Updating Database...." - spawn(50) - wait_message = 0 + add_wait_message("Updating Database...", TECH_UPDATE_DELAY) + spawn(TECH_UPDATE_DELAY) + clear_wait_message() files.AddTech2Known(t_disk.stored) nanomanager.update_uis(src) griefProtection() //Update centcom too @@ -231,9 +255,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, submenu = 0 else if(href_list["updt_design"]) //Updates the research holder with design data from the design disk. - wait_message = "Updating Database...." - spawn(50) - wait_message = 0 + add_wait_message("Updating Database...", DESIGN_UPDATE_DELAY) + spawn(DESIGN_UPDATE_DELAY) + clear_wait_message() files.AddDesign2Known(d_disk.blueprint) nanomanager.update_uis(src) griefProtection() //Update centcom too @@ -252,7 +276,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["copy_design"]) //Copy design data from the research holder to the design disk. // This href ALSO makes me very nervous var/datum/design/D = files.known_designs[href_list["copy_design_ID"]] - if(D) + if(D) // eeeeeep design datums are global be careful! var/autolathe_friendly = 1 for(var/x in D.materials) @@ -299,16 +323,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel") if(choice == "Cancel" || !linked_destroy) return linked_destroy.busy = 1 - wait_message = "Processing and Updating Database..." + add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) nanomanager.update_uis(src) flick("d_analyzer_process", linked_destroy) - spawn(24) + spawn(DECONSTRUCT_DELAY) + clear_wait_message() if(linked_destroy) linked_destroy.busy = 0 if(!linked_destroy.hacked) if(!linked_destroy.loaded_item) to_chat(usr, "The destructive analyzer appears to be empty.") - wait_message = 0 menu = 0 submenu = 0 return @@ -318,19 +342,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(prob(linked_destroy.loaded_item.reliability)) //If deconstructed item is not reliable enough its just being wasted, else it is pocessed files.UpdateTech(T, temp_tech[T]) //Check if deconstructed item has research levels higher/same/one less than current ones files.UpdateDesigns(linked_destroy.loaded_item, temp_tech, src) //If if such reseach type found all the known designs are checked for having this research type in them - wait_message = 0 //If design have it it gains some reliability - menu = 0 + menu = 0 //If design have it it gains some reliability submenu = 0 else //Same design always gain quality - wait_message = 0 //Crit fail gives the same design a lot of reliability, like really a lot - menu = 2 + menu = 2 //Crit fail gives the same design a lot of reliability, like really a lot submenu = 0 if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. for(var/material in linked_destroy.loaded_item.materials) linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) linked_destroy.loaded_item = null else - wait_message = 0 menu = 0 submenu = 0 for(var/obj/I in linked_destroy.contents) @@ -352,26 +373,26 @@ won't update every console in existence) but it's more of a hassle to do. Also, nanomanager.update_uis(src) else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. - wait_message = "Updating Database...." if(!sync) to_chat(usr, "You must connect to the network first!") else + add_wait_message("Updating Database...", SYNC_RESEARCH_DELAY) griefProtection() //Putting this here because I dont trust the sync process - spawn(30) + spawn(SYNC_RESEARCH_DELAY) + clear_wait_message() if(src) for(var/obj/machinery/r_n_d/server/S in world) var/server_processed = 0 if(S.disabled) continue - if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) + if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) files.push_data(S.files) server_processed = 1 - if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) + if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) S.files.push_data(files) server_processed = 1 if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) S.produce_heat(100) - wait_message = 0 nanomanager.update_uis(src) else if(href_list["togglesync"]) //Prevents the console from being synced by other consoles. Can still send data. @@ -393,7 +414,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/M in being_built.materials) power += round(being_built.materials[M] * amount / 5) power = max(2000, power) - wait_message = "Constructing Prototype. Please Wait..." if(linked_lathe.busy) g2g = 0 var/key = usr.key //so we don't lose the info during the spawn delay @@ -404,7 +424,11 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(g2g) //If input is incorrect, nothing happens + var/time_to_construct = PROTOLATHE_CONSTRUCT_DELAY * amount / coeff var/enough_materials = 1 + + time_to_construct /= being_built.lathe_time_factor + add_wait_message("Constructing Prototype. Please Wait...", time_to_construct) linked_lathe.busy = 1 flick("protolathe_n",linked_lathe) use_power(power) @@ -432,9 +456,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/O = being_built.locked - coeff *= being_built.lathe_time_factor - - spawn(32*amount/coeff) + spawn(time_to_construct) if(g2g) //And if we only fail the material requirements, we still spend time and power for(var/i = 0, i 2) - dat += "" - line_length = 1 - - dat += "[C]" - line_length++ - - dat += "" - return dat /obj/machinery/computer/rdconsole/core name = "core R&D console" @@ -891,3 +915,12 @@ won't update every console in existence) but it's more of a hassle to do. Also, id = 5 req_access = list() circuit = /obj/item/weapon/circuitboard/rdconsole/public + +#undef TECH_UPDATE_DELAY +#undef DESIGN_UPDATE_DELAY +#undef PROTOLATHE_CONSTRUCT_DELAY +#undef SYNC_RESEARCH_DELAY +#undef DECONSTRUCT_DELAY +#undef SYNC_DEVICE_DELAY +#undef RESET_RESEARCH_DELAY +#undef IMPRINTER_DELAY diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm index 373b5d9454f..0e83e5812c3 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm @@ -37,7 +37,7 @@ to_chat(H, "[pick(messages)]") if(prob(50)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) /datum/artifact_effect/badfeeling/DoEffectAura() if(holder) @@ -50,7 +50,7 @@ to_chat(H, "[pick(drastic_messages)]") if(prob(10)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) return 1 /datum/artifact_effect/badfeeling/DoEffectPulse() @@ -64,7 +64,7 @@ to_chat(H, "[pick(messages)]") if(prob(50)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) else if(prob(25)) - H.dizziness += rand(5,15) + H.AdjustDizzy(rand(5,15)) return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm index 08639dec98f..dd42c44204c 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm @@ -35,7 +35,7 @@ to_chat(H, "[pick(messages)]") if(prob(50)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) /datum/artifact_effect/goodfeeling/DoEffectAura() if(holder) @@ -48,7 +48,7 @@ to_chat(H, "[pick(drastic_messages)]") if(prob(5)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) return 1 /datum/artifact_effect/goodfeeling/DoEffectPulse() @@ -62,7 +62,7 @@ to_chat(H, "[pick(messages)]") if(prob(50)) - H.dizziness += rand(3,5) + H.AdjustDizzy(rand(3,5)) else if(prob(25)) - H.dizziness += rand(5,15) + H.AdjustDizzy(rand(5,15)) return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm index bbb16d76a3d..1f098ddfa6b 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm @@ -13,8 +13,8 @@ if(ishuman(toucher) && prob(weakness * 100)) var/mob/living/carbon/human/H = toucher to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness) - H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness) + H.AdjustDrowsy(rand(5,25) * weakness, bound_lower = 0, bound_upper = 50 * weakness) + H.AdjustEyeBlurry(rand(1,3) * weakness, bound_lower = 0, bound_upper = 50 * weakness) return 1 else if(isrobot(toucher)) to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.") @@ -28,8 +28,8 @@ if(prob(weakness * 100)) if(prob(10)) to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness) - H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness) + H.AdjustDrowsy(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness) + H.AdjustEyeBlurry(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness) for(var/mob/living/silicon/robot/R in range(src.effectrange,holder)) to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") return 1 @@ -41,8 +41,8 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness) - H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness) + H.AdjustDrowsy(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness) + H.AdjustEyeBlurry(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness) for(var/mob/living/silicon/robot/R in range(src.effectrange,holder)) to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") return 1 diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index ce6fb4c2663..8ddcf27593b 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -194,7 +194,7 @@ 'sound/hallucinations/turn_around1.ogg',\ 'sound/hallucinations/turn_around2.ogg',\ ), 50, 1, -3) - M.sleeping = max(M.sleeping,rand(5,10)) + M.Sleeping(rand(5,10)) src.loc = null else processing_objects.Remove(src) diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 188bf7597c2..8ff0ed6eb64 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -3,6 +3,7 @@ desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." icon = 'icons/obj/monitors.dmi' icon_state = "auth_off" + var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made. var/event = "" var/screen = 1 @@ -14,25 +15,25 @@ var/mob/event_triggered_by var/mob/event_confirmed_by var/ert_reason = "Reason for ERT" - //1 = select event - //2 = authenticate - anchored = 1.0 + + anchored = 1 use_power = 1 idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON + + req_access = list(access_keycard_auth) /obj/machinery/keycard_auth/attack_ai(mob/user as mob) - to_chat(user, "The station AI is not to interact with these devices.") + to_chat(user, "The station AI is not to interact with these devices.") return /obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") return - if(istype(W,/obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/ID = W - if(access_keycard_auth in ID.access) + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) + if(check_access(W)) if(active == 1) //This is not the device that made the initial request. It is the device confirming the request. if(event_source) @@ -44,6 +45,8 @@ return event_triggered_by = usr broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices + else + to_chat(user, "Access denied.") /obj/machinery/keycard_auth/power_change() if(powered(ENVIRON)) @@ -51,16 +54,16 @@ icon_state = "auth_off" else stat |= NOPOWER + +/obj/machinery/keycard_auth/attack_ghost(mob/user) + ui_interact(user) /obj/machinery/keycard_auth/attack_hand(mob/user as mob) - if(!user.IsAdvancedToolUser()) - return 0 + if(..()) + return 1 ui_interact(user) /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(user.stat || stat & (NOPOWER|BROKEN)) - to_chat(user, "This device is not powered.") - return if(busy) to_chat(user, "This device is busy.") return @@ -74,19 +77,18 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320) + ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320) ui.set_initial_data(data) ui.open() /obj/machinery/keycard_auth/Topic(href, href_list) if(..()) - return + return 1 + if(busy) to_chat(usr, "This device is busy.") return - if(usr.stat || stat & (BROKEN|NOPOWER)) - to_chat(usr, "This device is without power.") - return + if(href_list["triggerevent"]) event = href_list["triggerevent"] screen = 2 diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index b17eb9940ea..5a01cd5b09f 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -197,8 +197,7 @@ /obj/spacepod/bullet_act(var/obj/item/projectile/P) if(P.damage_type == BRUTE || P.damage_type == BURN) deal_damage(P.damage) - else if(P.flag == "energy" && istype(P,/obj/item/projectile/ion)) //needed to make sure ions work properly - empulse(src, 1, 1) + P.on_hit(src) /obj/spacepod/blob_act() deal_damage(30) @@ -284,35 +283,27 @@ /obj/spacepod/emp_act(severity) occupant_sanity_check() cargo_hold.emp_act(severity) + + if(battery && battery.charge > 0) + battery.use((battery.charge / 2) / severity) + deal_damage(80 / severity) + if(empcounter < (40 / severity)) + empcounter = 40 / severity + processing_objects.Add(src) + switch(severity) if(1) if(pilot) to_chat(pilot, "The pod console flashes 'Heavy EMP WAVE DETECTED'.") if(passengers) for(var/mob/M in passengers) - to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the passengers - - - if(battery) - battery.charge = max(0, battery.charge - 5000) //Cell EMP act is too weak, this pod needs to be sapped. - src.deal_damage(100) - if(src.empcounter < 40) - src.empcounter = 40 //Disable movement for 40 ticks. Plenty long enough. - processing_objects.Add(src) - + to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.") if(2) if(pilot) to_chat(pilot, "The pod console flashes 'EMP WAVE DETECTED'.") if(passengers) for(var/mob/M in passengers) - to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the passengers - - deal_damage(40) - if(battery) - battery.charge = max(0, battery.charge - 2500) //Cell EMP act is too weak, this pod needs to be sapped. - if(empcounter < 20) - empcounter = 20 //Disable movement for 20 ticks. - processing_objects.Add(src) + to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.") /obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params) if(user.a_intent == I_HARM) diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 406c1f83083..6c2f7354b43 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -55,7 +55,7 @@ user.visible_message(" [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \ " Your hand slips, slicing [target]'s throat wth \the [tool]!" ) affected.createwound(CUT, 60) - target.losebreath += 4 + target.AdjustLoseBreath(4) return 0 @@ -83,7 +83,7 @@ /datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) user.visible_message(" [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \ " Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!") - target.losebreath += 4 + target.AdjustLoseBreath(4) return 0 /datum/surgery_step/face/fix_face diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index a0dcd29525f..794bf2a3e9f 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -162,9 +162,9 @@ var/obj/item/organ/external/head/H = target.get_organ("head") var/datum/robolimb/robohead = all_robolimbs[H.model] if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe. - H.h_style = "" - H.f_style = "" - target.m_style = "" + H.h_style = "Bald" + H.f_style = "Shaved" + target.m_styles["head"] = "None" E.status &= ~ORGAN_DESTROYED if(E.children) for(var/obj/item/organ/external/C in E.children) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index b860e3f062c..88f8078a2ba 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -133,9 +133,9 @@ if(crit_fail) return if(owner.stunned > STUN_SET_AMOUNT) - owner.stunned = STUN_SET_AMOUNT + owner.SetStunned(STUN_SET_AMOUNT) if(owner.weakened > STUN_SET_AMOUNT) - owner.weakened = STUN_SET_AMOUNT + owner.SetWeakened(STUN_SET_AMOUNT) /obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity) if(crit_fail) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index eca74a216b2..f71e9bff0be 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -101,7 +101,7 @@ else adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) - eye_blurry = max(eye_blurry, 6) + EyeBlurry(6) var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) @@ -231,6 +231,9 @@ var/datum/reagent/blood/injected = get_blood(container.reagents) + if(!istype(injected)) //Sanity.. + return + if(species && species.flags & NO_BLOOD) reagents.add_reagent("blood", amount, injected.data) reagents.update_total() @@ -238,8 +241,16 @@ var/datum/reagent/blood/our = get_blood(vessel) - if(!istype(injected) || !istype(our)) + if(!istype(our)) // Do we not have blood? + vessel.add_reagent("blood", amount, injected.data) // This is only ran once, so we need to add back their DNA. + vessel.update_total() + ..() + our = get_blood(vessel) // Get the new blood. + our.data["blood_DNA"] = dna.unique_enzymes // Give it the proper DNA we had before (src.dna) + our.data["blood_type"] = dna.b_type // Proper blood type. + our.data["donor"] = src // Without this, it'd be random each time it was extracted or Null. return + if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) reagents.add_reagent("toxin",amount * 0.5) reagents.update_total() diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index d10fea6b7aa..ce4b55efb11 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -860,11 +860,13 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/mutate() src.status |= ORGAN_MUTATED - if(owner) owner.update_body() + if(owner) + owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly render the deformed sprite. /obj/item/organ/external/proc/unmutate() src.status &= ~ORGAN_MUTATED - if(owner) owner.update_body() + if(owner) + owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly return them to normal. /obj/item/organ/external/proc/get_damage() //returns total damage return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health? diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 31ef55f4919..03690ef3279 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -107,13 +107,14 @@ var/global/list/limb_icon_cache = list() overlays |= lip_icon mob_icon.Blend(lip_icon, ICON_OVERLAY) - if(owner.m_style) - var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style] - if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head") - var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") - if(marking_style.do_colouration) - markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD) - overlays |= markings_s + var/head_marking = owner.m_styles["head"] + if(head_marking && head_marking != "None") + var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking] + if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head") + var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") + if(head_marking_style.do_colouration) + h_marking_s.Blend(owner.m_colours["head"], ICON_ADD) + overlays |= h_marking_s if(ha_style) var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style] @@ -158,6 +159,10 @@ var/global/list/limb_icon_cache = list() gender = "f" else gender = "m" + if(limb_name == "head" && !is_stump() && !(status & ORGAN_DESTROYED)) + var/obj/item/organ/external/head/head_organ = src + head_organ.handle_alt_icon() + new_icon_state = "[icon_name][gender ? "_[gender]" : ""]" if(skeletal) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index bb408f51726..5dd4d570ee2 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -307,7 +307,7 @@ owner.drip(10) if(prob(4)) spawn owner.custom_emote(1, "gasps for air!") - owner.losebreath += 5 + owner.AdjustLoseBreath(5) /obj/item/organ/internal/kidneys name = "kidneys" @@ -327,7 +327,7 @@ // Coffee is really bad for you with busted kidneys. // This should probably be expanded in some way, but fucked if I know // what else kidneys can process in our reagent list. - var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list + var/datum/reagent/coffee = locate(/datum/reagent/consumable/drink/coffee) in owner.reagents.reagent_list if(coffee) if(is_bruised()) owner.adjustToxLoss(0.1 * PROCESS_ACCURACY) @@ -357,10 +357,10 @@ /obj/item/organ/internal/eyes/surgeryize() if(!owner) return - owner.disabilities &= ~NEARSIGHTED - owner.disabilities &= ~BLIND - owner.eye_blurry = 0 - owner.eye_blind = 0 + owner.CureNearsighted() + owner.CureBlind() + owner.SetEyeBlurry(0) + owner.SetEyeBlind(0) /obj/item/organ/internal/liver @@ -416,7 +416,7 @@ if(src.damage >= src.min_bruised_damage) for(var/datum/reagent/R in owner.reagents.reagent_list) // Ethanol and all drinks are bad - if(istype(R, /datum/reagent/ethanol)) + if(istype(R, /datum/reagent/consumable/ethanol)) owner.adjustToxLoss(0.1 * PROCESS_ACCURACY) // Can't cope with toxins at all @@ -493,6 +493,7 @@ slot = "brain_tumor" health = 3 var/organhonked = 0 + var/suffering_delay = 900 /obj/item/organ/internal/honktumor/New() ..() @@ -535,11 +536,11 @@ return if(organhonked < world.time) - organhonked = world.time+900 + organhonked = world.time + suffering_delay to_chat(owner, "HONK") - owner.sleeping = 0 - owner.stuttering = 20 - owner.adjustEarDamage(0, 30) + owner.SetSleeping(0) + owner.Stuttering(20) + owner.AdjustEarDeaf(30) owner.Weaken(3) owner << 'sound/items/AirHorn.ogg' if(prob(30)) diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm index 23d2af69bf3..f0b4b912eaf 100644 --- a/code/modules/surgery/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -15,8 +15,8 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 if(world.time < next_pain_time && !force) return if(amount > 10 && istype(src,/mob/living/carbon/human)) - if(src:paralysis) - src:paralysis = max(0, src:paralysis-round(amount/10)) + if(paralysis) + AdjustParalysis(-round(amount/10)) if(amount > 50 && prob(amount / 5)) src:drop_item() var/msg @@ -132,4 +132,4 @@ mob/living/carbon/human/proc/handle_pain() toxDamageMessage = "Your body aches all over, it's driving you mad." if(toxDamageMessage && prob(toxMessageProb)) - src.custom_pain(toxDamageMessage, getToxLoss() >= 15) \ No newline at end of file + src.custom_pain(toxDamageMessage, getToxLoss() >= 15) diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm index 0f75fe9f80f..a4b0d8fb92b 100644 --- a/code/modules/surgery/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -169,10 +169,10 @@ /obj/item/organ/internal/diona_receptor/surgeryize() if(!owner) return - owner.disabilities &= ~NEARSIGHTED - owner.disabilities &= ~BLIND - owner.eye_blurry = 0 - owner.eye_blind = 0 + owner.CureNearsighted() + owner.CureBlind() + owner.SetEyeBlurry(0) + owner.SetEyeBlind(0) //TODO:Make absorb rads on insert diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 61b2f143f69..0f402a42e5d 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -142,10 +142,10 @@ /obj/item/organ/internal/optical_sensor/surgeryize() if(!owner) return - owner.disabilities &= ~NEARSIGHTED - owner.disabilities &= ~BLIND - owner.eye_blurry = 0 - owner.eye_blind = 0 + owner.CureNearsighted() + owner.CureBlind() + owner.SetEyeBlurry(0) + owner.SetEyeBlind(0) // Used for an MMI or posibrain being installed into a human. diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index 02351f523a8..faa6c403355 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -159,11 +159,15 @@ gendered_icon = 1 encased = "skull" var/can_intake_reagents = 1 + var/alt_head = "None" //Hair colour and style var/r_hair = 0 var/g_hair = 0 var/b_hair = 0 + var/r_hair_sec = 0 + var/g_hair_sec = 0 + var/b_hair_sec = 0 var/h_style = "Bald" //Head accessory colour and style @@ -176,6 +180,9 @@ var/r_facial = 0 var/g_facial = 0 var/b_facial = 0 + var/r_facial_sec = 0 + var/g_facial_sec = 0 + var/b_facial_sec = 0 var/f_style = "Shaved" /obj/item/organ/external/head/remove() @@ -197,6 +204,8 @@ if(owner)//runtimer no runtiming owner.update_hair() owner.update_fhair() + owner.update_head_accessory() + owner.update_markings() . = ..() /obj/item/organ/external/head/replaced() @@ -213,6 +222,17 @@ if(burn_dam > 40) disfigure("burn") +/obj/item/organ/external/head/proc/handle_alt_icon() + if(alt_head && alt_heads_list[alt_head]) + var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[alt_head] + if(alternate_head.icon_state) + icon_name = alternate_head.icon_state + else //If alternate_head.icon_state doesn't exist, that means alternate_head is "None", so default icon_name back to "head". + icon_name = initial(icon_name) + else //If alt_head is null, set it to "None" and default icon_name for sanity. + alt_head = initial(alt_head) + icon_name = initial(icon_name) + /obj/item/organ/external/head/set_dna(datum/dna/new_dna) ..() new_dna.write_head_attributes(src) diff --git a/config/example/config.txt b/config/example/config.txt index effb91d5bce..78670b6c01d 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -79,7 +79,7 @@ KICK_INACTIVE ## set to 0 to disable that mode PROBABILITY EXTENDED 2 PROBABILITY NUCLEAR 3 -PROBABILITY ABDUCTION 2 +PROBABILITY ABDUCTION 0 PROBABILITY CHANGELING 3 PROBABILITY CULT 4 PROBABILITY EXTEND-A-TRAITORMONGOUS 5 @@ -91,8 +91,6 @@ PROBABILITY HEIST 1 PROBABILITY WIZARD 2 PROBABILITY VAMPIRE 3 PROBABILITY RAGINMAGES 0 -PROBABILITY BORER 0 -PROBABILITY XENOS 0 PROBABILITY METEOR 0 PROBABILITY TRAITOR 0 PROBABILITY SHADOWLING 2 diff --git a/html/changelog.html b/html/changelog.html index 8279fa001b3..25339a43bca 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,184 +55,64 @@ -->
-

16 September 2016

-

Aurorablade updated:

+

28 November 2016

+

Allfd updated:

    -
  • *fart now has newtonian move if you have the Superfart power
  • -
-

Coldflame updated:

-
    -
  • Adds three new variants of 10mm ammunition, AP, HP, and Incendiary. Currently admin-only.
  • +
  • Fixes an issue with the processing of GitHub changelog emoji in the php webhook.

Crazylemon64 updated:

    -
  • Research data disks now have a description and name attached to them automatically, to make working with them less obnoxious.
  • -
  • Loading design disks now has a sound effect.
  • -
  • You can no longer feed non-design disks into the autolathe and destroy them on accident.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Due to budget cuts expensive fax machines have been replaced with cheaper versions in some departments. Only essential personnel can fax Central Command. See your local IAA for details.
  • -
-

FlattestGuitar updated:

-
    -
  • Added emergency nitrogen and plasma tanks, you can find two of each in the medical storage
  • -
-

FreeStylaLT updated:

-
    -
  • Updated Metastation's AI Sat, brig and escape shuttle
  • -
  • Updated other Meta areas to match most recent build. (Chapel, some maint, etc. - minor changes.)
  • -
  • Updated Cyberiad's AI Sat to latest tg version, lots of changes there - basically an entirely new Satellite.
  • -
-

IcyV updated:

-
    -
  • Adds new bottle sprite
  • -
  • Fixes many bottles being locked to a single icon
  • -
  • Buckets can be worn as hats.
  • -
-

Improvedname updated:

-
    -
  • Adds 4 epinephrine autoinjectors to nanomedplus vending machines
  • +
  • The RCD no longer shall work as a remote permissions control

KasparoVy updated:

    -
  • Adds a Science departmental beret that you can obtain via the loadout system.
  • -
-

Krausus updated:

-
    -
  • Fixed species-restricted items sometimes failing to "equip" to restricted species' non-equipment slots.
  • -
  • Players using very old versions of Internet Explorer will now receive explicit warnings that they're not supported.
  • -
  • View Variables will now consistently view the variables of what it's intended to.
  • -
  • Admins can now use the 'msay' command to speak directly to all mentors.
  • -
  • Added a new command, "Toggle Mentor Chat", to give mentors temporary access to 'msay'.
  • -
  • Fixed never being able to properly respond to a PM from a stealthed admin.
  • -
-

Kyep updated:

-
    -
  • SST and SIT now have their own radio frequency.
  • -
-

LittleBigKid2000 updated:

-
    -
  • The God Emperor of Mankind disk now works properly
  • -
-

TheDZD updated:

-
    -
  • Xenomorph hunters' leap ability is now always blocked by shields rather than only 50% of the time.
  • -
  • Xenomorph hunters' leap ability being blocked now stuns them as if they had hit a wall. The leap still goes on a 3 second cooldown as normal.
  • -
-

Ty-Omaha updated:

-
    -
  • Adds fluff item "Tacticool EyePro"
  • +
  • Pressing the light switch in one OR will no longer turn off the lights for both.
  • +
  • The fire alarms in each OR now work independently of each-other.
  • +
  • The second operating room now has its own APC and wiring.
-

01 September 2016

-

Crazylemon updated:

+

23 November 2016

+

A Giant-Ass Mountain of Salt updated:

    -
  • Dying of low blood is no longer capable of causing eternal death
  • -
  • Having your body brought back to life will no longer break your health doll
  • +
  • Re-adds PDA slot.
-

monster860 updated:

-
    -
  • Fixes hotel SNPC's getting access that they shouldn't get.
  • -
- -

29 August 2016

-

Crazylemon updated:

-
    -
  • You can now mend incisions after having cut open someone's ribcage.
  • -
  • Abductor surgery works again
  • -
  • Face repair surgery works again
  • -
  • The `to_chat` messages are now more descriptive when given a bad target
  • -
  • Admins can now VV by a ref string, directly via a verb
  • -
  • VV now builds its HTML using lists, making it much faster to open
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Upgrades the newscaster's liquid paper printing apparatus. Newspapers printed are higher quality now.
  • -
-

Fox McCloud updated:

-
    -
  • Mining Drones can now toggle meson vision on or off, a light, switch attack modes, or even drop their own ore
  • -
  • Ash storms no longer impact sheltered areas and mining mobs are immune to ash storms
  • -
  • Adds in two new end-round sounds
  • -
  • Fixes drones not being able to bump open doors
  • -
-

Fox McCloud and KorPhaeron updated:

-
    -
  • Adds in mining shelters
  • -
  • Adds in a few more dice types and ensure dice are packed in bags and not pill bottles
  • -
-

FreeStylaLT updated:

-
    -
  • Added additional coating to Turbine room.
  • -
  • Fixed leftover vent in Brig Physician's office
  • -
  • Fixed missing coated rwalls in Incinerator
  • -
-

Krausus updated:

-
    -
  • Girders are no longer bulletproof.
  • -
  • Changelings' Swap Form ability now actually deducts its cost upon use, and shouldn't arbitrarily fail to work properly.
  • -
  • Fixed setting status display alerts through communications consoles.
  • -
-

Kyep updated:

-
    -
  • Fixes 'SSD!' warning appearing in attack logs for admins, when the target player was dead and had ghosted out of their body
  • -
-

TheDZD updated:

-
    -
  • Bookcases no longer force you to take out a book after clicking them
  • -
  • Fixes assorted things logging attacks incorrectly.
  • -
-

TullyBurnalot updated:

-
    -
  • AIs can no longer interact with nuclear bombs (Syndicate-brand included). AIs can still see the countdown
  • -
  • Mobs without appendixes can no longer contract appendicitis
  • -
  • Holosigns cannot be pulled around
  • -
- -

19 August 2016

-

Crazylemon updated:

-
    -
  • pAIs should now save
  • -
-

FalseIncarnate updated:

-
    -
  • Repairing burn damage to robotic limbs now consumes cable in the process. Each length used repairs 3 burn damage, up to 15 damage per click.
  • -
  • Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). Heal amount unchanged.
  • -
  • Self-repairing with cables or welders now incurs a 1 second delay between click and heal completion. Being repaired by a friend is still no delay (but requires a friend).
  • -
-

Fox McCloud updated:

-
    -
  • Adds in the Kinetic Smasher as a mining purchase
  • -
  • Fixes slap emote text being the wrong partial color
  • -
  • Fixes the attack text of simple animals attacking human mobs
  • -
-

IcyV updated:

-
    -
  • Adds in an amount of new graffiti
  • -
  • Fixes the issue of other graffiti only being able to be done in black.
  • -
-

Krausus updated:

-
    -
  • Flavor text and records are no longer horrifically butchered when saved in the database.
  • -
-

TheDZD updated:

-
    -
  • Lowered genetic instability damage thresholds by 5 across the board. Effectively meaning that you can have one additional minor power without shifting into the next threshold.
  • -
  • Lowered the rate at which damage scales with instability, and the decreased upper cap on each damage type.
  • -
  • The base activation probability for powers is now 100%, rather than 45%. Abilities affected include everything except Cloak of Darkness, Chameleon, No Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent activation chances (varying from 5% to 10%).
  • -
  • Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), and Chameleon (10% to 25%).
  • -
- -

18 August 2016

Alexshreds updated:

  • pAIs can see the crew manifest again.
  • Engineers and Atmos Techs have access to the ORM
+

Alffd updated:

+
    +
  • Added a 6th Vulpkanin tail option.
  • +
  • Fixes animations, side view, and pixel fill for Vulpkanin tail 6
  • +
+

Allfd updated:

+
    +
  • Added hologram fluff sprites
  • +

Ar3nn updated:

    -
  • dusting playermobs now generates remains fitting for their race.
  • +
  • Adds tech levels to RnD console main menu
  • +
+

AugRob updated:

+
    +
  • Add screwdriver sound when opening/closing panels on airlocks
  • +
+

Aurorablade updated:

+
    +
  • Removes the !!FUN!! of having headslugs gold core spawnable.
  • +
+

Certhic updated:

+
    +
  • Corrected some air alarms so that atmos computer can access them
  • +
  • Bodyscanner now sees mechanical parts in internal organs
  • +
+

Chakirski updated:

+
    +
  • Adds disabled_component() to cyborgs.
  • +
  • EMPs now disable binary communication for as long as the stun time.
  • +
  • Syndicate thermal imaging glasses (mesons) can now be prescription upgraded like normal mesons.
  • +
  • Green glasses from the AutoDrobe can now be prescription upgraded.

Chakishreds updated:

    @@ -243,71 +123,138 @@
  • fixes transformation sting not working.
  • transformation sting now checks if the target has DNA or not
+

Coldflame updated:

+
    +
  • Adds three new variants of 10mm ammunition, AP, HP, and Incendiary. Currently admin-only.
  • +
+

CrAzYPiLoT updated:

+
    +
  • Fixes the footsteps sounds to the fullest.
  • +

Crazylemon updated:

    -
  • Alt+Click should be quicker now
  • -
  • The Alt+Click panel vanishes only when you alt click a turf distant from yourself
  • -
  • Adds `json_to_object_arbitrary_vars`, a proc intended for use with SDQL
  • -
  • Eye color is tracked on the eyes only, instead of on the body.
  • -
  • The CMA panel no longer runtimes when you change species.
  • -
  • Deserializing a human now preserves hair and eyes.
  • -
  • Associative lists in VV now display properly again
  • -
  • Admins can now click on the DI panel buttons to debug the corresponding controller in VV
  • -
  • Fat people are now fat when naked.
  • -
  • Encased mobs can now examine
  • +
  • Fully enables a system to allow species to have unique procs and verbs that come and go with the species.
  • +
  • IPCs lose their change monitor verb when changing species now. Gone are the days of recalling a past IPC life to perform self-barbery! Oh, woe is me!
  • +
  • Sleepers and Body Scanners will now reliably work when rotated
  • +
  • SSD humans should be asleep more reliably now.

Crazylemon64 updated:

    -
  • Makes teleportation checks more consistent, which will ensure that teleporting in the away mission no longer works.
  • -
  • People on the space ruins level no longer count as dead for assassinate objectives.
  • -
  • Space border turfs will now regain their destination when over-written and replaced on the edge of the map
  • -
  • The space manager will no longer runtime if a space ruin writes on the edge of the map
  • +
  • Sleeping simple animals should tick down sleeping as normal - deaf simple mobs are no longer a thing
  • +
+

DarkPyrolord updated:

+
    +
  • Adds in hardsuit sprites for Vulpkanin
  • +
+

Dave The Headcrab updated:

+
    +
  • Nerfs the damage the Detective's revolver does from 15 brute to 5 brute.
  • +
  • Adds a 300 round capacity buckshot magizine that fits into the L6 Saw.
  • +
  • Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw.
  • +
  • Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine.
  • +
  • Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their bag.

DaveTheHeadcrab updated:

    -
  • ERT gloves reverted to how they used to be.
  • +
  • Adds new worn icons for duffelbags to better reflect their size, compliments of WJohn at /tg/
  • +
+

Deanthelis updated:

+
    +
  • Added the ability for the Magnetic Gripper to pick up and place light tiles.

FalseIncarnate updated:

    -
  • WOLOLO! Traitor Chaplains can now WOLOLO with the new Missionary Staff and Robes. WOLOLO!
  • +
  • Plants will now begin to die over time if their age exceeds 5 times their TRAIT_MATURATION value.
  • +
  • Weed growth chance per process in trays has been slightly increased (Previously: 5% chance if no seed, 1% otherwise;Now: 6% / 3%).
  • +
  • Pest growth in trays has been slightly buffed. (Previously: 3% chance to increase by 0.1; Now: 5% chance to increase by 0.5)

Fethas updated:

    -
  • The whitelist will respect addons better, didn't even have to make a ban appeal..
  • +
  • Due to Archmage Steve leaving the nya-cromantic stone near the microwave, the true power of the stone has been unleashed. Subjects of the stone are not only ressurected ... but resurrected as catgirls ... We fired steve.

FlattestGuitar updated:

    -
  • Detective's coolness variable cranked up to 14.5, they will no longer vomit over corpses.
  • -
  • Now you're less likely to vomit over a corpse if you're a normal human being.
  • -
  • golems now have their master saved in attack logs
  • +
  • Adds IPC alcohol and a few derivative drinks
  • +
  • IPCs can now drink and be fed from glasses
  • +
+

FlattestNerd updated:

+
    +
  • the e20 will now get logged when it goes BEWM, as it should.
  • +
+

Fox MCCloud updated:

+
    +
  • Removes "harm" traitor objective
  • +
  • Increases non-escape/hijack/die objectives from 1 to 2
  • +
  • Tweaks available objectives to traitors a bit

Fox McCloud updated:

    -
  • Adds in formal captain's uniform and armor
  • -
  • Adds rapier to captain's locker
  • -
  • Adds lace up shoes to captain's locker
  • -
  • Adds crown to captain's locker
  • -
  • Dramatically speeds up conveyor belts
  • -
  • Appendicitis and Disease Outbreak events will no longer impact clientless mobs
  • -
  • Fixes bandolier being invisible on spawn
  • -
  • Removes the jukebox from the bar
  • -
  • Detective Scanner, Fedora Tipping, Pontificating, and Cap Flipping are now action buttons
  • -
  • Cane Gun and NT Rep's cane now acts as actual canes
  • +
  • fixes a bug relating to some brute/burn damage being dealt to human mobs.
  • +
  • Adds in overloading APCs, causing them to arc electricity to mobs in range.
  • +
  • Makes Engineering related APCs overload proof.
  • +
  • Implements the timestop spell.
  • +
  • Implements new sepia slime reaction which halts time in an AoE.
  • +
  • sentience potions no longer can make slimes sentient.
  • +
  • Removes Hulk instant stun.
  • +
  • Hulk damage increased.
  • +
  • Hulk wears off at a lower health threshold.
  • +
  • Fixes strange reagent not working on simple animals.
  • +
  • Reduces the amount shock damage and bounces for the Tesla engine.
  • +
  • Fixes Syndicate Cyborg's LMG being invisible.
  • +
  • Fixes the uplink kit having implanters that were both nameless and looked as if they had been used.
  • +
+

Fox McCloud and KorPhaeron updated:

+
    +
  • Adds in mining shelters
  • +
  • Adds in a few more dice types and ensure dice are packed in bags and not pill bottles
  • +
+

Fox-McCloud updated:

+
    +
  • Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws
  • +
  • Fixes some personal crafting behaving as other than intended

FreeStylaLT updated:

    -
  • Fixed missing space transition tiles in emergency shuttle transit
  • -
  • Fixed lack of prisoner access to lower part of labor camp shuttle
  • -
  • Changed UO45's and MO19's away missions' external tiles to just airless ones.
  • -
  • Changed MO19's exterior to be more rock than ground, this is to make Linda cry less when this mission is passed.
  • +
  • Added (Enabled) Mind Batterer for Traitors
  • +
  • Fixed uplink implant description (Said 5 when actually gave you 10 TCs)

General Chaos updated:

  • Ports TG's mech bay recharger code.
+

GeneralChaos81 updated:

+
    +
  • Ability to place and remove conveyor belts and levers.
  • +
+

Glorken updated:

+
    +
  • Added a Knight Arena for Holodeck.
  • +
  • Added red and blue claymore sprites.
  • +
  • Changed overrided to overrode when emagging Holodeck computer.
  • +
+

IK3I updated:

+
    +
  • Can no longer holster items with No-Drop active.
  • +
  • Saves prosthesis users from Tox-Comp's wrath
  • +

IcyV updated:

    -
  • Adds an exploding chameleon flag for traitors.
  • +
  • Adds a unique axe for Atmos-traitors
  • +
+

Improvedname updated:

+
    +
  • Adds 4 epinephrine autoinjectors to nanomedplus vending machines
  • +
+

Jey updated:

+
    +
  • Inflatable walls and door can now be deflated by altclicking them
  • +
  • Fixed lag from expanding multiple monkeycubes at once.
  • +
+

KasparoVy updated:

+
    +
  • Added the security gasmask, sexy mime mask, bandanas, balaclava, welding gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox breath, medical, and surgical masks.
  • +
  • Removed a duplicate of the human balaclava sprite.
  • +
  • Modifies the Vox plague-doctor, fake moustache, sterile and medical mask sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the names of some Vox mask adjusted-state sprites.

KorPhaeron and Fox McCloud updated:

    @@ -321,1080 +268,22 @@

Krausus updated:

    -
  • Karma spending is now slightly more straightforward and sanity-checked.
  • -
  • Ghosts can now see non-crew antagonists in the Award Karma listing.
  • -
  • You can now ctrl+click on yourself to stop pulling something.
  • +
  • Fixes ghosts failing to follow mobs that move in unusual ways
  • +
  • Fixed tape allowing mobs with sufficient access to move through solid objects.

Kyep updated:

    -
  • Added Syndicate Infiltration Teams (SITs), which are like Syndicate Strike Teams (SSTs) but focusing on stealth rather than direct combat. Useful for getting ghosts into rounds, spicing up rounds, having traitors with teamwork, and new kinds of traitor objectives like kidnap.
  • -
  • Fixed bug that Dust implants had no icon.
  • +
  • Blob, vine and virus outbreaks are now more clearly labeled as such, to avoid people confusing them with each other

LittleBigKid2000 updated:

    -
  • The arrivals checkpoint camera monitor is now connected to some camera networks by default.
  • -
  • Talking swords can now be understood by their wielders, and everyone else.
  • -
  • Engineering cyborgs now have floor painters. Absolutely nothing bad can happen because of this.
  • -
-

Norgad updated:

-
    -
  • Coated Reinforced Walls now have unique sprites
  • -
-

TullyBurnalot updated:

-
    -
  • Trash Bags fit in satchels/bags/duffelbags, but cannot be transported after being filled up.
  • -
  • Advanced Mops clean faster, can clean more
  • -
  • Holosign Projectors can create more signs
  • -
  • Ghosts can no longer create dirt
  • -
  • Dirt creation slowed down. "Clean Station" may actually be remotely possible now
  • -
  • Janitorial Closet tidied up
  • -
  • Can fill Light Replacers with boxes directly
  • -
  • Can recycle 3 broken/burnt bulbs into a functioning one
  • -
  • Can no longer cheat around NODROP by inserting NODROP lightbulbs into Light Replacers
  • -
  • Ghosts can no longer trip Proximity Sensors
  • -
  • Ghosts can no longer trip Infrared Sensors
  • -
  • Effects (like hallucinations) can no longer trip Proximity and Infrared Sensors
  • -
  • IDs are no longer dropped if their owner cryos with the ID inside a PDA inside a bag (very specific, yes)
  • -
-

Ty-Omaha updated:

-
    -
  • Allows sechailer phrases to be selectable
  • -
  • Quick-equipping a PDA will now prioritize the PDA slot before the ID slot.
  • -
-

taukausanake updated:

-
    -
  • Gives proper mix_messages for Uplink, Synthignon, and Synth 'n Soda drinks
  • -
-

tristan1333 updated:

-
    -
  • Spacepod paint
  • -
- -

08 August 2016

-

Ar3nn updated:

-
    -
  • Telekinesis no longer is subject to meatspace problems
  • -
-

Chakirski updated:

-
    -
  • Added animal AI holograms.
  • -
  • .45 Magazine sprites for the M1911 are now longer invisible.
  • -
  • Hoodies no longer look like labcoats while in hand.
  • -
  • Ectoplasm spawns in cult mining rooms instead of an invisible "weapon".
  • -
  • Duffel bag descriptions and names no longer contain "duffle".
  • -
  • Syndicate medical duffel bags can now be seen while in hand.
  • -
-

Crazylemon64 updated:

-
    -
  • Adds a "Save" buildmode for admins to preserve their creations for later. This is currently in an early stage, so don't be surprised by errors!
  • -
-

FlattestGuitar updated:

-
    -
  • Holy Water will no longer make you stutter for ages if you're not a cultist
  • -
-

Fox McCloud updated:

-
    -
  • Fixes Orion Ship message being unheard when held in-hand
  • -
  • Adds headphones into the game as a loadout item
  • -
  • Removes fireproof core malf AI power
  • -
  • upgrade turrets malf AI power CPU reduced from 50 to to 30
  • -
  • Overload machine cost increased from 15 to 20
  • -
  • Override machine cost increased from 15 to 30
  • -
  • can override/overload field generators again
  • -
  • Machine uprisers will slowly die if they aren't attacking someone
  • -
  • Adds in Hostile lockdown malf AI power for 30 CPU
  • -
  • Adds break air and fire alarms malf AI powers for 50 and 25 CPU respectively
  • -
  • AI's no longer have flood mode on air alarms by default
  • -
  • Adds in lip reading malf AI power for 30 CPU
  • -
  • Allows accessories to hypothetically grant armor to their wearer
  • -
  • Greytide spear illusions actually have an attack sound now
  • -
  • fixes the wormhole event being much shorter than intended
  • -
-

FreeStylaLT updated:

-
    -
  • Walls now melt when hot
  • -
  • Added actual coated rwalls - you can make them by clicking on an existing rwall with at least 2 plasteel in hand. Has infinite temp resistance.
  • -
  • Replaced all fake coated rwalls with new rwalls in both metastation (where they should be) and boxstation
  • -
  • Bandaging someone no longer stabs your eyes with bright green
  • -
  • Fixed repainted-to-wood metal flooring in courtroom - it's now actually wood
  • -
  • Fixed windoor in witness stand facing the wrong way
  • -
-

KasparoVy updated:

-
    -
  • Traitors with the Maroon objective will no longer succeed if their target is in a locker on the shuttle.
  • -
  • Traitors with the Assassination objective will no longer fail if their target is assassinated/borged/debrained but on a Z-level greater than the derelict.
  • -
-

Krausus updated:

-
    -
  • Fire will now totally consume you, rather than timidly hiding under your clothes.
  • -
  • Admin freeze overlays should no longer disappear from humans until they're actually unfrozen.
  • -
-

LittleBigKid2000 updated:

-
    -
  • Adds cheap sunglasses. They provide no flash protection, but are available in the loadout and clothesmate.
  • -
-

Pinatacolada updated:

-
    -
  • Makes the swedish gene spit out weird swedish chars and sounds
  • -
-

Ty-Omaha updated:

-
    -
  • Fixes "is too cumbersome to carry in one hand" from showing up to other players.
  • -
-

Yurivw updated:

-
    -
  • Condimaster now actually makes bottles. Removed: Unused options in admin secret menu are now removed.
  • -
-

chopchop1614 updated:

-
    -
  • fix bluespace crystals exploit
  • -
- -

03 August 2016

-

Fox McCloud updated:

-
    -
  • Fixes a rare case where the singularity would escape containment when properly set up+contained
  • -
-

Krausus updated:

-
    -
  • Non-respawnable ghosts will no longer qualify for mid-round rejoining (event antags, golems, posibrains, etc). Drones, PAIs, and ERTs are exceptions to this.
  • -
  • Cryodorms will no longer produce respawnable ghosts for the first 30 minutes of the round.
  • -
  • Fixed the spooky arrival shuttle. Cryo'd ghosts will now appear above their cryo pod, in the spooky cryodorms.
  • -
  • Cryodorms will now despawn you 90% faster if you willingly enter one.
  • -
  • Suiciding in the first 30 minutes of a round will no longer allow you to ghost and be respawnable.
  • -
  • Becoming a non-respawnable ghost lasts the entire round, even if you ghost in a respawnable manner later on.
  • -
  • You can no longer spam pinging posibrains, and cannot ping them at all if you cannot volunteer for one.
  • -
  • Missing limbs will now be grayed out on your health doll.
  • -
-

chopchop1614 updated:

-
    -
  • Fixed the C4 labcoat exploding bug
  • -
- -

01 August 2016

-

Crazylemon64 updated:

-
    -
  • Admins are now able to print a map of the z levels.
  • -
  • Admins are now capable of scrambling the z levels' transitions.
  • -
  • Janiborg trash bags no longer fit down disposals when empty
  • -
-

Fethas updated:

-
    -
  • (Maybe?)..We actually check if the race HAS BLOOD before trying to suck them
  • -
  • Due to various complaints from tajarans having hand cramps, glove makers have removed plasteel from the fabric.
  • -
  • Plasmaman can no longer be vampires.
  • -
  • Removes the mask check on both victim AND vampire, also makes the message a bit more obscure, so it's up to your imagination of where you are biting them and with what.
  • -
-

Fox McCloud updated:

-
    -
  • Medical stacks now have 6 uses
  • -
  • Medical stacks now heal 25 burn/brute
  • -
  • Applying a medical stack to others is instant, no matter what
  • -
  • Applying any medical stack to yourself has a 2 second delay
  • -
  • Applying a splint to yourself has a 10 second delay
  • -
  • No more RNG fumbling of putting splints to yourself
  • -
  • Confirmation for applying medical stacks is now green
  • -
  • Advanced Medkits now have 2 trauma kits, 2 burn kits, a health analyzer, 1 roll of gauze, and medipen.
  • -
  • Amount of splints in medical vendors increased from 2 to 4
  • -
  • Fixes weird icon updates when getting healed by medical kits
  • -
  • Adds in object burning system that allows things to be lit on fire
  • -
  • being on fire should heat you up a bit quicker and do a bit more damage
  • -
  • Novaflowers ignite you rather than uselessly heating you up
  • -
  • Adjusts a few pyrotechnic chems to better fit with other tweaks to fire damage
  • -
-

IcyV updated:

-
    -
  • Adds a unique axe for Atmos-traitors
  • -
-

Krausus updated:

-
    -
  • Probably fixed some very specific items messing up View Variables for no adequately explicable reason.
  • -
  • Fixed round-end antagonist report failing to print due to null objectives.
  • -
-

Kyep updated:

-
    -
  • Added atmos grenade kit to traitor uplink.
  • -
  • Fixed bug with adv pinpointers and CMO hypospray theft objectives. Fixes #5232
  • -
-

TheBeoni updated:

-
    -
  • Adds "unique" jumpsuit for Pod Pilot so they can finally stop using security one Added picture because i do not like that red label
  • -
-

TheDZD updated:

-
    -
  • Shadowling ascendance and badmins pressing the "Destroy All Lights" button should no longer bring the server to its knees.
  • -
  • Broken lights will no longer re-break.
  • -
-

TullyBurnalot updated:

-
    -
  • Using ATMs leaves fingerprints behind
  • -
-

Twinmold updated:

-
    -
  • Nuke Ops airtank connected to pipenet now.
  • -
-

tigercat2000 updated:

-
    -
  • Readded colored cable-cuffs.
  • -
  • Making stacks of metal rods now updates the icon correctly.
  • -
- -

28 July 2016

-

A Giant-Ass Mountain of Salt updated:

-
    -
  • Re-adds PDA slot.
  • -
-

Crazylemon64 updated:

-
    -
  • Adds an explosion buildmode
  • -
  • "Drop Everything" in VV no longer causes limbs to fall to the ground.
  • -
-

FlattestGuitar updated:

-
    -
  • IAAs can now select the classic secHUD in loadouts
  • -
  • adds bananas and suit jackets to the loadout system
  • -
  • adds dress shoes and fancy sandals to the loadout system
  • -
  • Miners can now get the mining coat from loadouts
  • -
-

Fox McCloud updated:

-
    -
  • Fixes organ repair surgery saying an organ wasn't damaged when it actually was
  • -
  • Removes the 1 burn heal from regular ointment
  • -
  • Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)
  • -
  • Fixes a few crafting recipes not having the proper category
  • -
  • Fixes laser slugs not firing lasers
  • -
  • Adjusts the damage/consistency of improvised slugs
  • -
  • Adds in craftable bolas; throw them at someone to slow them down
  • -
  • Secvend starts off with e-bolas
  • -
  • Can make spears with personal crafting now
  • -
  • Fixes teacups and some other drinks having no sprite, in-hand, or object
  • -
  • adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies
  • -
  • Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand
  • -
  • Fixes cablecuffs not having a unique in-hand icon
  • -
  • Fixes cable coils not having a unique in-hand icon
  • -
  • All cablecuffs will be red, regardless of what they're produced from
  • -
  • Fixes an unlimited metal exploit
  • -
  • IV Drip sprites updated; has visual feedback for if it's injecting or taking blood
  • -
  • IV Drip injection rate dramatically increased
  • -
  • Warning ping for when someone is low on blood
  • -
  • Support for species with exotic blood type
  • -
  • Alt-Click to toggle between modes
  • -
  • Sensory restoration virology symptom no longer has anti-stun properties nor heals brain damage, but has a lower acquisition level
  • -
  • Damage convert heals individual limbs instead of healing overall damage (actual impact is low)
  • -
  • Librarian now starts off with a bookbag
  • -
  • Bookbag can now hold Bibles, cult tomes, books, and spellbooks
  • -
  • Can empty a bookbag into a bookshelf
  • -
  • Fixes an exploit where you could generate wood out of thin air
  • -
  • Fixes blobspores doing more damage than intended
  • -
-

Fox-McCloud updated:

-
    -
  • Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws
  • -
  • Fixes some personal crafting behaving as other than intended
  • -
-

FreeStylaLT updated:

-
    -
  • Fixed brig cell block APCs not getting power
  • -
  • Fixed space buggery Kyet made :angry:
  • -
  • Fixed missing light near labor shuttle dock
  • -
  • Fixed wrongly placed cobweb in solitary
  • -
  • Fixed basketball court not having a basketball
  • -
  • Added windows to brig processing entrance
  • -
  • Re-added the missing EOD and biohazard lockers in Armory
  • -
  • 6 gas masks from Armory
  • -
  • Added grid check into random events.
  • -
-

Krausus updated:

-
    -
  • The voting panel now uses the browser datum, which means it looks nicer.
  • -
  • The voting panel now updates while a vote is in progress.
  • -
  • When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in "vote".
  • -
  • Custom votes will now show full voting results upon completion.
  • -
  • Admins should no longer lose the "cancel vote" link in the voting panel.
  • -
  • View Variables should probably stop crashing admins.
  • -
  • The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen.
  • -
  • Admins now have click shortcuts for opening a player panel, showing mob info, and viewing variables. Specifics are in Hotkey Help.
  • -
-

Kyep updated:

-
    -
  • Admins can now see attacks against SSD players more easily.
  • -
  • Clarified the text you get when examining a SSD player.
  • -
  • It is now possible for admins to remove a person's vamp thrall status.
  • -
  • Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
  • -
  • Fixes an issue with spy loadouts, and excessive access on loadouts in general
  • -
-

Spacemanspark updated:

-
    -
  • Cardboard boxes now have their own specific name in the cardboard sheets menu.
  • -
-

TheDZD updated:

-
    -
  • Fixes tempgun not recharging.
  • -
  • Fixes tempgun beams costing one tenth of what they are supposed to.
  • -
  • Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should.
  • -
  • Mentors should no longer get spammed by the library checkout computer on occasion.
  • -
  • Mentors should no longer get spammed by mirrors due to body accessories.
  • -
-

TullyBurnalot updated:

-
    -
  • AI Integrity Restorers now destroy any AIs inside if they get EMP'd
  • -
  • AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside
  • -
-

Twinmold updated:

-
    -
  • Can no longer destroy pods with anything other than brute and burn weapons.
  • -
  • Can no longer pull someone out of a pod when no one is actually in the pod.
  • -
  • Can now melee attack pods with weapons when harm intent is on.
  • -
  • Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete.
  • -
-

Ty-Omaha updated:

-
    -
  • Gives Combat Gloves to Code Red ERT agents.
  • -
  • Gives Code Gamma Engineering ERT agents Combat Gloves.
  • -
-

monster860, clusterfack, and DeityLink updated:

-
    -
  • Adds space parallax
  • -
-

tigercat2000 updated:

-
    -
  • Removes space parallax, due to server overhead, input lag & bugs
  • -
- -

21 July 2016

-

Alffd updated:

-
    -
  • Added a 6th Vulpkanin tail option.
  • -
  • Fixes animations, side view, and pixel fill for Vulpkanin tail 6
  • -
-

FalseIncarnate updated:

-
    -
  • Engineers can properly show up for work with their hats and coats to keep warm.
  • -
-

Fox McCloud updated:

-
    -
  • Tajarans and Unathi can now wear all shoe and glove types
  • -
  • Glove clipping removed except for black gloves, which makes them fingerless gloves
  • -
  • Adds sandals as a loadout option
  • -
  • Adds in simple animal mob spawners
  • -
  • Adds shielded hardsuit to the nuke ops uplink for 30 TC
  • -
  • Implements the powerfist and adds it to the uplink for 8 TC
  • -
  • Removed drinking glass shattering (regular bottle shattering is still a thing)
  • -
  • Captain's flask is now gold instead of silver
  • -
  • Bottles have a throwforce of 15
  • -
  • can crack eggs into drinking glasses
  • -
  • Detective's flask starts out with 30 units of whiskey
  • -
  • removes redundant object verbs that have an action button
  • -
  • Fixes up mindswap spell so it behaves more properly
  • -
  • Fixes genetic abilities action buttons not properly clearing
  • -
  • Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs and other sources
  • -
  • ACTUALLY FIXES MINING APC
  • -
  • Fixes brig cell timers not having the option to flash people
  • -
-

FreeStylaLT updated:

-
    -
  • Added new syndicate item Chameleon SecHUD to uplink store, available for all antags. It can morph into various eyewear while being a flashproof sechud.
  • -
-

Kyep updated:

-
    -
  • Added new syndicate costumes to "select equipment" admin verb.
  • -
-

TullyBBurnalot updated:

-
    -
  • More beds outside the Operating Theaters, Pajama Wardrobes outside and inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per OR, table with cards
  • -
  • Sinks moved closer to Surgical Tables, moved light fixtures in the Operating Theaters, tables with surgical tools now made of glass for maximum style points and Xenomorph Larva Whack-A-Mole
  • -
-

monster860 updated:

-
    -
  • Brig timer UI reopening after being closed fixed.
  • -
- -

20 July 2016

-

Allfd updated:

-
    -
  • Added hologram fluff sprites
  • -
-

Ar3nn updated:

-
    -
  • Gets rid of some weird lattices floating in mid-space
  • -
-

Chakirski updated:

-
    -
  • Adds M.E. Reaper sprite.
  • -
  • AI can now choose a 32x64 reaper hologram.
  • -
  • Cigarette packs no longer show near-duplicate messages when examined.
  • -
-

CrAzYPiLoT updated:

-
    -
  • Ports randomized space ruins from /tg/ station. There is a number of maps which can be spawned at any location on the empty z-level at roundstart, and up to three random ones will be chosen each round. Credits to KorPhaeron.
  • -
  • Lays the groundwork for a future lavaland implementation, if we choose to have it.
  • -
  • Adds a feature to the map loader where areas with the right var set can be distinctly initialized on map load - meaning separate APCs, and the like.
  • -
  • Using a z-level specific initialization freeze system, large elaborate maps like the cyberiad can be loaded without a single runtime, with minimal impact on the round elsewhere.
  • -
  • Adds a delete mode to the "Fill" buildmode - just alt-click for the second corner, and everything within will be removed.
  • -
  • Adds a "Jump To" function in VV, which is useful for getting an idea of what exactly you're looking at.
  • -
  • Added view count to newscaster feeds and messages.
  • -
-

Crazylemon64 updated:

-
    -
  • Abductors consoles link correctly again
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Plastic explosives are now a subtype of grenades. Shouldn't be any noticable difference for players.
  • -
  • Plastic explosives no longer use the wire datum. You may directly attach an assembly holder (Such as a remote signaller + igniter assembly)
  • -
  • Adds X-4 shaped charges, designed for breaching explosively without harming the user. Pick some up at your local nukies r us.
  • -
  • Replaces tablecrafting with personal crafting, click the hammer icon by your intent selector to use it.
  • -
  • Removes the PDA slot, your PDA can now go in your ID slot (Again).
  • -
  • You can now alt click to remove an ID from a PDA, for quick interaction while it's in your ID slot.
  • -
  • Adds an overlay for an ID while it's inserted into your PDA.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds new Bottler machine for making unique beverages! Order one from cargo today!
  • -
  • Adds 6 new drinks obtainable via the Bottler. Get brewing!
  • -
  • Grapes now can be properly juiced again, as they now have the right kitchen tag.
  • -
  • Adds effects to the Paradise Pop reagents. Drink them all to unlock their powers!
  • -
-

Fox McCloud updated:

-
    -
  • Adds in fans which can block atmospherics passing over them
  • -
  • All mass driver blast doors have a fan underneath them, allowing you to use them repeatedly instead of once
  • -
  • Fixes medical, security, and employment records not being displayed
  • -
  • Adds in a weather system
  • -
  • Removes most of the miner's uniform equipment from their lockers and puts it in a miner's wardrobe
  • -
  • Miners start off with a lot of their clothing equipment equipped to them
  • -
  • Miners now have unique headset sprites
  • -
  • Miners no longer have lanterns, but a seclite; they can attach this to their kinetic accelerators now
  • -
  • Miners have workboots instead of black shoes
  • -
  • Miners no longer have a default mining scanner but an advanced one that works at reduced range (5 instead of 7) and has a longer cooldown between pulses (5 instead of 3.5)
  • -
  • removed extra mining hardsuit from the outpost
  • -
  • removed medikit spam from outpost; now just a toxin kit and a regular medical kit
  • -
  • Bluespace crystals now earn you points and can be refined into bluespace polycrystal sheets
  • -
  • Spare vouchers from QM and HoP removed
  • -
  • removed armor from the fake tactical turtleneck
  • -
  • Can scan vending machines with your PDA to pay for items (if there's an ID in your PDA)
  • -
  • Sleepers no longer require a console to build, only the sleeper itself
  • -
  • Clicking on the sleeper brings up the menu that was previously brought up for the console
  • -
  • Adds in syndicate sleepers--these sleepers are not only syndie themed but also allow the user to inject chems into themselves while inside the sleepers
  • -
  • Sleepers can now inject silver sulfadiazine
  • -
  • removes cryofeeds from cryodorms and adds in 2 more cryopods
  • -
  • Fixes pre-spawned loaded belts not having proper overlays
  • -
  • nanites will no longer purge chems, but will now heal internal organ damage, attempt to mend fractures, and will no longer cure beneficial viruses
  • -
  • cold and hot drinks should now properly heat you up or cool you down (this also goes for medical reagents)
  • -
  • beer no longer reduces jitteriness
  • -
  • toxins special and antifreeze heat you up
  • -
  • banana juice and banana honk now heals monkeys
  • -
  • Fixes atrazine not killing nymphs
  • -
  • mining autoinjectors no longer poison you
  • -
  • combat hypospray now has omni+epinephrine+teporone
  • -
  • stimpack is now meth+coffee instead of meth+epinephrine
  • -
  • Cheese and synth meat amount creation scales with volume of the reaction
  • -
  • sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, and IAA are no longer left out)
  • -
  • Fixes syndi+shielded+hos hardsuit sprite issues
  • -
  • Fixes wizard's who have a regular satchel set in their prefs winding up with none
  • -
  • Spellbooks are automatically bound to wizards at round start (no more ragin' exploitative mages)
  • -
  • Fixes mining outpost lacking an APC
  • -
  • Fixes being able to exploit and turn artificial bluespace crystals into regular bluespace crystals
  • -
-

FreeStylaLT updated:

-
    -
  • Added courtroom, left of brig.
  • -
  • Remapped brig
  • -
  • Moved prisoner processing and evidence storage to the right of brig, next to Detective's office.
  • -
  • Changed current processing to Interrogation and a hallway.
  • -
  • Re-mapped Conference and Locker rooms.
  • -
  • Lots of other minor tweaks to brig.
  • -
  • Seriously, way too many small changes to list here, go and have a look at the brig yourself.
  • -
  • Removed temp. detainment and observation from brig.
  • -
-

KasparoVy updated:

-
    -
  • Wearing a suit will no longer cause runtimes due to the way suit-collars are handled.
  • -
  • The north direction sprite of the Vulpkanin 'Patch' facial hair style won't hang a pixel off the head anymore.
  • -
-

Krausus updated:

-
    -
  • All admins can now see "admin log" messages.
  • -
  • Admins can now toggle "admin log" messages on or off.
  • -
  • Admins will no longer be notified about ghosted admins jumping around.
  • -
  • Beating on simple animals will no longer be twice as noisy as intended.
  • -
  • Emergency Response Teams are now usable again.
  • -
-

Kyep updated:

-
    -
  • adds botany, basketball court, individual cells, library computer and more to perma. Makes it far less boring.
  • -
  • Tracking implants are now useful, showing the implanted person's general location, and health status, on prisoner consoles.
  • -
  • The NODROP flag now works correctly on jumpsuits.
  • -
  • Improved admin 'select equipment' verb. ERT option now works, costumes get IDs and proper headsets, two new costumes added, and some outfits minorly tweaked (e.g: tunnel clowns get toolbelts).
  • -
  • Prevented NPCs being made into objective targets.
  • +
  • Booze dispensers can now dispense synthanol

LittleBigKid2000 and TullyBBurnalot updated:

  • Stethoscopes can now be used to tell if a person's heart or lungs are damaged, or if they have any at all. Now they're actually useful instead of telling you the obvious in a vague way.
  • Stethoscopes can no longer be used to hear the heartbeat and breathing of a person that doesn't have a heart or lungs.
-

Tauka Usanake updated:

-
    -
  • Adds a Hydroponics HUD and a night vision version of it that can both be created in R&D. It provides additional details on plants in hydro trays and soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of the plant as well as whenever it is ready to be harvested or is dead.
  • -
-

TullyBBurnalot updated:

-
    -
  • Handless cuffing no longer possible. Can still cuff people with one hand
  • -
-

TullyBurnalot updated:

-
    -
  • Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW
  • -
  • When emagged, Photocopiers now have a cooldown if used to copy butts
  • -
-

Twinmold updated:

-
    -
  • Fixes removing ID cards from laptops with the Eject ID verb.
  • -
-

monster860 updated:

-
    -
  • A bunch of interfaces now use /datum/browser.
  • -
  • The ChemMaster now uses the asset cache, eliminating the enormous lag spike when you first use it. Yey!
  • -
  • Fixes the window not closing when selecting an icon for the chem-master
  • -
  • Fixes the chem master window not updating when selecting an icon
  • -
  • The chem-master icon selection window now has a 4x5 grid of icons.
  • -
-

tigercat2000 updated:

-
    -
  • Gas tanks now have an action button for accessing their interface.
  • -
  • You can now shift-click on movable HUD elements (such as action buttons) to reset them to their initial position.
  • -
  • Implants with limited uses, such as freedom implants, now delete themselves when they run out of uses.
  • -
- -

13 July 2016

-

Ar3nn updated:

-
    -
  • Adds a silence button to newscasters, which will silence the regular update sounds
  • -
-

Chakirski updated:

-
    -
  • Adds new bacon sprites.
  • -
  • Bacon can now be cooked from the grill. Just grill raw bacon.
  • -
  • Raw cutlets are now sliceable into raw bacon strips.
  • -
  • Plasma and N20 look more gassy.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Greys no longer speak in wingdings.
  • -
  • Greys now have a species-specific language.
  • -
-

Fox McCloud updated:

-
    -
  • Overall borg power useage has been lowered
  • -
  • Borgs who have completely run out of power can now still move around/see/talk, but they will be unable to interact with machinery/doors around them; they can still bump open doors, however. Borgs with no cell are still completely paralyzed and can't do anything.
  • -
  • IPCs are now properly impacted by space's burn damage
  • -
  • NT Rep's cane stuns for less and invokes a cooldown between use, similar to telebatons
  • -
  • Oxygen damage number changed a bit; damage is based upon volume lost more now
  • -
  • Species that have blood but are oxygen immune will now take tox damage
  • -
  • Health analyzers will now work with species with exotic blood and inform the user what type of exotic blood they have
  • -
  • Other machinery that display blood levels (op table, sleepers, advanced scanners, etc) will now work with exotic blood
  • -
  • Changeling regen will now properly restore blood if you have exotic blood fix Fixes being blurry for 20+ minutes when you were low on blood for a mere 3 minutes
  • -
  • Heart damage impacting blood volume removed
  • -
  • Nutrition draining when low on blood removed
  • -
  • Station cinematics shouldn't have inventory overlays over top of the animation
  • -
  • Station cinematics should properly clear off the screen and delete now
  • -
  • pAIs are no longer valid targets for gun turrets (like on the syndicate ship)
  • -
  • Adds in Rathen's secret, a new spell for the wizard that AoE stuns
  • -
  • Removed borg jetpacks
  • -
  • Adds in borg ion pulse system; borgs with ion pulse enabled consume extra power for each turf they move but can travel on space. Can upgrade any borg, at R&D with an ion pulse upgrade
  • -
  • Adds in cyborg self repair upgrade: very slowly repairs cyborgs at the cost of extra power. Available at R&D
  • -
  • Mining cyborg module tweaked slightly: GPS, shovel, mini welding tool and mini extinguisher added, wrench and screwdriver removed
  • -
  • reset borg module removes speed boost
  • -
  • Fixes borg's stun arm bypassing shields
  • -
-

KasparoVy updated:

-
    -
  • Adds Vox compatible versions of all jumpskirts.
  • -
  • Adds Vox compatible version of the CMO jumpsuit.
  • -
-

Krausus updated:

-
    -
  • Players will ALMOST DEFINITELY never get stuck as plants anymore. I mean it this time!
  • -
  • Fixed morgue trays not updating themselves when you ghost into/out of your body.
  • -
-

Kyep updated:

-
    -
  • Changed access requirement on lethal injection locker to sec access (same access required for the chair its right next to.
  • -
  • Changed access requirement on exile implant locker to armory access.
  • -
  • Ghosts no longer miss out on ERTs due to not knowing it was called, or not being able to find the verb. They are now prompted about joining an ERT when one is called.
  • -
  • Fixed a condition where 'we are assembling an ERT' message is broadcast, but no ERT is generated.
  • -
  • Typo fixes in ERT messages.
  • -
  • Entering a cryo pod, then deliberately selecting OOC->Ghost, and clicking yes on the prompt, will now instantly send you to long-term storage, removing you from the round, despawning your body, freeing your job slot, and giving a new objective to any antag that had you as a target.
  • -
  • Announcements about someone entering long-term storage via a cryopod now include that person's rank.
  • -
  • When an antag target cryos, the message the antag gets about their objectives changing is now clearer.
  • -
-

TheDZD updated:

-
    -
  • Adds "salts" as a say verb for deadchat ghosts.
  • -
-

TullyBurnalot updated:

-
    -
  • Universal Recorder added to NT Rep Locker
  • -
  • Box of recorder tapes added to NT Rep and IAA Locker
  • -
  • Fax Guide added to Captain, HoS, HoP, NT Rep and IAA Lockers
  • -
  • Butt copy alert added to photocopiers
  • -
  • Butt copy alert comes with *ping noise
  • -
  • Photocopiers start with 60 toner
  • -
-

Twinmold updated:

-
    -
  • Vampires with sleeping carp (traitor+vampire rounds) can now suck people's blood like normal.
  • -
-

monster860 updated:

-
    -
  • The ChemMaster now uses NanoUI! Yey!
  • -
  • Alerts are no broken ghostly outlines
  • -
- -

09 July 2016

-

Chakirski updated:

-
    -
  • Adds disabled_component() to cyborgs.
  • -
  • EMPs now disable binary communication for as long as the stun time.
  • -
  • Syndicate thermal imaging glasses (mesons) can now be prescription upgraded like normal mesons.
  • -
  • Green glasses from the AutoDrobe can now be prescription upgraded.
  • -
-

FalseIncarnate updated:

-
    -
  • Deepfryers are no longer arcane mysteries, and can be (de)constructed and upgraded.
  • -
-

Fox McCloud updated:

-
    -
  • Grenade have a chance to explode when the person holding them is shot
  • -
  • Flamethrowers can release their tank's contents if the person holding them is shot
  • -
  • Can no longer self-trigger blocked shield events (ie: no self-harm to trigger a reactive teleport armor)
  • -
  • Hugging someone/shaking them up bypasses shield checks (oh no, hugs of death)
  • -
  • Riot shields have a +30% chance to block thrown projectiles
  • -
  • Hunter pounces are now a thrown attack as far as shield go, and yes, can be blocked by riot shields now
  • -
  • Energy shields no longer block anything other than beam and energy projectiles
  • -
  • Being able to be pushed is based on the block chance of the item you're holding instead of it just being based on riot shields
  • -
  • Adds in cursed wizard heart, purchase it from the wizard's spell book for 1 point, but be wary of not keeping the heart beating...
  • -
-

FreeStylaLT updated:

-
    -
  • Added a bunch of new items to maint, some rare uplink gear included. (see PR for full list)
  • -
  • made gas masks, nothing and extinguishers less common in maint
  • -
-

Krausus updated:

-
    -
  • Players probably won't get stuck as plants forever anymore. Probably.
  • -
  • Refactored job ban checking, which should massively reduce round start-up time.
  • -
  • Job bans/unbans will now take effect instantly, rather than at the next server restart.
  • -
-

TheDZD updated:

-
    -
  • DNA injectors no longer always activate powers that are supposed to have a chance to activate.
  • -
  • Dionae can no longer activate the radiation disability, nor the run superpower except via adminbus.
  • -
  • Adds genetic instability, which causes a variety of negative effects, including toxin damage, burn damage, cloneloss, and even gibbing. Effects get worse as stability gets lower, burn damage starts below 85 stability, tox and clone below 70, and gibbing once you're below 40.
  • -
  • Adds Curse of the Cluwne touch attack spell, which wizards can pick, heavily based off of the same spell from Goonstation. Said spell adds an unremovable honk tumor to the target, gives them NODROP neon green clown gear, makes them stutter, makes them almost eternally fat, confuses them, makes them clumsy and speak in Comic Sans, and severely brain damages them. Use it on a cluwne however...
  • -
  • Fixes a bug where honk tumors would cause NODROP items to still be moved, despite being unable to be unequipped.
  • -
-

TullyBurnalot updated:

-
    -
  • Botanist access to the morgue revoked
  • -
  • Added custom messages for evil faxes
  • -
  • Added unique text body for each non-evil fax template
  • -
  • Added a "Keep up the good work" fax template
  • -
  • Added a "ERT Instructions" fax template
  • -
  • Photocopiers can be emagged
  • -
  • Emagged photocopiers deal 30 burn damage to all mobs copying their butts
  • -
  • Deconstructing Comfy Chairs yields 2 metal sheets
  • -
  • Boxes no longer allowed inside evidence bags to prevent them going into themselves
  • -
  • Monocles are now prescription upgradable
  • -
  • Monocles added to Loadout selection
  • -
  • Spinning a revolver's chamber makes a noise again
  • -
  • Revenants can actually be killed now.
  • -
  • AntagHUD activation disqualifies player from rebooted drones
  • -
  • Sergeant Ian hat now visible
  • -
-

Twinmold updated:

-
    -
  • Fixes the inconsistency of getting 2 metal rods when you wirecutter a destroyed grille down to 1.
  • -
- -

07 July 2016

-

Ar3nn updated:

-
    -
  • Adds tech levels to RnD console main menu
  • -
-

FalseIncarnate updated:

-
    -
  • Chicks no longer lose their souls (literally) when becoming adults.
  • -
  • Intercoms, fire alarms, and air alarms no longer contain internal portals to a realm of infinite cables and circuit boards.
  • -
-

Fox McCloud updated:

-
    -
  • Space lube damage removed and duration reduced from 7 to 5
  • -
  • Azide and CLF3+Firefighting foam now play a bang sound when mixed
  • -
  • Can now pet pAI's with help intent
  • -
  • Fixes sechuds and nightvision sechuds having flash protection
  • -
-

FreeStylaLT updated:

-
    -
  • Added windows and a missing firelock to Genetics/Cloning
  • -
  • Tweaked layout of Genetics slightly
  • -
  • Added photocopier to R&D.
  • -
  • Tweaked RD's office layout slightly
  • -
  • Changed access on Tcomms' external airlocks' buttons to be same as general Tcomms access
  • -
  • fixed the airless tiles in Assembly Line's windows
  • -
-

KasparoVy updated:

-
    -
  • Adds improved Vox mask/goggle sprites.
  • -
  • Adds Vox-compatible versions of most suits.
  • -
  • Adds species-fitting and icon override handling to clothing accessories and suit collars.
  • -
  • You can now open/close Clown Officer and Soldier coats.
  • -
  • Adds by-species tail hiding.
  • -
  • Tidies up and refactors the way the Captain's space helmet shows Vox hair but hides every other species'.
  • -
  • Reactive armour's sprite will now update as soon as you turn it on/off or EMP it.
  • -
-

Krausus updated:

-
    -
  • Fixed borers dying in hosts who happened to be somewhere cold, such as space. Even if their host was in a space suit.
  • -
  • Fixed borers forgetting to detach from a host when it died.
  • -
  • Fixed borers being able to assume control of a dead host.
  • -
  • Fixed dead borers in a host being able to speak with the host and ghosts.
  • -
  • Fixed employees starting every shift at least 3 minutes late. You aren't getting paid to stand around, people!
  • -
  • Fixed animal beatdowns being twice as noisy as they should be.
  • -
  • Pod lock busters should now properly bust pod locks.
  • -
  • The late-stage effects of the "sensory destruction" disease symptom should now properly destroy your senses.
  • -
  • Autotraitor should now continue picking new in-game traitors, instead of picking one and dying.
  • -
  • Lacking a head no longer makes you immune to becoming a husk or skeleton.
  • -
  • Security and medical records should probably stop crashing people.
  • -
  • Altering details on an Agent ID Card will now actually update what's seen when examining the card.
  • -
-

Kyep updated:

-
    -
  • Fixes NT Special Ops Officer's headset so he can correctly hear, and talk on, the Special Ops (deathsquad) channel.
  • -
  • Fixed oversight in keycard authentication devices that incorrectly treated trialmins like fullmins, resulting in situations where calling an ERT became impossible.
  • -
  • If an ERT request gets no answer for 5 minutes, admins now get a one time reminder that it was sent.
  • -
-

TheDZD updated:

-
    -
  • Burst fire selection is now a proc, as it was meant to be, rather than a verb.
  • -
-

TullyBurnalot updated:

-
    -
  • AI can no longer interact with IV Drips
  • -
  • Robots can no longer remove beakers/blood bags from IV Drips
  • -
  • Fixed clown door deconstruction
  • -
  • Fixed mime door deconstruction
  • -
- -

02 July 2016

-

Fethas updated:

-
    -
  • adds comfirmation dialogs to transforms from player panel
  • -
-

Fox McCloud updated:

-
    -
  • Adds in laughter demons
  • -
  • Can summon laughter demons as a wizard
  • -
  • Chem master can produce instantaneous medical patches if all chems are safe
  • -
  • Can now purchase sniper rifle and associated ammo on uplink during nuke ops
  • -
  • Most melee and laser armor values halved or reduced; some bullet armor reduced slightly
  • -
  • Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still slow though)
  • -
  • Mining armor caps out at 60 melee resist as opposed to 80
  • -
  • Ling melee armor reduced; bullet and laser values buffed a bit and slowdown removed
  • -
  • Chameleon jumpsuit has a little bit of armor
  • -
  • Detective's forensic jacket now has identical armor to the native detective jacket
  • -
  • Armor penetration added to energy swords, chainsaws, scythes, and spears
  • -
  • Fixes stun batons, telebatons, and abductor batons piercing/bypassing shields
  • -
-

FreeStylaLT updated:

-
    -
  • Adds appropriate battle yells to sleeping carp
  • -
-

KasparoVy updated:

-
    -
  • Engineer boots that've had their toes cut open now have a sprite.
  • -
  • Vox now have engineer workboot sprites.
  • -
  • Removes unused SWAT boot sprites that were really just copypasted jackboot sprites.
  • -
-

Krausus updated:

-
    -
  • The late-join job listing is now big enough to show all the jobs at once, and organizes them into labeled categories.
  • -
  • Fixed Hotkey Help and hotkey mode toggle messages not appearing.
  • -
  • The late-join job listing will now ignore (mis)clicks for the first second after popping up.
  • -
-

Kyep updated:

-
    -
  • "Loyalty" implants are now known as "Mindshield" implants
  • -
  • Admins playing CC jobs can no longer get antag status from autotraitor.
  • -
-

Tastyfish updated:

-
    -
  • There's essentially a completely new space hotel map! Explorers rejoice!
  • -
-

TheDZD updated:

-
    -
  • Chance for vampires to burn in the chapel has been greatly reduced (from a 35% chance down to 8% per tick).
  • -
  • Vampires do not scream from chapel/space burning until they actually start catching fire.
  • -
  • Threshold for vampires to catch fire from space/chapel burning changed from 60 health to 50 health.
  • -
  • Fire stacks from vampire burning no longer apply twice 35% of the time while below the health threshold.
  • -
-

VampyrBytes updated:

-
    -
  • No more *me emoting from your corpse!
  • -
-

monster860 updated:

-
    -
  • Fixes ghosts having a generic icon when darkness is toggled off
  • -
-

tigercat2000 updated:

-
    -
  • There's a new tab in the character setup screen, "loadouts". This allows you to spawn with a limited number of preset items.
  • -
  • Character setup now uses #defines for the different tabs.
  • -
- -

28 June 2016

-

CrAzYPiLoT updated:

-
    -
  • Replaced the current recycler sound with a new one.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Adds workboots to be worn by engineers.
  • -
  • Fixes the scanner's search functionality.
  • -
-

FalseIncarnate updated:

-
    -
  • To save on adhesive costs, Nanotrasen has stopped gluing stools to the floor. The resulting bodily injuries probably won't cost more than the glue.
  • -
-

Fethas updated:

-
    -
  • you can now pick up potted plants and stealth
  • -
-

FlattestGuitar updated:

-
    -
  • changes some alcohol values, the weaker ones are no longer as weak
  • -
  • refactored alcohol, you can now take short breaks between sips and still pass out in a gentlemanly manner
  • -
  • different species have different levels of alcohol resistance, check in with your bartender for more information
  • -
  • The medical HUD will now be a bit smoother. Neat.
  • -
-

Fox McCloud updated:

-
    -
  • Warden starts off with a pair of Krav Maga Gloves
  • -
  • New Steal objective: steal the warden's krav maga gloves
  • -
  • Clonepods will automatically suck in nearby meat
  • -
  • Slime processors will automatically suck in nearby dead slimes
  • -
  • Actually fixes vamp chaplains
  • -
  • Fixes clumsy check on guns not working properly, resulting in people with glasses shooting themselves in the foot
  • -
  • pAI candidates can now see who requested them
  • -
-

KasparoVy updated:

-
    -
  • Adds Yi to Vox-pidgin syllables. (Port from VG.)
  • -
  • Adds framework for icon-based skin tones. (Port from VG.)
  • -
  • Adds Vox-compatibility for all remaining eyewear.
  • -
  • Raiders now get a random skin tone and eye colour on spawn.
  • -
  • Species default hair, facial hair and head-accessory colours can now be defined.
  • -
  • Newly created Vox mobs will spawn with the same hair colour as they used to have pre-greyscaling.
  • -
  • Noir vision will no longer grey out the HUD. (Port from VG.)
  • -
  • Tails will not be coloured if the person's species doesn't have skin colour.
  • -
  • Vox hair (head and facial) have been greyscaled and can now be customized by the full colour range.
  • -
  • IPC parts from the mech fabricator won't turn IPCs invisible upon attachment anymore.
  • -
-

Krausus updated:

-
    -
  • Added a custom runtime error handler.
  • -
  • Added an in-game runtime viewer.
  • -
-

Kyep updated:

-
    -
  • Admins now hear boink sound when faxed, command sends ERT request, etc
  • -
  • Admins can reply to faxes via radio
  • -
  • Admins can reply to faxes with pre-written fax templates
  • -
  • Admins can reply to faxes with 'evil faxes', special faxes that have negative effects on their intended recipient (and nobody else)
  • -
  • Admins can now join as "Nanotrasen Navy Officer", and "Special Operations Officer". They spawn on adminstation and ERT office, respectively. They are not announced and do not appear on crew manifest.
  • -
  • "Select equipment" verb outfits tweaked for consistency with the above job outfits
  • -
  • Teleporter on admin station now works.
  • -
  • Added antag-only warning to bee briefcase, to reduce chances of traitors killing themselves with it.
  • -
-

LittleBigKid2000 updated:

-
    -
  • Space explorer corgis can now safely explore space
  • -
-

Norgad updated:

-
    -
  • Maintenance around the incinerator has been expanded.
  • -
  • Engineering maintenance finally has an APC.
  • -
  • The incinerator has been moved eastward, there is now a construction area in it's previous location.
  • -
-

Tastyfish updated:

-
    -
  • Cryo tubes, sleepers, and body scanners now eject random items the occupant dropped, upon the occupant being ejected.
  • -
-

TheDZD updated:

-
    -
  • Adds an adminbuse gun that fires gun mimics, you can varedit the gun's `mimic_type` var to any gun path, and it'll fire that gun as mimics. By default it fires stetchkin pistol mimics.
  • -
  • Fixes minor issues caused by some guns having text paths for power cells.
  • -
  • Fixes some runtimes and inconsistencies with the telegun and temperature gun.
  • -
  • The Tesla engine has acquired a grudge for lockers, and will now smite any in its path.
  • -
  • Unstable bluespace teleportation devices have been removed from energy guns, meaning they should no longer teleport from one hand to another when switching firing modes.
  • -
-

Twinmold updated:

-
    -
  • You can once again resist borer control with the Resist verb.
  • -
-

VampyrBytes updated:

-
    -
  • Emotes can now be accessed through verbs as well as say *
  • -
  • Emotes accessed through say * no longer take parameters after a -
  • -
  • Emotes now take parameters through input boxes
  • -
  • Emotes now have support for blind and deaf characters
  • -
  • Emotes now personalise messages
  • -
  • Flip can now be targeted with or without a grab
  • -
  • All emotes that are affected by being muzzled now make the user make some kind of noise
  • -
  • monkeys now have access to all the emotes that the npc tries to perform
  • -
  • Leap genetics ability lets you jump over things
  • -
-

monster860 updated:

-
    -
  • UI now gets it's own plane
  • -
  • RnD console now uses NanoUI! Sweet!
  • -
  • Fixes tranquillite being outside the box in the materials list. Mimes are supposed to be trapped inside a box, not outside one.
  • -
  • Replaces the weird unicode "x" character in some design names with the actual letter "x" so that it doesn't fuck up NanoUI
  • -
  • RCD gets a UI
  • -
  • RCD-built airlocks can now receive different types and accesses.
  • -
  • You can now shift-click to examine as silicon, instead of ctrl-shift-clicking, which is something absolutely no one would guess.
  • -
  • Pulsing multiple doors' "open door" wires at the same time using a remote signaller now actually opens them at the same time.
  • -
  • Fixes wormhole projector not having an icon.
  • -
  • Wormhole projector has 0 failchance now.
  • -
  • Portals made by wormhole projectors can be removed via a multitool
  • -
  • Fixes ghost being able to request docking at trader ship consoles
  • -
-

tigercat2000 updated:

-
    -
  • Ported goon HTML chat from /vg/ / Goon
  • -
  • All uses of \black have been removed
  • -
  • All uses of \icon have been replaced with bicon()
  • -
-

tkdrg updated:

-
    -
  • Admins now have a verb to wipe all scripts from telecomms.
  • -
- -

19 June 2016

-

DaveTheHeadcrab updated:

-
    -
  • Defibs now must be used within 3 minutes of death.
  • -
  • Combat defibs now induce heart attack when you stun with them (Emagged defibs have a 10^ chance to do this)
  • -
-

Fox McCloud updated:

-
    -
  • Adds in the ability to make latex glove balloons (cable coil+latex glove)
  • -
  • Fixes latex gloves not having an in-hand icon for the left hand
  • -
  • Telephones will now ring when activated in-hand
  • -
  • Force on telephones removed
  • -
  • The break room privacy shutters now apply to all windows in the medical break room and not just the ones out front
  • -
  • His Grace grants massive stamina regeneration
  • -
  • pre-made styptic, silver sulfadiazine, and synth flesh patches now apply instantly
  • -
  • Styptic and Burn patches now have unique icons
  • -
  • Partially fixes graffiti so it's actually visible
  • -
-

FreeStylaLT updated:

-
    -
  • changed its to it's in lockbox description
  • -
  • changed \red to formatting
  • -
  • changed stetchkin's price from 9 TC to 4 TC, suppressor's from 3 TC to 1 TC
  • -
-

KasparoVy updated:

-
    -
  • Secure briefcase now has the same flags, hitsounds, attack verbs, throw speed and carrying capacity as a regular briefcase. Yes, it can hold paper bins now.
  • -
  • Dethralling a Shadowling thrall that has darksight activated clears their darksight.
  • -
-

LittleBigKid2000 updated:

-
    -
  • The vox raider's base is now filled with nitrogen instead of regular dusty air.
  • -
-

TheDZD updated:

-
    -
  • Teaches camera assemblies the meaning of the word "respect" (for NODROP items).
  • -
  • Sates the insatiable hunger that orange shoes once had for secborg cuffs.
  • -
  • Cryodorms will no longer kick you to lobby if you have logged off when they despawn your body, they will now always ghost you.
  • -
  • The defense values on the riot armor helmet is now identical to those on the riot armor suit.
  • -
  • Knight armor (including the chaplain's crusader armor) now has a slowdown of 1 instead of no slowdown.
  • -
-

Twinmold updated:

-
    -
  • Fixes being able to eat cybernetic implants so you cannot eat them/force feed them to people.
  • -
  • Lowers the range of Malfunction from 4 tiles to 2 tiles, due to ability to insta-kill IPCs/incapacitate those with mechanical hearts.
  • -
  • Lowers amount of confusion given from Revenants from 50 to 20 per Defile.
  • -
  • Sets a maximum confused amount from the Revenant's Defile ability (now 30).
  • -
  • Makes Syndicate Bombs show a more accurate time remaining until detonation.
  • -
-

monster860 updated:

-
    -
  • Makes stock parts build 5x faster
  • -
  • Adds a last-second loop-back sort pipe so that items with a mail tag don't end up on the disposals conveyer, and get flushed right back around. This enables an item to be sent from anywhere on the station to anywhere else on the station without going through the disposals conveyer.
  • -
  • Fixes a bug where drones can get stuck if they have their destination set to the RD office. This also fixes the bug where attempting to send a package from the test lab always ends up in the RD office.
  • -
-

tkdrg, Delimusca, Aranclanos, TheDZD updated:

-
    -
  • Gun mimics (including wand, staff, projectile guns, and energy guns) created by the staff of animation will shoot things.
  • -
  • Mimics created by the staff of animation now have googly eyes.
  • -
  • Fixes the disturbing lack of death caused by wand of death projectiles.
  • -
- -

12 June 2016

-

CrAzYPiLoT updated:

-
    -
  • Fixed the long-lasting bug of handcuffed people keeping their chainsaws.
  • -
-

Crazylemon64 updated:

-
    -
  • No more language message-spam on roundstart
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Adds a new icon for the detective's scanner.
  • -
  • Detectives scanner now has access to DNA and fingerprint records.
  • -
-

Fox McCloud updated:

-
    -
  • Adds three new chaplain weapons: pirate saber, multiverse sword, and possessed/talking sword
  • -
  • Fixes not being able to sheath the claymore in the Crusader Armor
  • -
  • Adds in a mocha drink
  • -
  • Fixes ice being unobtainable for the jobs that use it most
  • -
  • Fixes laser armor losing its reflecting ability
  • -
  • Fixes the lack of progress bars for more stack-based construction
  • -
  • Fixes Experimentor producing coffee machines instead of cups
  • -
  • Can deconvert mindslaves by removing their mindslave implant
  • -
  • Can deconvert Vampire thralls by feeding them holy water
  • -
  • Fixes mindslaves not having a HUD for the master and mindslave
  • -
  • Fixes being able to duplicate just about anything in the Experimentor
  • -
  • Fixes not being able to use tank transfer valves or one tank bombs in the Experimentor.
  • -
  • Fixes infinite-throw spam
  • -
  • Fixes being able to resist out of grabs by moving (that is to say, it'll actually work now)
  • -
  • Fixes passive grabs using the wrong HUD icon
  • -
  • Tabling duration reduced from 5 to 2
  • -
  • Can no longer wield double-bladed energy swords as a hulk
  • -
  • Fixes on map stools having the wrong offsets, making it look like you're not sitting on them
  • -
-

FreeStylaLT updated:

-
    -
  • Added (Enabled) Mind Batterer for Traitors
  • -
  • Fixed uplink implant description (Said 5 when actually gave you 10 TCs)
  • -
-

Glorken updated:

-
    -
  • Shifts Zeng-Hu left leg over in order to regain thigh gap.
  • -
  • Chops off a pixel on Bishop feet so that they fit into shoes.
  • -
-

KasparoVy updated:

-
    -
  • Old placeholder IPC butt sprite replaced with the finished QR-code sprite.
  • -
-

Krausus updated:

-
    -
  • Fixes ghosts failing to follow mobs that move in unusual ways
  • -
  • Fixed tape allowing mobs with sufficient access to move through solid objects.
  • -

Many -tg-station Coders, TheDZD updated:

  • Old gun code is now gone.
  • @@ -1416,380 +305,40 @@
  • Power gloves now have special examine text when examined by an antagonist.
  • Proto SMGs now only have a 21 shot clip.
-

Spacemanspark updated:

+

MarsM0nd updated:

    -
  • Adds the ability to make a more irritated buzz noise at people as a synthetic. The original buzz is still there.
  • +
  • Embeded object removal is now done with hemostat again
  • +
  • Borgs are able to do embeded object surgery
-

Tauka Usanake updated:

+

Meisaka updated:

    -
  • Adds more belt icon overlays
  • -
-

Twinmold updated:

-
    -
  • Nar'Sie AI Hologram and Error Sprite
  • -
  • Fixes space pod equipment variable. Can now properly install/uninstall equipment.
  • -
  • Check Seat verb no longer pulls out installed equipment.
  • -
  • You can now have a passenger in your pod if you have a passenger seat.
  • -
-

monster860 updated:

-
    -
  • Adds comical implant. It is an implant that causes you to have a comic sans voice. It can be made in the protolathe using bananium.
  • -
  • The comical implant now spawns by default inside IPC clowns
  • -
  • Fixes the window getting stuck when you try to drag or resize a NanoUI window too fast with Fancy NanoUI enabled
  • -
  • Fixes a small quirk with the resize handle.
  • -
  • Fix javascript error in cargo UI
  • -
-

pinatacolada updated:

-
    -
  • removes atmos tech SOP from supply SOP
  • -
  • Fixes defibing people without a heart
  • -
  • Fixes defib saying it didn't work stopping a heart attack when they do
  • -
- -

02 June 2016

-

CrAzYPiLoT updated:

-
    -
  • Fixed a text problem in virtual gameboard description.
  • -
  • Made gameboards deconstructable and movable.
  • -
  • Added a light to gameboards. Pretty!
  • -
-

Crazylemon64 updated:

-
    -
  • There will no longer be a mountain of startup runtimes when people have custom languages.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Removes xenobio golem rune creation sound
  • -
  • Added overlays for sec belts that reflect the items stored therein.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes Chapel and Chaplain's office not having a light switch
  • -
  • Fixes mass driver only being usable once due to weird pressure
  • -
  • Fixes chapel being overly dark near coffins
  • -
  • Fixes not being able to sheath the claymore in the Crusader Armor
  • -
-

IK3I updated:

-
    -
  • crate cargo system
  • -
  • passenger seat system
  • -
  • loot box secondary cargo system (install it and your pod has a standard inventory)
  • -
  • lock busters for the CE and Armory
  • -
  • incappacitated people can't operate the door controls anymore
  • -
  • Items dropped in a pod can now be scrounged up
  • -
  • security can rip you out of an unlocked pod
  • -
  • The pod code isn't full of tumors any more
  • -
-

Tastyfish updated:

-
    -
  • Holsters now have an action button while on your suit again.
  • -
-

monster860 updated:

-
    -
  • Adds the following words to the AI announcer: active, airlock, alcohol, arrival, arrivals, becoming, between, blob, briefing, camp, chair, chapel, closet, cyberiad, declared, detective, diona, dock, docked, docking, docks, drask, drunk, emag, equipment, evacuation, experimentor, gateway, hail, hallway, holoparasite, honk, hull, ian, imminent, interested, intruders, kida, kidan, labor, library, mime, mimes, miner, miners, mining, n2o, nuke, office, op, operational, ops, pod, pods, poly, pun, renault, representative, runtime, scrubbers, sequencer, skree, skrek, skrell, space, spider, spiders, still, stupid, swarmer, swarmers, sword, technology, teleport, teleported, teleporter, teleporting, tesla, tool, unathi, vacant, vault, vents, vulpkanin, weld, window, windows, yet
  • -
- -

31 May 2016

-

CrAzYPiLoT updated:

-
    -
  • Fixes potential exploits involving door remotes.
  • -
  • Adds another type of remote door control.
  • -
-

Fox McCloud updated:

-
    -
  • Allows Chaplain to select a wide new range of null rod customizations
  • -
  • Slightly increases null rod damage (15->18)
  • -
  • Fixes abductors speaking other languages
  • -
  • Fixes traitors getting less TC on some game modes
  • -
-

QuinnAggeler updated:

-
    -
  • All lazarus revived mobs become valid for pet collaring
  • -
-

Tastyfish updated:

-
    -
  • Adds a suicide for light tubes.
  • -
  • Progress bars, buttons, and several of the values in UI's are now animated.
  • -
  • Deconstructing glass tables now gives a stack of 2 sheets of glass.
  • -
-

monster860 updated:

-
    -
  • Upgrading the experimentor will no longer reduce the chance of upgrading an item's tech
  • -
  • Guest passes can now be attached to an ID card.
  • -
  • Adds a HoP guest pass computer, which is like a normal guest pass computer, but using an ID with ID computer access will allow it to issue guest passes with any access.
  • -
  • Adds the HoP guest pass computer to the HoP office.
  • -
  • Moves the guest pass computer in robotics to RnD.
  • -
- -

25 May 2016

-

CrAzYPiLoT updated:

-
    -
  • Adds an unread change notification.
  • -
-

Fox McCloud updated:

-
    -
  • Removes Dragon's Breath Recipe
  • -
  • Removes Ghost Chilli Juice
  • -
  • Fixes buckled flipping over someone
  • -
-

IK3I updated:

-
    -
  • Sleepers, scanners, and borg chargers no longer remove you from existence when destroyed
  • -
  • Hostile mobs are no longer fooled by your clever scanner and recharger tricks
  • -
- -

24 May 2016

-

CrAzYPiLoT updated:

-
    -
  • Adds the ability to attach signalers to bear traps. Stealthy hunting!
  • -
-

Crazylemon64 updated:

-
    -
  • You can now fasten the circulators in the TEG kit with a wrench - no adminbus needed to set it up, now
  • -
  • You can now rename cassette tapes with a pen.
  • -
  • You can now wipe data from a tape from its right-click menu.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds 4 new types of fudge for the chef to make: Peanut, Chocolate Cherry, Cookies 'n' Cream, and Turtle Fudge.
  • -
  • Normal fudge recipe now uses milk instead of cream.
  • -
  • Mutant/Modified/Enhanced plants will no longer infinitely increase their name length, and instead will be simply "mutant", "modified", or "enhanced" plant as determined by the last type of modification they were subject to.
  • -
  • Bees can no longer phase through hydroponics lids, giving botanists a way to finally stem the tide of pollination.
  • -
  • Premade beeboxes now spawn with the right type of bees, specifically of the worker caste.
  • -
-

Fox McCloud updated:

-
    -
  • Donk pockets have more omnizine, but only upon fully consuming the donk pocket
  • -
  • swarmers will drop an artificial bluespace crystal on death
  • -
  • Orion Trail guards now drop an energy shield and C20R on death
  • -
  • Reviving simple animals with strange reagent will prevent them from dropping any further loot
  • -
-

KasparoVy updated:

-
    -
  • Rejuvenating a mob now unbuckles them correctly (if they're buckled to something).
  • -
  • Rejuvenating a mob will no longer remove their hair.
  • -
  • Rejuvenating a mob will no longer permanently blacken their eyes.
  • -
  • Rejuvenating a mob will no longer remove their prostheses with fleshy limbs, it will just fix the prostheses.
  • -
  • Rejuvenating a mob will not remove organs/limbs belonging to other species if said organs/limbs are in the same place(s) as the mob's default organs/limbs would be.
  • -
  • Fixes a runtime when trying to flip with an object other than a grab in your hand.
  • -
  • Doing a 'cybernetic repair' procedure on the head of a disfigured IPC will re-figure them.
  • -
  • Rejuvenating a mob will only regrow organs/limbs that are missing (by comparison to the standard organs for their species).
  • -
  • The regenerate_icons proc will now update skin tone and body accessories properly.
  • -
  • Organ rejuvenation now clears disfigurement and closes open wounds.
  • -
  • Rejuvenating a mob will end all in-progress surgeries.
  • -
  • Vox get their cortical stacks back, since the non-implant ones don't interfere with the Heist game-mode.
  • -
  • Rejuvenating a long-dead or husked mob will now clear the appropriate mutations.
  • -
-

QuinnAggeler updated:

-
    -
  • Species disguise variable for clothing items
  • -
  • Species disguise string, "High-tech robot," for cardborg suit and helmet
  • -
  • ABSTRACT flagged clothing items will not be displayed on examination
  • -
-

Tastyfish updated:

-
    -
  • Removes n2 pills healing vox oxyloss, and o2 pills poisoning vox.
  • -
-

monster860 updated:

-
    -
  • Adds the floor painter. Sprite by FlattestGuitar
  • -
- -

20 May 2016

-

Fox McCloud updated:

-
    -
  • Fixes Chaplains being able to be vampires
  • -
  • Cryopods will now always display the occupant's name
  • -
-

KasparoVy updated:

-
    -
  • Fixes a runtime with Dioneae by repathing their limbs.
  • -
-

QuinnAggeler updated:

-
    -
  • Makes dehydrated space carp description more accurate and informative
  • -
-

monster860 updated:

-
    -
  • Adds the permanent teleporter. Use the circuitboard on a teleporter hub to set the target before constructing it.
  • -
- -

17 May 2016

-

AugRob updated:

-
    -
  • Add screwdriver sound when opening/closing panels on airlocks
  • -
-

Fox MCCloud updated:

-
    -
  • Removes "harm" traitor objective
  • -
  • Increases non-escape/hijack/die objectives from 1 to 2
  • -
  • Tweaks available objectives to traitors a bit
  • -
-

Fox McCloud updated:

-
    -
  • Players can no longer see how many players have readied up or who has readied up
  • -
  • Hulks, Shadowlings, and Golems can no longer use laserpointers
  • -
  • Adds in the ability to flip over someone with *flip
  • -
  • Fixes and improves foam to better interact with reagents
  • -
-

KasparoVy updated:

-
    -
  • Refactors hair so it's on the head (organ).
  • -
  • Adjusts some Vox hair style names so they're consistent with all others.
  • -
  • Refactors Morph and the order by which options are presented.
  • -
  • Players with heads of a different species than the body will now only be able to access the head accessories, hair/facial hair styles of the head's species.
  • -
  • Fixes some typos.
  • -
  • Fixes a bug where hairgrownium made you bald and super hairgrownium only changed the hair/facial hair styles of Humans.
  • -
  • Fixes a bug where Morph wouldn't correctly set eye colour or skin tone.
  • -
  • Fixes a typo that didn't really have any negative effect on the beard organ to begin with.
  • -
  • Fixes bugs where Alopecia and Facial Hypertrichosis disease symptoms wouldn't update player sprite correctly.
  • -
  • Adds a new Vox hairstyle.
  • -
  • You can now change your head accessory (and its colour), body markings (and their colour), and body accessory if you're a species that has such things via the Morph genetic power and C.M.A. (the bathroom SalonPro Nano-Mirrors and admin verbs).
  • -
-

monster860 updated:

-
    -
  • Fixes sleep() in telecomms
  • -
  • Windows can now be constructed and deconstructed using RCD's.
  • -
- -

10 May 2016

-

Crazylemon64 updated:

-
    -
  • Ragin' Mage creation works correctly again.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds a Briefcase Full of Bees as a Botanist-only traitor item (10 TC)
  • -
  • Fixes worker bees having an insatiable desire to murder bots. (Syndi-bees still murder them though)
  • -
-

FlattestGuitar updated:

-
    -
  • Robots now slur and stutter robotically
  • -
  • Adds tape gags. Click on someone with a roll of tape to shut them up!
  • -
-

Fox McCloud updated:

-
    -
  • Removes material efficiency upgrades from the mech fab and protolathe
  • -
  • Ore redemption machine sheets/points per ore scaled from 1 up to 2 (down from 1 up to 4)
  • -
  • Fixes materials exploit duplication
  • -
  • Fixes the protolathe locking up under some circumstances
  • -
  • Updates the laser cannon to be range based: the further its projectile travels, the more damage it does. Base damage greatly reduced.
  • -
  • removes fungus from mushrooms
  • -
  • adds fungus to "mold" plant
  • -
  • adds mold seeds to hydro vendor
  • -
  • bumps up ???? reagent from 1 to 5 on bad recipes
  • -
  • Adds in 3 disease: Grave Fever, Space Kuru, and Non-contagious GBS
  • -
  • Adds Reagent to cause Space Kuru and Non-contagious GBS to traitor poison bottles
  • -
  • Initropidril now has a recipe
  • -
  • Adds a number of new reagents
  • -
  • Brain burgers now contain prions instead of mannitol
  • -
  • Scientists and chemists can no longer purchase traitor poison bottles
  • -
  • random drug bottles now have a much wider range of reagents in them
  • -
  • Fixes UI On slot machine saying it costs 5 credits when it's 10
  • -
  • Fixes abductors having tails
  • -
  • Fixes traitor scissors having a different hair-cutting sound
  • -
  • Fixes simple animals not dying right away when they reach zero health
  • -
  • Fixes a few farm animals, simple xenos, and a hivebot from having incorrect health
  • -
  • Buffed health pack usage on simple animals (should heal roughly 20 damage on them, per use)
  • -
  • Emotes no longer need to be purely lowercase to work
  • -
  • Chaplain can now select a green book as his Bible
  • -
  • Adds in His Grace, a hijack-only traitor item for the Chaplain
  • -
-

IK3I updated:

-
    -
  • Added key and tumbler based pod locks
  • -
  • Made Pod Locks and keys buildable in Pod Fabricator
  • -
  • Made Pod Keys recoverable from cryo
  • -
  • Added lock to Security Pod
  • -
  • Added a key for Security Pod to HoS and Pod Pilot Offices
  • -
  • New sprites for several pieces of pod equipment
  • -
  • Using a multitool on a decalock now gives usable info
  • +
  • law manager no longer freaks out with Malf law

NTSAM updated:

    -
  • Fixes the stuttery rainbow screen for IPCs.
  • -
  • Fixes the green IPC screen.
  • -
-

QuinnAggeler updated:

-
    -
  • Adds a sound emote for the Drask
  • -
  • Gives Drask the ability to eat soap
  • -
  • Adds a racial flag for the Drask
  • -
  • Makes syndicate, paramedic, clown, and EVA helmets display correctly on Drask
  • -
-

tigercat2000 updated:

-
    -
  • The station blueprints can now show you where wires/pipes/disposal pipes are supposed to go.
  • -
- -

04 May 2016

-

CrAzYPiLoT updated:

-
    -
  • Adds gameboards to bar and permabrig.
  • -
-

Crazylemon64 updated:

-
    -
  • AIs are no longer created for temporary messages.
  • -
-

Fethas updated:

-
    -
  • Sniper Rifles for nuke ops.
  • -
  • you can now actually shove heads on spears again.
  • -
  • Before i removed the traitor chemist item i cleaned up the harm reaction code paths.
  • -
-

FlattestGuitar updated:

-
    -
  • cheap lighters only damage your hand if you fail to properly use such a complicated contraption, not the whole body
  • -
  • ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with style/
  • -
-

Fox McCloud updated:

-
    -
  • Slime batteries now self-recharge.
  • -
  • Adds in door wands--control doors from range
  • -
  • Each head of staff (and the QM) starts off with a door wand to control the doors in their respective departments
  • -
  • Fixes nutrition alert icon kicking in too early
  • -
  • Adds in a new hairstyle
  • -
  • Fixes cig icons not updating under some circumstances
  • -
  • Updates the Tesla; it will now have to be "fed" or it can run out of energy; the rate at which it gains additional energy balls and power has been greatly lowered.
  • -
  • energy ball will now be drawn towards the singularity beacon
  • -
  • fuel tank explosions a bit stronger and will arc tesla blasts further
  • -
  • Tweaked some game mode population requirements to enhance general game mode balance and player experience.
  • -
  • Reworks overdosing to have more unique effects and also scale, in part, on volume
  • -
  • Epinephrine, Atropine, and Ephedrine have a lower OD threshold
  • -
  • Saline penetrates the skin
  • -
  • Synaptizine and Teporone now have OD threshold
  • -
  • Adds in berserker disease (treat with haloperidol)
  • -
  • Adds in Jenkem, a nasty gross drug made with toilet water
  • -
  • Adds in food poisoning; get it from eating poorly made food, from salmonella, or fungus
  • -
  • Adds in the Shock Revolver, a replacement for the stun revolver remove: removes the stun revolver remove: removes the prototype SMG+ammo from the protolathe
  • -
-

IK3I updated:

-
    -
  • Can no longer holster items with No-Drop active.
  • -
  • Saves prosthesis users from Tox-Comp's wrath
  • -
-

KasparoVy updated:

-
    -
  • Disembodied prosthetic heads that aren't monitors won't make you go bald when they're re-attached.
  • -
  • 'Optic' markings will disappear when your head gets removed, and reappear if it gets re-attached.
  • -
  • Disembodied prosthetic heads that aren't monitors will now be rendered with hair & facial hair.
  • -
  • Disembodied prosthetic heads with optical markings (markings with the head set as the origin) will be rendered with those markings.
  • -
  • Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new antennae) will now be animated properly.
  • -
  • 3 more antennae.
  • -
  • An alt. and monitor head model for every prosthetic brand but Zeng-hu. Morpheus only gets an alt model, not another monitor.
  • -
  • Animated optical markings to fit the new alt. heads.
  • -
  • Screen styles for the alt. Hesphiastos head.
  • -
  • Companies that make prosthetic body parts can (and do) now offer separate models for qualified recipients.
  • -
  • Removed the frames from screen styles in order to allow the same styles to be applied to all monitor heads.
  • -
-

LittleBigKid2000 updated:

-
    -
  • Booze dispensers can now dispense synthanol
  • +
  • Added a rainbow IPC screen.

Norgad updated:

  • Adds a disposals chute to the Mechanic's Workshop
+

PPI updated:

+
    +
  • Modifies the effective time limit to activate the Nuclear Challenge as Nukeops from two minutes to seven minutes
  • +
+

Pinatacolada updated:

+
    +
  • Makes the swedish gene spit out weird swedish chars and sounds
  • +
+

ProperPants updated:

+
    +
  • Maint drones have magboots.
  • +
  • Removed plastic from maint drones. Literally useless for station maintenance.
  • +
  • Increased starting amounts of some materials for maint drones and engi borgs.
  • +
  • Reduced the number of lines taken by Engineering cyborgs calling on materials stacks.
  • +
  • Operating tables can be deconstructed with a wrench.
  • +
  • Fixed and shortened description of metal sheets.
  • +

QuinnAggeler updated:

  • Adds the Drask as a 30KP race
  • @@ -1800,938 +349,6 @@
  • Adds a reason to make bad ice puns
  • Adds a check for brain death (brain damage of 120 or more) to the proc responsible for reviving IPCs
-

pinatacolada updated:

-
    -
  • Makes fridge boards be selectable by screwdriving them
  • -
  • Virology fridge now accepts syringes, beakers, and bottles
  • -
  • Plasmamen security now spawn with their suit slot items in their bags
  • -
  • Pod pilots spawn with taser in the suit slot
  • -
  • removes armor from plasmamen magistrate suits
  • -
- -

25 April 2016

-

CrAzYPiLoT updated:

-
    -
  • Adds buildable holographic gameboards that, when opened, produce a fully-functional JavaScript chess interface, which includes a chess AI. If you win, it will produce 80 tickets for your spending!
  • -
-

FlattestGuitar updated:

-
    -
  • a human's species is now visible on examination
  • -
-

Fox McCloud updated:

-
    -
  • Improves attack animations with items, making it more clear who's attacking you and with what
  • -
  • Updates Revolution game mode so it better scales with total player population
  • -
  • Head revs start off with a flash, spraycan, and chameleon security HUD
  • -
  • Add chameleon security hud, which is basically sec shades with the ability to disguise as a number of regular glasses
  • -
  • Updates mining loot crates to feature far more actual loot
  • -
  • Mining loot crates are now opened by inputting a 4 digit password and have 10 tries to guess the password string
  • -
  • Fixes bees, mech syringes, and darts not properly calling INGEST for a reagent
  • -
-

Meisaka updated:

-
    -
  • The light on/off function for drones works again, toggling between lowest setting and off.
  • -
  • Guardians can toggle their lights off and on again.
  • -
  • AI, pAI, robots and drones can now use *yes emote without extra ss on the end.
  • -
  • emote *help for silicons updated/added.
  • -
  • *twitch_s emote changed to *twitches, incorrect variations of some emotes can no longer be used.
  • -
-

tigercat2000 updated:

-
    -
  • Added 4 new HUD styles, "Operative", "Plasmafire", "Retro", and "Slimecore"
  • -
  • You can now view HUD changes in real-time, by going to Preferences (top right tab) > Game Preferences and changing the HUD style (limited to humans).
  • -
  • There are now three HUD styles you can get via the f12 button- Full, which contains all of your buttons, Minimal, which only contains a few essential buttons, and None, which is a completely blank screen.
  • -
  • Removed the remaining aiming code due to maintainability issues and incompatibility with HUD styles.
  • -
  • Mobs with HUD's now use a unique subtype instead of an anti-OOP else-if chain.
  • -
  • Refactored how objects (IE, stuff you pick up) is rendered to the HUD. This should fix the reoccuring "stuff on my screen that definately isn't meant to be there" bug, but keep an eye out for things that do not appear.
  • -
- -

20 April 2016

-

Crazylemon64 updated:

-
    -
  • Bureaucracy crates now contain granted and denied stamps.
  • -
-

FalseIncarnate updated:

-
    -
  • Anomalies will now be properly neutralized by signals that match their code and frequency, instead of using the default frequency and their code.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds shot glasses.
  • -
-

Fox McCloud updated:

-
    -
  • Removes the ability to put a pAI into securitrons and ED-209's
  • -
  • Drinking glasses now have an in-hand sprite
  • -
  • DNA injectors no longer have a delay when used on yourself
  • -
  • DNA injectors no longer delete on use, but become used, much like auto-injectors
  • -
  • Fixes a bug where you can exploit the genetic scanner to get multiple injectors
  • -
  • Fixes not being able to cancel creating an DNA injector
  • -
  • remove spacesuits causing injections to the head to take longer
  • -
  • FIxes heat resist mutation not making you immune to high pressure, fire, or high temperatures
  • -
  • removes some not-well-known damage resists from cold/heat mutations
  • -
  • Re-maps botany a bit to make it more bee and botanist friendly
  • -
  • Adds in Abductors Game Mode
  • -
-

MarsM0nd updated:

-
    -
  • Embeded object removal is now done with hemostat again
  • -
  • Borgs are able to do embeded object surgery
  • -
-

Tastyfish updated:

-
    -
  • Makes the server startup substantially faster.
  • -
-

monster860 updated:

-
    -
  • Crowbarring open a spesspod doors is no longer broken
  • -
-

tigercat2000 updated:

-
    -
  • -tg- thrown alerts have been added. This means you get an alert when buckled or handcuffed or many many other things happen to you. It then gives you a tool tip when you hover over it, and it may or may not do something when you click it. Have fun!
  • -
- -

14 April 2016

-

Aurorablade updated:

-
    -
  • Removes the !!FUN!! of having headslugs gold core spawnable.
  • -
-

Fox McCloud updated:

-
    -
  • Added in sounds (instead of a chat-based message) for when airlocks are bolted/unbolted
  • -
  • Added in sound for when airlocks deny access
  • -
  • cutting/pulsing wires will play a sound
  • -
  • ups nuke ops game mode population requirement from 20 to 30
  • -
  • Adds in mining drone upgrade modules to increase their health, combat capability, or reduce their ranged cooldowns
  • -
  • Adds in mining drone "AI upgrade" a sentience potion that only works on mining bots
  • -
  • Mining bots should be less likely to shoot you when attacking hostile mobs
  • -
  • Killer tomatoes actually live up to their name now and are hostile mobs
  • -
  • Killer tomatoes are an actual fruit now; activate it in your hands to make them into a mob
  • -
  • Killer tomatoes are directly mutated from regular tomatoes instead of blood tomatoes
  • -
  • Increased the yield of regular tomatoes by 1
  • -
  • Tweak some stats on the killer tomato seeds
  • -
  • Fixes the blind player preference not doing anything
  • -
  • Adds portaseeder to R&D
  • -
  • Scythes will conduct electricity now
  • -
  • Mini hoes play a slice sound instead of bludgeon sound
  • -
  • Plant analyzer properly has a description and origin tech
  • -
  • Can have hulk+dwarf mutations together
  • -
  • Can have heat+cold resist together
  • -
  • Can only remotely view people who also have remote view
  • -
  • Fixes cold mutation not having an overlay
  • -
  • Hallucinations will no longer tick down twice as fast as they should nor will they spawn twice as many hallucinations as they should
  • -
  • Incendiary mitochondria no longer asks who you want to cast it on (it always is meant to be cast on yourself)
  • -
  • Fixes permanent nearsightedness even when wearing prescription glasses
  • -
-

KasparoVy updated:

-
    -
  • Head accessories now behave like facial hair: They will no longer be hidden by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).
  • -
  • Wearing a piece of clothing that blocks head hair will no longer make head accessories (facial markings/horns/antennae) invisible until an icon update is triggered while the headwear is off.
  • -
-

Meisaka updated:

-
    -
  • law manager no longer freaks out with Malf law
  • -
-

Tastyfish updated:

-
    -
  • The /vg/ library computer interface has been ported, giving a much better use experience.
  • -
  • Books can now be flagged for inappropriate content.
  • -
-

TheDZD updated:

-
    -
  • Removes shitty Caelcode bees.
  • -
  • Hydroponics can now manage bee colonies, bees produce honeycombs that can be ground to obtain honey, a decent nutriment+healing chemical
  • -
  • Hydroponics can inject a queen bee with a syringe of a reagent to alter her DNA to match that reagent, meaning all honeycombs produced will contain that reagent in small amounts
  • -
  • Bees with reagents will attack with that reagent. It takes 5u of a reagent to give a bee that reagent.
  • -
  • Added the ability to make Apiaries and Honey frames with wood
  • -
  • Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey
  • -
  • Added the ability to make more Queen Bees from Royal Bee Jelly by using it on an existing Queen, to split her into two Queens
  • -
  • Removes some snowflakey mob behavior from bears, snakes and panthers.
  • -
  • Hudson is feeling punny.
  • -
  • Hostile mob AI should now be a bit more cost-efficient.
  • -
-

monster860 updated:

-
    -
  • Adds area editing, link mode, and fill mode to the buildmode tool
  • -
- -

12 April 2016

-

FalseIncarnate updated:

-
    -
  • Adjusting the setting of a vendor circuit board is no longer random, but instead provides a select-able list.
  • -
  • Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, acid requirement replaced by metal.
  • -
  • Burnt matches can no longer light cigarettes, pipes, or joints.
  • -
-

Fethas updated:

-
    -
  • Nukes the cargo train code rscadd:Adds simple vehicle framework and converts secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and secway onto metastation (but not ambulance no pareamedic garage, no i am not mapping that)
  • -
  • You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully surgery on diona works right
  • -
-

Fox McCloud updated:

-
    -
  • Adds in TraitorVamp; game mode that's essentially like TraitorChan, but with a Vampire instead of a Changeling
  • -
  • Vampires cannot use holoparasites
  • -
  • Malf AI will automatically lose if it exits the station z-level
  • -
-

Tastyfish updated:

-
    -
  • All cats can kill mice now.
  • -
  • E-N can't suffocate.
  • -
  • Startup time is now shorter.
  • -
  • Removed the Station Collision away mission from rotation, due to multiple conceptual and technical issues.
  • -
- -

07 April 2016

-

Crazylemon64 updated:

-
    -
  • Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms.
  • -
  • Mulebots will now send announcements to relevant requests consoles on delivery again.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds logic gates, for doing illogical things in a logical manner.
  • -
  • Adds buildable light switches, for all your light toggling needs.
  • -
  • Fixes a resource duplication bug with mass driver buttons.
  • -
-

Fethas updated:

-
    -
  • maybe makes them last longer...maybe..and fixes the event end message
  • -
-

Fox McCloud updated:

-
    -
  • Maps in the slime management console to Xenobio
  • -
  • Reduces Xenobio monkey box count from 4 to 2
  • -
  • Fixes weakeyes having a negligible impact
  • -
  • Can spawn friendly animals with a new gold core reaction by injection with water
  • -
  • Hostile animal spawn increased from 3 to 5 for hostile gold cores
  • -
  • Swarmers, revenants, and morphs no longer gold core spawnable
  • -
  • Fixes invisible animal spawns from gold core/life reactions
  • -
  • Adds tape to the ArtVend
  • -
  • Can no longer use sentience potions on bots
  • -
  • Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs.
  • -
  • Slimecore reactions now require plasma dust as opposed to dispenser plasma
  • -
  • Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits.
  • -
  • Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler
  • -
  • Epinephrine/plasma reagents changing mutation rate has been removed
  • -
  • Mutation chance is inherited from slime generation to slime generation as opposed to being purely random.
  • -
  • New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance.
  • -
  • Slime glycerol reaction removed
  • -
  • Slime cells are now high capacity cells (more power than before)
  • -
  • extract enhancer increases the slime core usage by 1 as oppose to setting it to three
  • -
  • slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3
  • -
  • Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly
  • -
  • Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox
  • -
  • Processors no longer produce 1 more slime core than intended
  • -
  • Less blank/spriteless/empty foods from the silver core reaction
  • -
  • Virology mix reactions now use plasma dust as opposed to plasma
  • -
  • Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded
  • -
  • statues are invincible to anything other than full out gibbing.
  • -
  • Statues flicker lights spell range increased
  • -
  • Blind spell no longer impacts silicons
  • -
  • Fixes statues being able to attack/move whenever they feel like it, regardless of client statues
  • -
  • Fixes blind spell impacting the statue
  • -
-

Tastyfish updated:

-
    -
  • Beepsky is no longer a pokemon.
  • -
  • pAI-controlled Bots now reliably speak human-understandable languages over the radio.
  • -
  • More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)
  • -
-

tigercat2000 updated:

-
    -
  • Items in your off hand will now count towards access.
  • -
- -

02 April 2016

-

Crazylemon64 updated:

-
    -
  • Metal foam walls will now produce flooring on space tiles
  • -
  • Syringes will now draw water from slime people.
  • -
-

FalseIncarnate updated:

-
    -
  • Let's you know when your container is full when filling from sinks.
  • -
  • Prevents splashing containers onto beakers and buckets that have a lid on them.
  • -
  • Pill bottles can now be labeled with a simple pen.
  • -
  • Beakers/buckets (and pill bottles) now accept 26 character labels from pens.
  • -
-

Fethas updated:

-
    -
  • Various spells have had a tweak to stun/reveal/cast, some other number stuff...
  • -
  • Nightvision
  • -
  • harvest code is now in the abilites file.
  • -
  • New fluff objectives
  • -
  • Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!
  • -
-

FlattestGuitar updated:

-
    -
  • Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer.
  • -
-

Fox McCloud updated:

-
    -
  • Adds in the Lusty Xenomorph Maid Mob; currently admin only.
  • -
  • Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect name
  • -
  • removes xenomorph egg from hotel
  • -
  • upgrades are no longer needed to for the available toys in the prize vendor
  • -
  • Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible.
  • -
  • Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now).
  • -
  • Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color
  • -
  • Adds disease1 outbreak event
  • -
  • Adds appendecitis event
  • -
  • Roburgers now properly have nanomachines in them
  • -
  • Re-adds nanomachines
  • -
  • Experimentor properly generates nanomachines instead of itching powder
  • -
  • Fixes big roburgers having a healing reagent in them
  • -
  • Adds nanomachines to poison traitor bottles
  • -
  • Tajarans can now eat mice, chicks, parrots, and tribbles
  • -
  • Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles
  • -
  • fixes spawned changeling headcrab behavior
  • -
-

KasparoVy updated:

-
    -
  • Incisions made at the beginning of embedded object removal surgery can now be closed in the same procedure.
  • -
-

ProperPants updated:

-
    -
  • Maint drones have magboots.
  • -
  • Removed plastic from maint drones. Literally useless for station maintenance.
  • -
  • Increased starting amounts of some materials for maint drones and engi borgs.
  • -
  • Reduced the number of lines taken by Engineering cyborgs calling on materials stacks.
  • -
  • Operating tables can be deconstructed with a wrench.
  • -
  • Fixed and shortened description of metal sheets.
  • -
-

Tastyfish updated:

-
    -
  • Bots can now be controlled by players, by opening them up and inserting a pAI. *beep
  • -
  • MULEbots can now access the engineering destination.
  • -
  • All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps.
  • -
  • Diagnostic HUD's now give health and status information about bots.
  • -
  • MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate.
  • -
  • Bots should (hopefully) lag the game less now.
  • -
  • Beepsky contains 30% more potato.
  • -
  • Action progress bars are now smooth.
  • -
  • Clicking a filled inventory slot's square with an open hand now clicks the item in the slot.
  • -
  • Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening.
  • -
  • Shuttle ETA countdowns on status displays are now amber.
  • -
  • pAI's can now use the PDA chatrooms.
  • -
  • Adds treadmills to brig cells, to give the prisoners something productive to do.
  • -
-

TheDZD updated:

-
    -
  • A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced.
  • -
  • Removes that fucking facehugger from station collision.
  • -
-

tigercat2000 updated:

-
    -
  • Virus2 has been removed.
  • -
  • Virus1 is back. Viva la revolution.
  • -
  • You can now have up to 20 characters.
  • -
- -

26 March 2016

-

Fox McCloud updated:

-
    -
  • Adds in dental implant surgery. Implant pills into people's teeth.
  • -
  • Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 for details). In general, Shadowlings can no longer enthrall or engage in Shadowling like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with a ride array of New abilities such as extending the shuttle or making thralls into lesser shadowlings. Shadowling gameplay should not revolve almost entirely around darkness, as opposed to pre-hatch shenanigans.
  • -
  • Robotics now has a "sterile" surgical area for performing augmentations
  • -
  • Adds the FixOVein and Bone Gel to the autolathe
  • -
  • ensures all surgical tools have origin tech on them; lowers origin tech on FixoVein
  • -
-

KasparoVy updated:

-
    -
  • Slime People can now wear underwear.
  • -
  • Slime People can now wear undershirts.
  • -
-

TheDZD updated:

-
    -
  • NT has removed trace amounts of a highly-addictive substance from the "100% real" cheese used in cheese-flavored snacks. As a result, incidence rates of crewmembers becoming addicted to Cheesie Honkers should reduce to zero.
  • -
  • After receiving complaints about crewmembers often being unable to physically function without a back-mounted barrel of coffee, NT has replaced station all sources of coffee on the station, including coffee beans themselves with a largely decaffeinated version. It was funny the first time almost every crewmember aboard the NSS Cyberiad was lugging around their own oil barrel filled with coffee, it wasn't so funny, nor good for productivity the eighteenth.
  • -
- -

25 March 2016

-

Crazylemon64 updated:

-
    -
  • You now will actually have the correct `real_name` on your DNA.
  • -
  • No more roundstart runtimes regarding IPC hair.
  • -
  • Mitocholide rejuv will work more usefully now.
  • -
  • Limbs and cyborg modules will no longer appear in your screen.
  • -
  • Cyborg module icons are now persistent throughout logging in and out.
  • -
  • Various cyborg modules, like engineering, now use the proper icon.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds confetti grenades.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes Sleeping Carp combos not having an attack animation
  • -
  • Fixes several chems not properly healing brute/burn damage, consistently, as intended
  • -
-

KasparoVy updated:

-
    -
  • Unbranded heads and groins no longer invisible.
  • -
  • Zeng-hu left leg will now be in line with the body when facing south.
  • -
- -

22 March 2016

-

Crazylemon64 updated:

-
    -
  • Repairs all sorts of eldritch occurences that happen when you put an organic head on an IPC body, as well as some decapitation bugs
  • -
  • Makes heads keep hair on removal
  • -
  • Amputated limbs from a DNA-injected individual now will keep their appearance of the DNA-injected person
  • -
  • Wounds will vanish on their own now
  • -
  • Admins now have an "incarnate" option on the player panel when viewing ghosts for quick player instantiation
  • -
  • Fixes a runtime regarding failing a limb reconnection surgery
  • -
  • Copying a client's preferences now overrides the previous mob's DNA
  • -
  • A DNA injector is now more thorough, and affects the DNA of mobs' limbs and organs
  • -
  • DNA-lacking species can no longer be DNA-injected
  • -
  • Brains are now labeled again
  • -
  • Splashing mitocholide on dead organs will make them live again.
  • -
  • The body scanner now detects necrotic limbs and organs.
  • -
  • pAIs and Drones are now affected by EMPs and explosions while held.
  • -
-

Fethas updated:

-
    -
  • Adds a surgery for infection treatmne/autopsys that is simply cut open, retract, cauterize
  • -
  • fixes a dumb error in internal bleeeding surgerys
  • -
  • Chaos types no longer random teleport, but will make the target hallucinate everyone looks like the guardian.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds a snow, navy and desert military jacket.
  • -
-

Fox McCloud updated:

-
    -
  • Removes random 1% chance to heal fire damage
  • -
  • Removes passive healing from resist heat mutation
  • -
  • Regen mutation heals every cycle (albeit less, on average), but doesn't cost hunger
  • -
  • Fixes not being able to speak over xeno common or hivemind when you receive the Xeno hive node
  • -
  • Adds in the ability to transfer non-locked metal+glass only designs from the protolathe to autolathe
  • -
  • Changes Outpost Mass Driver to prevent accidental spacings
  • -
  • Shadow people no longer dust on death, are rad immune+virus immune, and can be cloned. Slip immunity removed
  • -
  • Shadowlings no longer get hungry or fat and no longer dust on death
  • -
-

KasparoVy updated:

-
    -
  • The ability to change your head, torso and groin as an IPC in the character creator. Non-IPCs cannot access the parts.
  • -
  • Head, torso and groin sprites for all mechanical limb/bodypart brands but Morpheus and the unbranded ones (since those already exist) from Polaris.
  • -
  • Faux-eye optics for non-Morpheus heads.
  • -
  • The ability to change optic (eye) colour if you've got a non-Morpheus head.
  • -
  • The ability to choose human hair styles (wigs) and facial hair styles (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. Conversely, Morpheus heads cannot choose wigs or facial hair.
  • -
  • Two hair styles from Polaris.
  • -
  • The ability for IPCs to wear undergarments (shirts and trousers).
  • -
  • Antennae (colourable) for IPCs.
  • -
  • IPC monitor adjustment verb will now adjust optic colour if the head is non-Morpheus.
  • -
  • Combat/SWAT boots can now be toecut and jacksandals can't.
  • -
  • ASAP fix to what would've broken the ability to configure prostheses in character creation.
  • -
  • Adjusted masks no longer block CPR (including bandanas).
  • -
  • You can no longer run internals from adjusted breath masks (or airtight adjustable masks in general).
  • -
-

Regens updated:

-
    -
  • Robotic hearts will now properly give the mob a heart attack instead of just damaging it when EMP'd
  • -
  • Assisted organs will now also take damage from EMP's
  • -
  • Internal robotic and assisted organs will now actually take damage from EMP's
  • -
-

Tastyfish updated:

-
    -
  • Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get caught!
  • -
  • You can now set the PDA messenger to automatically scroll down to new messages.
  • -
  • Pet collars now act as death alarms and can have ID's attached to them.
  • -
  • All domestic animals can now wear collars.
  • -
  • You can now make video cameras at the autolathe.
  • -
-

TheDZD updated:

-
    -
  • Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly idiotic.
  • -
-

TravellingMerchant updated:

-
    -
  • Kidan have new sprites!
  • -
-

tigercat2000 updated:

-
    -
  • Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean.
  • -
  • Lighting overlays can no longer go below 0 lum_r/g/b
  • -
  • Shuttles will work with lighting better.
  • -
  • Wizards can no longer teleport to prohibited areas such as Central Command.
  • -
- -

16 March 2016

-

Crazylemon64 updated:

-
    -
  • Being in godmode now makes you immune to bombs
  • -
  • Science members now get compensated when they ship tech disks to centcomm.
  • -
  • Science crew are no longer paid when they "max" research.
  • -
  • Roboticists now get credit for making RIPLEYs and Firefighters
  • -
  • Slime people can now regrow limbs on a more lax nutrition requirement
  • -
  • Enhances the nutripump+ to let slime people regrow limbs with it active
  • -
  • Skeletons, slime people, IPCs, and Diona no longer leave blood when hit
  • -
  • Rejuvenating a slime person will no longer clog up their "blood"
  • -
  • Slime people will now regenerate "blood" from having water in their system
  • -
  • The decloner can now be created again
  • -
  • Environment smashing mobs can now destroy girders.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Removes the check for species on the update_markings proc.
  • -
-

FalseIncarnate updated:

-
    -
  • Xeno-botany is now more user-friendly, and less random letters/numbers.
  • -
  • Hydroponics now has a connector hooked up to the isolation tray and a new connector in their back room for those strange plants that like spewing plasma or eating nitrogen.
  • -
  • You can now (finally) build the xeno-botany machines, and science can print off their respective boards.
  • -
-

Fethas updated:

-
    -
  • Syringes are no longer sharp
  • -
  • byond likes direct pathing so item/organ/internal not item/organ even if it shouldn't be in the internal_organs list. This was preventing the list from doing stuff correctly.
  • -
  • fixed ipc organ manipulation surgery, you can now insert a replacment ipc organ directly instead of needing a screwdriver in your main hand
  • -
  • nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase i am an idiot
  • -
  • Fix, hopefully, for a runtime for clientless mobs whos head are cut off...
  • -
  • Hopefully fixes issues with diona eyes
  • -
  • Though shalt not eat robotic organs..including cybernetic implants..
  • -
  • ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL
  • -
-

FlattestGuitar updated:

-
    -
  • Adds three new synthanol drinks
  • -
  • Drinking synthanol is now a bad idea if you're organic
  • -
  • A glass of holy water now looks like normal water
  • -
-

Fox McCloud updated:

-
    -
  • Adds in drink fizzing sound
  • -
  • Drink/bartender recipes use this new fizzing sound in addition to a few other recipes
  • -
  • Adds in a fuse burning sound
  • -
  • Bath salts, black powder, saltpetre, and charcoal use this sound now
  • -
  • Adds in a matchstrike+burning sound
  • -
  • Lighting a match triggers this new sound
  • -
  • Adds in scissors cutting sound
  • -
  • Cutting someone's hair uses this new sound
  • -
  • Adds in printer sounds
  • -
  • printing off papers from various devices typically uses these sounds
  • -
  • Adds computer ambience sounds
  • -
  • black box recorder and R&D core servers both play this sound at random rare intervals
  • -
  • Reduces the tech level (and requirement) for nanopaste
  • -
  • Reduces the tech level (and requirement) for the plasma pistol
  • -
  • Removes Nymph and drone tech levels
  • -
  • Reduces tech levels on the flora board
  • -
  • Adds tech level requirements to mech sleepers, mech syringe guns, mech tasers, and mech machine guns
  • -
  • Increases tech cost of the decloner
  • -
  • Removes the pacman generators
  • -
  • Removes emitter
  • -
  • Removes flora machine (functionless anyway)
  • -
  • Removes the pre-spawned nanopaste
  • -
  • Removes space suits
  • -
  • Removes excavation gear
  • -
  • Replaces the soil with actual hydroponic trays (more aesthetic than anything)
  • -
  • Removes most external asteroid access from the station
  • -
  • Excavation storage is now generic science storage
  • -
  • removed the plasma sheet
  • -
  • Fixes augments not showing up in R&D unless specifically searched for
  • -
  • Fixes some augments being unavailable in mech fabs
  • -
  • Fixes augments having no construction time
  • -
  • Fixes xenos not gaining plasma when breathing in plasma
  • -
  • Fixes plasma reagent not generating plasma for a person
  • -
  • Screaming has different sounds based on being male or female
  • -
  • Implements Goon's screaming sounds.
  • -
  • Screaming tone is now based on age of character instead of being random
  • -
  • Ups the cooldown on screaming from 2 seconds to 5 seconds
  • -
  • Removes chance for Whilhelm scream
  • -
  • Borgs can now scream
  • -
  • Monkey's now have a unique screaming sound
  • -
  • IPCs now scream like cyborgs
  • -
  • Updates slot machines to have higher jackpots and more payouts with more interesting sounds
  • -
  • Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, which inserts and implant without surgery
  • -
  • tweaks a large number of chems; behaviors are largely retained, but new flavor messages, probabilities, etc may be present; overall, you can expect chems to do the same thing
  • -
  • Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all produce cholesterol in your body.
  • -
  • Mixing Sarin, Meth, or Cyanide will poison in a very small area of the reaction if you're not on internal OR not wearing a gas mask
  • -
  • Chemist warddrobe now has two gas masks
  • -
  • Teslium will now impact synthetics AND organics
  • -
  • Fixes facehuggers hugging already infected people
  • -
  • Fixes facehuggers hugging people while dead
  • -
  • Fixes Embryo's developing twice as fast as they should
  • -
  • Fixes up some behaviors with xeno eggs
  • -
  • Xeno acid can now melt through floors and the asteroid
  • -
  • Xeno's now play the gib sound when actually gibbed
  • -
  • Implements Changeling headcrabs/headspiders
  • -
  • Fixes xenos not throwing their organs when gibbed
  • -
  • Fixes swallowed mobs not being ejected when a human is gibbed
  • -
  • Adds in spider eggs reagent, an infectious reagent that requires surgery to correct
  • -
  • Fixes EMPs causing eye implant users to be permanently blind
  • -
  • Increases bag of holding's storage capacity
  • -
  • Removing a heart no longer kills the patient instantly, but induces a heart attack
  • -
  • Demon hearts will not work
  • -
  • Should now actually be able to re-insert hearts
  • -
  • Reworks addictions to bettter differentiate them betweeen overdosing and make them more realistic.
  • -
  • changes which chems are addictive, currently, the follow reagents are now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird cheese, ephedrine, diphenhydramine, teporone, and morphine
  • -
  • sleepers help you recover from addiction faster
  • -
  • Can now make cable coils in autolathes
  • -
  • Fixes the slot machine announcements not displaying properly
  • -
-

Tastyfish updated:

-
    -
  • The super fart mutation now gives you a spell-like ability instead of augmenting the emote.
  • -
  • Vampire abilities are now in their own Vampire tab, as well being action buttons at the top, like spells.
  • -
  • Cloning a vampire no longer makes them lose their abilities.
  • -
  • Vampires can no longer hypnotize chaplains.
  • -
  • Being a full vampire (500+ total blood) actually makes you immune to holy water reliably now.
  • -
  • Some old away missions are back: Academy, Black Market Packers, Space Hotel, Station Collision, and Wild West. Go out and round up some hostiles!
  • -
  • Shuttle consoles now pair up to the engineering, mining, research, or labor shuttle when built or used before pairing, as long as the shuttle is near the console, or the shuttle is moved to be nearby.
  • -
-

monster860 updated:

-
    -
  • Mining station now has a podbay.
  • -
  • Ore scooping module for the spacepod.
  • -
  • Three mining lasers for spacepod: Basic, normal, and burst.
  • -
  • Shooting weapons south or west of spacepod will actually hit adjacent targets now, and won't shoot through walls anymore.
  • -
-

taukausanake updated:

-
    -
  • Mice can now be picked up like diona
  • -
- -

08 March 2016

-

Crazylemon64 updated:

-
    -
  • Slime people are now more vulnerable to low temperatures.
  • -
  • Slime people are able to slowly regrow limbs at a high nutrition cost.
  • -
  • Slime people now slowly shift color based on reagents inside of them - disabled by default, toggle it with an IC verb
  • -
  • Slime people's cores are more vulnerable to damage
  • -
  • Species-related abilities now properly are removed - no more vox hair stylists, unfortunately.
  • -
-

Fethas updated:

-
    -
  • the nest buckle now looks for the right organ path
  • -
  • Fixed some sprites.
  • -
  • No more putting no drops in rechargers,
  • -
-

Fox McCloud updated:

-
    -
  • Implement's goon's gibbing sound
  • -
  • Implement's goon's gibbing sound for robots/silicons
  • -
  • Removes old gibbing sound
  • -
-

Spacemanspark updated:

-
    -
  • Lazarus Injector's can now be emagged to activate their special features, alongside using EMPs on them.
  • -
-

Tastyfish updated:

-
    -
  • Mimes now have a new ore, Tranquillite, used to bring peace and quiet to the station.
  • -
  • There are also permanent invisible walls and silent floors that can be made from tranquillite.
  • -
  • The Recitence mech is now buildable!
  • -
  • The Recitence mech is now playable!
  • -
  • Mid-round selection for various creatures and antagonists now consistently asks permission.
  • -
-

TheDZD updated:

-
    -
  • Adds justice helmets with flashing lights and annoying sirens.
  • -
  • Adds crates containing said helmets.
  • -
  • Also includes a version of the helmet that can only be spawned by admins, and just has a single red light in the center instead of the stereotypical police blinkers.
  • -
-

monster860 updated:

-
    -
  • Space pod transitions are now fixed.
  • -
- -

07 March 2016

-

Crazylemon64 updated:

-
    -
  • People with VAREDIT can now write matrix variables
  • -
  • People with VAREDIT can now modify path variables
  • -
  • Refactors the variable editor code somewhat.
  • -
  • The buildmode area tool now shows reticules of what you've selected.
  • -
  • Switching mobs while using the buildmode tool no longer screws up your UI.
  • -
  • Refactors buildmode so it's no longer a special-case system.
  • -
  • Adds a copy mode to build mode, which lets you duplicate objects.
  • -
  • Any mob in buildmode can work at the fastest possible rate.
  • -
  • Fixed a problem where the icons of a person would not correctly update when changing gender.
  • -
  • One's hairstyle only adjusts on gender change if it's incompatible with your new gender.
  • -
  • Fixed a bug where a person's icon would only be updated if their sprite had a new layer added or removed.
  • -
  • You no longer lose your name when monkeyized and reverted - you'll still look like a monkey while you're a monkey, though.
  • -
  • Your organs will now match your gender when you are cloned.
  • -
  • Skeletons (when a body rots) no longer retain a fleshy torso.
  • -
  • Putting people in an active cryotube now produces the message on insertion, rather than release.
  • -
  • An EMP'd cloning pod will now display its sprites correctly.
  • -
-

FalseIncarnate updated:

-
    -
  • Water Balloons can be filled from more sources than just beakers and watertanks.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, on use
  • -
  • Noir mode only activates when the glasses are equipped to your actual eyes
  • -
  • Noir Glasses mode can be toggled on or off (defaults to off)
  • -
  • Mimes can no longer use spells and continue speaking
  • -
  • Mime abilities are now spells with proper icons
  • -
  • Mime wall now last 30 seconds, up from 5
  • -
  • forecfields/invisible walls now block air currents
  • -
  • Adds the Sleeping Carp scroll to the uplink for 17 TC
  • -
  • Fixes Shadowlings being able to use guns
  • -
  • Fixes sleeping carp scroll users being able to use guns
  • -
  • Fixes the Experimentor throwing one item at a time
  • -
  • Experimentor menu now automatically refreshes after use
  • -
  • Lowers surgery times across the board
  • -
  • Removes scalpels causing 1 damage on successful surgery
  • -
  • Removes random chance to fracture ribs on a successful surgery
  • -
  • Mining drills now have an edge
  • -
-

KasparoVy updated:

-
    -
  • Jackets who have the verb available but are not intended to be adjusted will not have the action button available.
  • -
  • You can now adjust breath masks while buckled into beds and chairs.
  • -
  • Known issues with adjusted jackets using the wrong sprites.
  • -
  • Blueshield coat in hand and item icons.
  • -
  • Hulks now rip apart adjustable and droppable jackets. The items stored in the jackets get dropped on the ground.
  • -
-

Tastyfish updated:

-
    -
  • Infrared emitters can now be rotated while already in an assembly via the UI popup.
  • -
  • The infrared emitter can no longer be hidden inside of boxes and still work.
  • -
  • The beach now has a border and is splashier.
  • -
  • Gives Psychiatrist a paper bin, clipboard, and multicolored pen.
  • -
  • Gives the Librarian / Jouralist a multicolored pen.
  • -
  • Gives the NT Representative a clipboard.
  • -
  • The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being confused with the deadly toxin.
  • -
-

VampyrBytes updated:

-
    -
  • Fixes emotes ending with s needing 2. Emotes now work with grammatical options eg ping or pings, squish or squishes
  • -
  • Updated emote help with missing emotes. Help will also show any species specific emotes for your current species
  • -
- -

26 February 2016

-

FalseIncarnate updated:

-
    -
  • Chocolate can now make you fat, as expected.
  • -
-

Fox McCloud updated:

-
    -
  • stamina damage now regenerates slightly faster
  • -
  • Adds in whetstones for sharpening objects
  • -
  • Kitchen vendor starts off with 5 salt+pepper shakers
  • -
  • Can now point while lying or buckled
  • -
  • Fixes Capulettium Plus not silencing
  • -
  • Fixes slurring, stuttering, drugginess, and silences last half of what they should
  • -
-

KasparoVy updated:

-
    -
  • Jackets that start open are recognized as actually being open already now. This fixes a bug with certain items that don't have an open state, or cases where it ended up giving an item the wrong icon (one that didn't exist)
  • -
-

Spacemanspark updated:

-
    -
  • Fixes synthetics from giving off the proper message in the chat box when using the *yes and *no emotes.
  • -
-

Tastyfish updated:

-
    -
  • Wheelchairs, janicarts, and ambulances can now go through doors according to the user's driver's access.
  • -
- -

24 February 2016

-

Crazylemon64 updated:

-
    -
  • The defib should be more reliable on people who have ghosted
  • -
  • The defib will now give a message if the ghost is still haunting about
  • -
  • Attacking someone with an accessory will now let you put things on them without having to strip them.
  • -
  • Borers will now properly detach upon death of a mob they are controlling
  • -
  • Borers can now see their chemical count while in control of a mob
  • -
  • Borers can now silently communicate with their host - this is not available to the host until the borer has either begun to communicate, or has taken control at least once - this is to avoid spoiling that the borer exists
  • -
  • Borers won't be able to talk out loud inside of a host, by default - they can remove this safeguard with a verb under their borer tab. Borer hivespeak is unaffected.
  • -
  • Borers infesting and hiding are now silent.
  • -
  • Made borer's chem lists more nicely formatted
  • -
  • No more superspeed attacking simplemobs
  • -
  • New players now show up properly under the "who" verb when used as an admin
  • -
  • Mining drones will now automatically collect sand lying around
  • -
  • RIPLEYs can now drill asteroid turfs for sand
  • -
  • You can now load exosuit fuel generators with items containing their material - this means you can fuel yourself off of ores, but this will be highly inefficient and cost you mining points later on, as you can't take fuel back out.
  • -
  • You can now load the fuel generators from an ore box.
  • -
  • The plasma generator now produces 3x as much power from the same amount of fuel - this lets it even remotely compete with the uranium generator.
  • -
  • You can now light cigarettes off of burning mobs.
  • -
  • Exosuit tracking beacons now fit in boxes - prior, they were far too large for even a backpack, as they shared the same size as all other mecha equipment
  • -
  • Miners can now collect ore by walking over it with an ore satchel on.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds prize tickets as a replacement for physical arcade prizes.
  • -
  • Adds a buildable prize counter to exchange tickets for prizes.
  • -
  • Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors.
  • -
  • Adds colorful wallets, for that old school arcade pride.
  • -
  • Fixes accidental removal of plump helmet biscuit recipe.
  • -
  • Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2)
  • -
  • Fixes Metastation. Seriously fixed a lot, just read the PR description for the full list.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds IPC alcohol and a few derivative drinks
  • -
  • IPCs can now drink and be fed from glasses
  • -
-

Fox McCloud updated:

-
    -
  • Laser eyes mutation no longer drains nutrition
  • -
  • splits the EMP kit into two things: the standard EMP kit (2 grenades and an implant), and the EMP flashlight by itself
  • -
  • nerfs heart attacks so they do less damage
  • -
  • Pickpocket gloves now put the item you strip into your hands as opposed to the floor
  • -
  • Picketpocket gloves can now silently strip accessories
  • -
  • Pickpocket gloves will no longer give a message for messing up a pickpocket
  • -
-

KasparoVy updated:

-
    -
  • Adjusting masks while they are not on the face will no longer turn off internals.
  • -
  • Adjusting masks while they are not on the face will now cause the mask to hide/reveal the wearer's identity the next time it's worn as intended.
  • -
  • Adds the ability to open/close bomber jackets.
  • -
  • Adds a security bomber jacket. This jacket inherits the protection and storage capabilities as a standard Security vest with additional bomber jacket benefits.
  • -
  • Adds UI button in top left of screen for jacket adjustment.
  • -
  • Replaces the standard bomber jacket in the Pod Pilot bay with the Security version.
  • -
  • Centralizes jacket/coat adjustment handling.
  • -
  • All jackets start closed by default.
  • -
  • Geneticist duffelbag on-mob sprite (for all species).
  • -
  • Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit.
  • -
  • Refactors back-item icon generation.
  • -
  • Typo in the description of Santa's sack.
  • -
  • Missing punctuation and gender macros in the description of the bag of holding.
  • -
  • The tweak to back-icon generation fixes a bug where the wrong sprite name was being used to generate back-item icons.
  • -
-

PPI updated:

-
    -
  • Adds the ability to hide papers in vents. You can now leave a romantic love letter, exchange information in secret, or hide papers infused with the power of nar'sie from sight.
  • -
-

Regen1 updated:

-
    -
  • Adds the Immolator laser gun, a modified laser gun with 8 shots that will ignite mobs, can be made in R&D
  • -
-

Spacemanspark updated:

-
    -
  • Adds *yes and *no emotes to Synthetics. Glory to Synthetica.
  • -
-

Tastyfish updated:

-
    -
  • The PDA system has been completely redone behind the scenes! It should be functionally similar, although there is now a Home and Back button at the bottom as appropriate.
  • -
  • All of the heads now have multicolored pens.
  • -
  • EngiVend now has 10 camera assemblies.
  • -
  • Borgs can now use vending machines.
  • -
  • There are now picture frames that can be made from the autolathe or wood planks for papers, photos, posters, and canvases!
  • -
-

pinatacolada updated:

-
    -
  • Makes the Protect Station AI law board no longer consider people that damage the station crew, instead of human
  • -
-

ppi updated:

-
    -
  • When revealed Revenants will not be able to move at the maximum move speed, nor be able to pass through any solid object, like walls, windows, grills, computers and mechs.
  • -
- -

13 February 2016

-

Crazylemon64 updated:

-
    -
  • Relaxes the check on what atoms you can follow to any movable atom
  • -
  • Mages are now more ragin
  • -
  • Admins can now adjust the total number of wizards at runtime by tweaking either max_mages, or players_per mage
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Adds new worn icons for duffelbags to better reflect their size, compliments of WJohn at /tg/
  • -
-

FalseIncarnate updated:

-
    -
  • Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), cheese, and flat dough (because we lack proper tortillas) in the microwave.
  • -
  • Adds chimichangas. You know you want a deep-fried burrito.
  • -
-

Fox McCloud updated:

-
    -
  • Updates some spell icons with better/higher quality icons
  • -
  • Updates unarmed attacks to allow for more customization
  • -
  • Updates martial arts so they factor in specie's attack messages and sounds
  • -
  • Re-balances Sleeping Carp fighting style
  • -
  • Re-balances Bo Staff
  • -
  • Rebalances Golem: they should now be spaceproof, fire+cold proof, rad proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee damage. Their armor has been reduced to 55 melee across the board, their slip immunity removed, pain immunity removed, and they're slightly slower
  • -
  • Fixes Ei Nath generating two brains
  • -
  • Ensures the Necromatic Stone generates actual skeletons
  • -
  • Can now strip PDA/IDs from Golems
  • -
  • Fixes sleeping carp grab not being an instant aggressive grab
  • -
  • Fixes an exploit with declaring war on the station
  • -
-

KasparoVy updated:

-
    -
  • Orange and purple bandanas for all station species.
  • -
  • The ability to colour bandanas with a crayon in a washing machine.
  • -
  • Refactors the bandana adjustment system.
  • -
  • Minor adjustments to Tajaran and Unathi bandana east/west sprites.
  • -
  • Adjusting a bandana will now take if off of your head/face and put it in an available hand. If both hands are available, it goes in the selected hand.
  • -
  • Adjusting a coloured bandana will no longer revert it to the original coloured icons anymore.
  • -
  • Adjusting a bandana from mask-style to hat-style means the bandana won't obscure your identity anymore.
  • -
  • Greys now use re-positioned smokeables. They no longer smoke out the eyes.
  • -
-

TheDZD updated:

-
    -
  • Fixes spacepods being able to shoot through walls.
  • -
  • Lowers spacepod weapons fire delay.
  • -
  • Increases spacepod weapons energy costs.
  • -
  • Makes spacepods move at speeds not rivaling those of photon beams. They are now a hair bit faster than a person with a jetpack.
  • -
  • Reduces battery costs for spacepod movement.
  • -
- -

10 February 2016

-

Crazylemon64 updated:

-
    -
  • The cloner now checks for NO_SCAN on the brain when scanning - unclonable species are now truly unclonable. You are still able to revive them with a brain transplant and a defib, however.
  • -
  • A tier-4 DNA scanner linked to a cloning system will now be able to reproduce a body from a brain's DNA, in event of the original corpse being gibbed or similar.
  • -
  • Species with organic limbs and NO_BLOOD will no longer bleed (though still on hit - write that off as "bone powder")
  • -
  • Skeletons now lack internal organs, except for the runic mind which exists in their head - an analogue for the brain
  • -
  • Skeletons that drink milk will be regenerated at a moderate pace, have a small chance of mending bones, and will praise the great name of mr skeltal
  • -
  • Adds a reagent system for species reacting to specific reagents
  • -
  • Slime People can now select from all human hairstyles, and their "hair" will be tinted a shade of their body.
  • -
  • Increases the frequency of the cortical borer event.
  • -
  • People with borers cannot commit suicide - this applies to a controlling borer, too.
  • -
  • Borers can no longer overdose their hosts.
  • -
  • Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic at healing when directly injected. Salicyclic acid was removed too, as its functionality is duplicated by both hydrocodone and saline-glucose.
  • -
  • A mind trapped by a cortical borer can now understand things it could understand when normally in its body.
  • -
  • Changes chemistry's welding tank to a wall-mounted version, to increase the room available.
  • -
  • You can now gib butterflies and lizards with a knife
  • -
  • Ghosts can now follow mecha
  • -
  • You can now access an R&D console by emagging it - it did nothing before.
  • -
  • Walls will now properly smooth and show damage.
  • -
  • Fixes the dialog that occurs when the AI shuts off to actually do what it says it does
  • -
-

Fox McCloud updated:

-
    -
  • Fixes not being able to attach IEDs to beartraps
  • -
  • Can no longer spamclick someone to death using headslamming on a toilet/urimal
  • -
  • Toilet/urinal headslamming now plays a sound
  • -
  • Toilet headslamming damage reduced slightly
  • -
  • Can now fill open reagent containers in a toilet to receive "toilet water".
  • -
  • No more message spam when someone fills a container using a sink
  • -
  • Can now wash your face using a sink, which washes away lipstick and wakes you up slightly
  • -
  • Washing things will now use progress bars
  • -
  • Ensures consuming a single syndicate donk pocket won't get you addicted to meth
  • -
  • Kinetic Accelerators and E-bows automatically reload
  • -
-

Glorken updated:

-
    -
  • Added a Knight Arena for Holodeck.
  • -
  • Added red and blue claymore sprites.
  • -
  • Changed overrided to overrode when emagging Holodeck computer.
  • -
-

KasparoVy updated:

-
    -
  • Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden SWAT sechailer.
  • -
  • Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin.
  • -
  • Warden now gets their own version of the SWAT sechailer in their locker.
  • -
  • HOS now gets the appropriate version of the SWAT sechailer in their locker.
  • -
  • Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin.
  • -
  • Properly shades Vox bandana down-state sprites.
  • -
  • Readds Tajaran bald hairstyle.
  • -
  • Alternate style of non-Human breath mask (incl. surgical/sterile mask) down-state positioning.
  • -
  • Corrects all non-Human species' breath mask (incl. surgical/sterile mask) down-state icons to use the right position style.
  • -
  • Minor adjustments to Tajaran breath mask up-state sprites.
  • -
-

PPI updated:

-
    -
  • Adds a reconnect button to the File menu in the client.
  • -
  • Adds head patting
  • -

Regen updated:

  • Powersink can now drain a lot more power before going boom
  • @@ -2739,6 +356,16 @@
  • Buffed explosion from an overloaded powersink, try to find it instead of overloading the grid.
  • Admin log warning before the powersink explodes
+

Regen1 updated:

+
    +
  • Adds the Immolator laser gun, a modified laser gun with 8 shots that will ignite mobs, can be made in R&D;
  • +
+

Regens updated:

+
    +
  • Robotic hearts will now properly give the mob a heart attack instead of just damaging it when EMP'd
  • +
  • Assisted organs will now also take damage from EMP's
  • +
  • Internal robotic and assisted organs will now actually take damage from EMP's
  • +

Spacemanspark updated:

  • Miners can now utilize the power of mob capsules to take along their lazarus injected mining creatures!
  • @@ -2746,429 +373,116 @@

Tastyfish updated:

    -
  • Species that don't breathe can kill themselves now!
  • -
  • Suicide messages are now catered to your species.
  • -
  • Shortened the default pill & patch name when using the ChemMaster.
  • -
  • The chaplain now has a service radio headset, as Space Jesus intended.
  • +
  • Instruments now use NanoUI.
  • +
  • Corrected the blueshield mission briefing.
  • +
+

Tauka Usanake updated:

+
    +
  • Adds more belt icon overlays
  • +
+

TheBeoni updated:

+
    +
  • Adds "unique" jumpsuit for Pod Pilot so they can finally stop using security one Added picture because i do not like that red label

TheDZD updated:

    -
  • When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is now "Adminhelp."
  • -
  • Mentorhelps and PM replies from mentors appear in a bold aqua blue color.
  • -
  • Adminhelps and PM replies from admins appear in a bold bright red color.
  • -
  • PM replies from players appear in a dull/dark purple color.
  • -
  • Adds admin attack log to players being converted to cult.
  • -
  • Adds shadowling thrall jobbans.
  • -
  • Jobbanned players who are converted to shadowling thrall, revolutionary, or cultist will have the control of their body offered up to eligible ghosts.
  • -
- -

31 January 2016

-

Crazylemon64 updated:

-
    -
  • Syndicate borgs can now interact with station machinery
  • -
  • People with slime people limbs can now *squish
  • -
  • Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
  • -
-

FalseIncarnate updated:

-
    -
  • Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
  • -
  • Adds in the Magic Conch Shell, an admin-only shell of power.
  • -
-

Fox McCloud updated:

-
    -
  • Updates Summon Guns and Magic to include many of the new guns
  • -
  • Summon Guns/Magic can no longer be used during Ragin' Mages
  • -
-

Tastyfish updated:

-
    -
  • The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
  • -
  • Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
  • -
-

pinatacolada updated:

-
    -
  • Adds NanoUI to the operating computer
  • -
  • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
  • -
- -

29 January 2016

-

Crazylemon updated:

-
    -
  • The DNA scanner has now undergone a seminar to recognize fake identities; It will now scan the actual person's identity, rather than their disguise (read: wearing a mask with or without someone else's ID).
  • -
  • Matter eater now allows you to eat humans as if you were fat.
  • -
  • Eating mobs with an aggressive grab now generates attack logs.
  • -
-

Crazylemon64 updated:

-
    -
  • For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed.
  • -
  • Ghosts can now see the contents of smartfridges and look at the drone console
  • -
  • Humans now only produce one message when shaken while SSD
  • -
  • The supermatter no longer will irradiate everyone, everywhere, when it explodes.
  • -
  • Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name.
  • -
  • Brains are no longer able to escape their brain by being a sorcerer.
  • -
  • Astral projecting with other runes on the same tile will now no longer prevent you from re-entering
  • -
  • Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!
  • -
-

FalseIncarnate updated:

-
    -
  • Allows plants to be identified as enhanced*. Enhancing plants results from using reagents (like saltpetre) that affect the stats of a seed instead of using mutagens/machines. *May not meet standards for being classified as "organic produce". (This was already possible, just renames enhanced plants for easier differentiation)
  • -
-

Fox McCloud updated:

-
    -
  • Fixes mutadone not working with some genetic mutations
  • -
  • Fixes banana honk and silencer being alcoholic
  • -
  • Fixes Kahlua being non-alcoholic
  • -
  • Fixes polonium not metabolizing
  • -
  • Fixes being able to receive free unlimited boxes from the Merchandise store
  • -
  • Adds in wooden bucklers
  • -
  • Re-adds roman shield to the costume vendor
  • -
  • Buffs Riot shield damage from 8 to 10
  • -
  • Adds in a Skeleton race
  • -
  • Tweaks the skeletons colors to be more realistic and to blend in less with the floor
  • -
  • Adds in lichdom spell for the wizard
  • -
  • Adds in lesser summon guns spell for wizard
  • -
  • adds in Mjolnir and the singularity hammer as weapons the wizard can purchase
  • -
  • Wizard can purchase the charge spell from the spell book
  • -
  • Wizard can purchase a healing staff from the spell book
  • -
  • Tweaks and lowers spell costs of utility spells for wizard
  • -
  • Re-organizes the spellbook to be better divided into categories and have a better window size
  • -
  • Knock now opens+unlocks lockers
  • -
  • Magic Missile has a slightly longer cooldown and no longer deals damage, but has a lower cooldown is upgraded
  • -
-

KasparoVy updated:

-
    -
  • Navy blue Centcom Officer's beret for use by the Blueshield.
  • -
  • Adds the new navy blue beret to the Blueshield's locker.
  • -
  • Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret.
  • -
  • Adds TG energy katana back and belt sprite.
  • -
  • Bo staff back sprite.
  • -
  • Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana.
  • -
  • Cutting open the toes of footwear so species with feet-claws can wear them.
  • -
  • Toeless jackboots.
  • -
  • Cleans up glovesnipping and lighting a match with a shoe.
  • -
  • Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting.
  • -
-

Tastyfish updated:

-
    -
  • Cargonia now has its own section in the manifest.
  • -
-

TheDZD updated:

-
    -
  • Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as "enough dakka," Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition.
  • -
- -

24 January 2016

-

KasparoVy updated:

-
    -
  • Fixes markings overlaying underwear.
  • -
  • Nude icon in underwear.dmi
  • -
  • Fixes Vox robes not using the correct on-mob sprites.
  • -
  • Fixes unreported bug where there was a slim chance during character preview icon generation that a character with Security Officer set to high would get rendered with either the wrong beret sprite or no beret sprite at all.
  • -
  • Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites.
  • -
-

Tastyfish updated:

-
    -
  • Passively power-consuming borg modules, such as the peacekeeper movement and shield module, won't spam the user infinitely if they're low on power anymore.
  • -
- -

23 January 2016

-

Fox McCloud updated:

-
    -
  • Removes Vampire HUD
  • -
  • moves the Vampire blood counter to a more easy to see location
  • -
  • Adds in a Changeling chemical counter display
  • -
  • Adds in a Changeling sting counter display
  • -
  • Vampire total blood and usable blood will now appear under status
  • -
  • Changes vampire blood display to be similar to ling chemical counter
  • -
  • Fixes unnecessary toxin damage being dealt on severe bloodloss
  • -
  • Fixes human mobs not receiving proper random names
  • -
  • Adds in knight armor
  • -
  • Grants the chaplain a set of crusader knight armor
  • -
  • Adds in cult-resistant ERT paranormal space suit
  • -
  • Allows the Chaplain to convert his null rod into a holy sword with crusader knight armor
  • -
  • Chaplain's closet is now a secure closet
  • -
  • Adds in Assault Gear crate to cargo
  • -
  • Adds in military assault belt
  • -
  • Adds in spaceworthy swat suits
  • -
  • tweaks bandolier to hold 2 additional shotgun shells
  • -
  • bartender starts off with +2 additional shells
  • -
  • Reduces the cost of the space suit crate and doubles its contents
  • -
  • Refactors knives so their behavior is more universal
  • -
  • Fixes Hulk not properly being removed when your health drops below a threshold
  • -
  • Fixes flickering vision in a mining mech
  • -
-

Tastyfish updated:

-
    -
  • Poly has taken a seminar on the latest trends in engine operations.
  • -
  • Player-controller parrots can now hear their headsets.
  • +
  • Ports over changelog system from /tg/station.

Tigerbat2000 updated:

  • The nuclear disk escaping on the shuttle no longer counts as a syndicate minor victory.
  • Cultists can once again actually greentext the escape objective.
- -

20 January 2016

-

DarkPyrolord updated:

-
    -
  • Adds in hardsuit sprites for Vulpkanin
  • -
-

FalseIncarnate updated:

-
    -
  • Allowed cheap lighters and individual matches to be put into cigarette packages at the cost of cigarette space.
  • -
  • Matches can now be lit and put out by striking the match on your shoes. Good for if you lose that matchbox, or want to just feel cool.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes brute damage on weapons not knocking people down.
  • -
  • Tweaks implant behavior to be more consistent and unified.
  • -
  • Lowers the pAI cooldown from 60 seconds to 5 seconds.
  • -
  • Raw telecrystal can now be used to charge uplink implants.
  • -
  • Fixes being unable to holster the pulse pistol
  • -
  • Fixes being able to holster shotguns
  • -
-

KasparoVy updated:

-
    -
  • Improved shading on all Vulpkanin hardsuit tails.
  • -
  • Vulpkanin hardsuit helmet respriting (colour tweaks).
  • -
  • Vulpkanin hardsuit helmets with proper flashlight-on sprites.
  • -
-

Tastyfish updated:

-
    -
  • The ID computer Access Report printout now separates the access list with commas so it's actually readable.
  • -
  • The ID computer Access Report printout isn't blank if you don't have an authorization card in anymore.
  • -
  • In the supply ordering & shuttle consoles, one can now cancel an order at either the Reason or Amount input dialogs.
  • -
  • Table flipping uses correct sprites.
  • -
-

TheDZD updated:

-
    -
  • Adds world.Topic() handling so that users are notified in-game when pull requests are opened, closed, or merged on the Github repo.
  • -
- -

18 January 2016

-

Crazylemon updated:

-
    -
  • New classes of shapeshifters have been sighted around the NSS Cyberiad...
  • -
  • Wizards now can't teleport to other antag spawn points.
  • -
  • Removes an extruding pixel from the left-facing IPC glider monitor sprite.
  • -
  • Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further adjust this by modifying the 'delay_per_mage' variable.
  • -
  • Ragin' Mages are now made with 100% less in-use souls (Apprentices won't have their consciousness yoinked).
  • -
  • It takes half an hour for the REAL chaos of ragin' mages to start, for at least a semblance of normality.
  • -
-

Dave The Headcrab updated:

-
    -
  • Adds the advanced energy revolver, toggles between taser and laser modes.
  • -
  • Removes the detective's revolver from the blueshield's locker.
  • -
  • Changes the taser the blueshield starts with into an advanced energy revolver.
  • -
-

Deanthelis updated:

-
    -
  • Added the ability for the Magnetic Gripper to pick up and place light tiles.
  • -
-

Fethas updated:

-
    -
  • Readds the hud icon showing up for master and servent
  • -
  • adds mindslave datum hud thingy based on TGs gang huds
  • -
-

Fox McCloud updated:

-
    -
  • Fixes not being able to add/remove Weapon Permit from IDs.
  • -
  • Fixes the energy sword being invisible in-hand when turned on.
  • -
  • Fixes the telebaton being invisible in-hand when extended.
  • -
  • Fixes eye-stabbing not having an attack animation or hitsound.
  • -
  • Fixes some kitchen utensils playing the wrong hit-sound and playing twice in some cases.
  • -
  • Fixes the butcher cleaver sprite being backwards.
  • -
  • Fixes the telebaton sprite being missing from the side.
  • -
  • Fixes the meat cleaver being invisible in-hand.
  • -
  • Corrects some grammatical descriptive errors for the elite syndicate hardsuit.
  • -
  • completely overhauls implants to TG's standards.
  • -
  • Adds storage implant.
  • -
  • Adds microbomb and macrobomb implants.
  • -
  • Adds in support for removing implants directly into cases.
  • -
  • Removes Bay style explosive implants.
  • -
  • Removes compressed matter implants.
  • -
  • Tweaks the uplink to reflect removal of the old implants and inclusion of the new.
  • -
  • Fixes/cuts down on the lag caused by monkey cubes.
  • -
-

Jey updated:

-
    -
  • Inflatable walls and door can now be deflated by altclicking them
  • -
  • Fixed lag from expanding multiple monkeycubes at once.
  • -
-

KasparoVy updated:

-
    -
  • Adds blank icons with standardized timings for species tail wagging, used in icon generation.
  • -
  • Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or WEST.
  • -
  • Ensures tails will overlap stuff as normal only when facing NORTH so as to avoid unwanted interference with the base sprite.
  • -
  • Tails now appear in ID cards, overlays things correctly.
  • -
  • Tails now overlay and are overlaid by things correctly in preview icons.
  • -
  • Modifies the positioning of tail icon generation in the ID card preview icon generation file.
  • -
  • Modifies the positioning of tail icon generation in the player preferences preview icon generation file.
  • -
  • Breaks limb generation into its own layer, breaks tail generation into a second layer that can be overlaid by limbs.
  • -
  • If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER gets all remaining directions. Otherwise icons are generated in the traditional manner.
  • -
  • Adjusts the Unathi right arm east direction and animated tail sprites, recolouring a random pixel and fixing a floating tail respectively.
  • -
  • Adjusts position of tail layer such that tails' north direction sprites will overlay backpacks (more importantly, satchel straps).
  • -
  • Accommodates admin-overrides to the body_accessory species check by setting the default animation template to Vulpkanin.
  • -
  • Adjusts north-direction Unathi static tail sprite, now attaches to the body in the correct location.
  • -
  • Adds some TG underwear.
  • -
  • Adds an NV science goggles worn sprite.
  • -
  • Ports Bay/TG berets.
  • -
  • Adjusts beret sprite, recolours strange orange pixels.
  • -
  • Adjusts NV science goggles object icon. Removed strange border and centered it.
  • -
  • Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi prosthetics.
  • -
-

Kyep updated:

-
    -
  • Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon sprite on status monitors
  • -
  • Changing level to green/blue now clears the status monitors, so they no longer show higher alert levels after the level is changed
  • -
-

NTSAM updated:

-
    -
  • Added a rainbow IPC screen.
  • -
-

PPI updated:

-
    -
  • Modifies the effective time limit to activate the Nuclear Challenge as Nukeops from two minutes to seven minutes
  • -
-

Tastyfish updated:

-
    -
  • The QM now actually has a QM stamp instead of a fake one, as well as an approved and denied stamp.
  • -
  • New area named 'Genetics Maintenance' solidifying/relabelling the confusing area between the morge and Mech Bay as being fully maintenance again, but working correctly and with proper doors.
  • -
  • Fixed a few maintenance door names to be in parity to the rest of the station.
  • -
  • Added the ability to print the records photo of a crew member from a security records console. Useful for Wanted notices!
  • -
-

Tigercat2000 updated:

-
    -
  • You can no longer use the gibber for monkies.
  • -
  • Cleaned up gibber.dm styling.
  • -
  • The fire alarm now uses NanoUI, with color coded alert levels.
  • -
  • Upgraded NanoUI (again), fancy FontAwesome icons.
  • -
  • Didn't add any butts. Yet.
  • -
- -

13 January 2016

-

Fox McCloud updated:

-
    -
  • Fixes Rezadone not clearing mutated organs.
  • -
  • Clone damage immunity removed from Slime People, Shadowlings, Golems, and Vox
  • -
  • Explosions will no longer destroy things underneath turfs until the turf is exposed.
  • -
  • fixes a runtime related to revolver spinning.
  • -
  • fixes server loading taking an abnormally long time.
  • -
-

Kyep updated:

-
    -
  • Blob, vine and virus outbreaks are now more clearly labeled as such, to avoid people confusing them with each other
  • -
-

Tastyfish updated:

-
    -
  • NT Rep fountain pens and magistrate gold pens can now write in 5 different colors. The IAA gets a cheap plastic equivalent.
  • -
- -

11 January 2016

-

CrAzYPiLoT updated:

-
    -
  • Fixes the footsteps sounds to the fullest.
  • -
-

Crazylemon updated:

-
    -
  • Bomb guardians now automatically notify their master when they've set something to boom, so there's less accidental friendly fire
  • -
  • Bomb guardians are only notified that their trap failed, if it ACTUALLY FAILED.
  • -
  • Bomb guardians now are more aware of what is primed to explode.
  • -
  • Bomb guardian summoners can now defuse their guardian's bombs without harm.
  • -
  • Brought RAGIN' MAGES back up to function.
  • -
-

Dave The Headcrab updated:

-
    -
  • Added a new icon for the soy and cafe latte drinks. Icons courtesy of Full Of Skittles, resident overlord of art.
  • -
-

Fox McCloud updated:

-
    -
  • Re-arranges the armory and changes its contents minorly.
  • -
  • Adds in rubbershot ammo boxes.
  • -
  • Fixes Mutadone incurring a massive cost on the server.
  • -
  • Positronic brains can no longer speak binary.
  • -
  • Positronic brains can be prevented from speaking (or allowed) by toggling their speaker on/off.
  • -
  • IPC's positronic brains start off toggled off.
  • -
  • Fixes the supermatter announcement causing massive amounts of server lag.
  • -
  • Adds in tradable telecrystals.
  • -
- -

08 January 2016

-

Crazylemon updated:

-
    -
  • Fully enables a system to allow species to have unique procs and verbs that come and go with the species.
  • -
  • IPCs lose their change monitor verb when changing species now. Gone are the days of recalling a past IPC life to perform self-barbery! Oh, woe is me!
  • -
  • Sleepers and Body Scanners will now reliably work when rotated
  • -
  • SSD humans should be asleep more reliably now.
  • -
-

Dave The Headcrab updated:

-
    -
  • Nerfs the damage the Detective's revolver does from 15 brute to 5 brute.
  • -
  • Adds a 300 round capacity buckshot magizine that fits into the L6 Saw.
  • -
  • Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw.
  • -
  • Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine.
  • -
  • Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their bag.
  • -
-

FalseIncarnate updated:

-
    -
  • Plants will now begin to die over time if their age exceeds 5 times their TRAIT_MATURATION value.
  • -
  • Weed growth chance per process in trays has been slightly increased (Previously: 5% chance if no seed, 1% otherwise;Now: 6% / 3%).
  • -
  • Pest growth in trays has been slightly buffed. (Previously: 3% chance to increase by 0.1; Now: 5% chance to increase by 0.5)
  • -
-

Fethas updated:

-
    -
  • Due to Archmage Steve leaving the nya-cromantic stone near the microwave, the true power of the stone has been unleashed. Subjects of the stone are not only ressurected ... but resurrected as catgirls ... We fired steve.
  • -
-

Fox McCloud updated:

-
    -
  • fixes a bug relating to some brute/burn damage being dealt to human mobs.
  • -
  • Adds in overloading APCs, causing them to arc electricity to mobs in range.
  • -
  • Makes Engineering related APCs overload proof.
  • -
  • Implements the timestop spell.
  • -
  • Implements new sepia slime reaction which halts time in an AoE.
  • -
  • sentience potions no longer can make slimes sentient.
  • -
  • Removes Hulk instant stun.
  • -
  • Hulk damage increased.
  • -
  • Hulk wears off at a lower health threshold.
  • -
  • Fixes strange reagent not working on simple animals.
  • -
  • Reduces the amount shock damage and bounces for the Tesla engine.
  • -
  • Fixes Syndicate Cyborg's LMG being invisible.
  • -
  • Fixes the uplink kit having implanters that were both nameless and looked as if they had been used.
  • -
-

KasparoVy updated:

-
    -
  • Added the security gasmask, sexy mime mask, bandanas, balaclava, welding gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox breath, medical, and surgical masks.
  • -
  • Removed a duplicate of the human balaclava sprite.
  • -
  • Modifies the Vox plague-doctor, fake moustache, sterile and medical mask sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the names of some Vox mask adjusted-state sprites.
  • -
-

Tastyfish updated:

-
    -
  • Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'.
  • -

Tigercat2000 updated:

  • Added 96x96 (3x) res option to icons menu
- -

06 January 2016

-

Certhic updated:

+

TravellingMerchant updated:

    -
  • Corrected some air alarms so that atmos computer can access them
  • -
  • Bodyscanner now sees mechanical parts in internal organs
  • +
  • Kidan have new sprites!
-

Crazylemon64 updated:

+

TullyBBurnalot updated:

    -
  • Sleeping simple animals should tick down sleeping as normal - deaf simple mobs are no longer a thing
  • +
  • Handless cuffing no longer possible. Can still cuff people with one hand
-

Tastyfish updated:

+

TullyBurnalot updated:

    -
  • Instruments now use NanoUI.
  • -
  • Corrected the blueshield mission briefing.
  • +
  • AI can no longer interact with IV Drips
  • +
  • Robots can no longer remove beakers/blood bags from IV Drips
  • +
  • Fixed clown door deconstruction
  • +
  • Fixed mime door deconstruction
- -

03 January 2016

-

TheDZD updated:

+

Twinmold updated:

    -
  • Ports over changelog system from /tg/station.
  • +
  • Nar'Sie AI Hologram and Error Sprite
  • +
  • Fixes space pod equipment variable. Can now properly install/uninstall equipment.
  • +
  • Check Seat verb no longer pulls out installed equipment.
  • +
  • You can now have a passenger in your pod if you have a passenger seat.
  • +
+

Twinmold93 updated:

+
    +
  • Fixes a runtime issue caused by using the detective's scanner on the space hotel cleaver.
  • +
  • Scrubber pipe missing segment behind the operating theatres.
  • +
+

Ty-Omaha updated:

+
    +
  • Gives Combat Gloves to Code Red ERT agents.
  • +
  • Gives Code Gamma Engineering ERT agents Combat Gloves.
  • +
+

VampyrBytes updated:

+
    +
  • Fixes emotes ending with s needing 2. Emotes now work with grammatical options eg ping or pings, squish or squishes
  • +
  • Updated emote help with missing emotes. Help will also show any species specific emotes for your current species
  • +
+

Yurivw updated:

+
    +
  • Condimaster now actually makes bottles. Removed: Unused options in admin secret menu are now removed.
  • +
+

chopchop1614 updated:

+
    +
  • Fixed the C4 labcoat exploding bug
  • +
+

monster860 updated:

+
    +
  • Space pod transitions are now fixed.
  • +
+

monster860, clusterfack, and DeityLink updated:

+
    +
  • Adds space parallax
  • +
+

pinatacolada updated:

+
    +
  • Adds NanoUI to the operating computer
  • +
  • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
  • +
+

ppi updated:

+
    +
  • When revealed Revenants will not be able to move at the maximum move speed, nor be able to pass through any solid object, like walls, windows, grills, computers and mechs.
  • +
+

taukausanake updated:

+
    +
  • Mice can now be picked up like diona
  • +
+

tigercat2000 updated:

+
    +
  • Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean.
  • +
  • Lighting overlays can no longer go below 0 lum_r/g/b
  • +
  • Shuttles will work with lighting better.
  • +
  • Wizards can no longer teleport to prohibited areas such as Central Command.
  • +
+

tkdrg updated:

+
    +
  • Admins now have a verb to wipe all scripts from telecomms.
  • +
+

tkdrg, Delimusca, Aranclanos, TheDZD updated:

+
    +
  • Gun mimics (including wand, staff, projectile guns, and energy guns) created by the staff of animation will shoot things.
  • +
  • Mimics created by the staff of animation now have googly eyes.
  • +
  • Fixes the disturbing lack of death caused by wand of death projectiles.
  • +
+

tristan1333 updated:

+
    +
  • Spacepod paint
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 884eb062051..6c73b93b9c7 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1,2949 +1,430 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. --- -2016-01-03: - TheDZD: - - rscadd: Ports over changelog system from /tg/station. -2016-01-06: - Certhic: - - bugfix: Corrected some air alarms so that atmos computer can access them - - bugfix: Bodyscanner now sees mechanical parts in internal organs - Crazylemon64: - - bugfix: Sleeping simple animals should tick down sleeping as normal - deaf simple - mobs are no longer a thing - Tastyfish: - - tweak: Instruments now use NanoUI. - - spellcheck: Corrected the blueshield mission briefing. -2016-01-08: - Crazylemon: - - rscadd: Fully enables a system to allow species to have unique procs and verbs - that come and go with the species. - - rscdel: IPCs lose their change monitor verb when changing species now. Gone are - the days of recalling a past IPC life to perform self-barbery! Oh, woe is me! - - bugfix: Sleepers and Body Scanners will now reliably work when rotated - - bugfix: SSD humans should be asleep more reliably now. - Dave The Headcrab: - - tweak: Nerfs the damage the Detective's revolver does from 15 brute to 5 brute. - - rscadd: Adds a 300 round capacity buckshot magizine that fits into the L6 Saw. - - rscadd: Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw. - - rscadd: Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine. - - rscadd: Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their - bag. - FalseIncarnate: - - rscadd: Plants will now begin to die over time if their age exceeds 5 times their - TRAIT_MATURATION value. - - tweak: 'Weed growth chance per process in trays has been slightly increased (Previously: - 5% chance if no seed, 1% otherwise;Now: 6% / 3%).' - - tweak: 'Pest growth in trays has been slightly buffed. (Previously: 3% chance - to increase by 0.1; Now: 5% chance to increase by 0.5)' - Fethas: - - rscadd: Due to Archmage Steve leaving the nya-cromantic stone near the microwave, - the true power of the stone has been unleashed. Subjects of the stone are not - only ressurected ... but resurrected as catgirls ... We fired steve. - Fox McCloud: - - bugfix: fixes a bug relating to some brute/burn damage being dealt to human mobs. - - rscadd: Adds in overloading APCs, causing them to arc electricity to mobs in range. - - tweak: Makes Engineering related APCs overload proof. - - rscadd: Implements the timestop spell. - - rscadd: Implements new sepia slime reaction which halts time in an AoE. - - tweak: sentience potions no longer can make slimes sentient. - - tweak: Removes Hulk instant stun. - - tweak: Hulk damage increased. - - tweak: Hulk wears off at a lower health threshold. - - bugfix: Fixes strange reagent not working on simple animals. - - tweak: Reduces the amount shock damage and bounces for the Tesla engine. - - bugfix: Fixes Syndicate Cyborg's LMG being invisible. - - bugfix: Fixes the uplink kit having implanters that were both nameless and looked - as if they had been used. - KasparoVy: - - rscadd: Added the security gasmask, sexy mime mask, bandanas, balaclava, welding - gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox - breath, medical, and surgical masks. - - rscdel: Removed a duplicate of the human balaclava sprite. - - tweak: Modifies the Vox plague-doctor, fake moustache, sterile and medical mask - sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the - names of some Vox mask adjusted-state sprites. - Tastyfish: - - spellcheck: Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'. - Tigercat2000: - - rscadd: Added 96x96 (3x) res option to icons menu -2016-01-11: - CrAzYPiLoT: - - bugfix: Fixes the footsteps sounds to the fullest. - Crazylemon: - - rscadd: Bomb guardians now automatically notify their master when they've set - something to boom, so there's less accidental friendly fire - - bugfix: Bomb guardians are only notified that their trap failed, if it ACTUALLY - FAILED. - - rscadd: Bomb guardians now are more aware of what is primed to explode. - - rscadd: Bomb guardian summoners can now defuse their guardian's bombs without - harm. - - rscadd: Brought RAGIN' MAGES back up to function. - Dave The Headcrab: - - rscadd: Added a new icon for the soy and cafe latte drinks. Icons courtesy of - Full Of Skittles, resident overlord of art. - Fox McCloud: - - rscadd: Re-arranges the armory and changes its contents minorly. - - rscadd: Adds in rubbershot ammo boxes. - - bugfix: Fixes Mutadone incurring a massive cost on the server. - - tweak: Positronic brains can no longer speak binary. - - tweak: Positronic brains can be prevented from speaking (or allowed) by toggling - their speaker on/off. - - tweak: IPC's positronic brains start off toggled off. - - bugfix: Fixes the supermatter announcement causing massive amounts of server lag. - - rscadd: Adds in tradable telecrystals. -2016-01-13: - Fox McCloud: - - bugfix: Fixes Rezadone not clearing mutated organs. - - tweak: Clone damage immunity removed from Slime People, Shadowlings, Golems, and - Vox - - tweak: Explosions will no longer destroy things underneath turfs until the turf - is exposed. - - bugfix: fixes a runtime related to revolver spinning. - - bugfix: fixes server loading taking an abnormally long time. - Kyep: - - rscadd: Blob, vine and virus outbreaks are now more clearly labeled as such, to - avoid people confusing them with each other - Tastyfish: - - tweak: NT Rep fountain pens and magistrate gold pens can now write in 5 different - colors. The IAA gets a cheap plastic equivalent. -2016-01-18: - Crazylemon: - - rscadd: New classes of shapeshifters have been sighted around the NSS Cyberiad... - - bugfix: Wizards now can't teleport to other antag spawn points. - - bugfix: Removes an extruding pixel from the left-facing IPC glider monitor sprite. - - tweak: Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further - adjust this by modifying the 'delay_per_mage' variable. - - bugfix: Ragin' Mages are now made with 100% less in-use souls (Apprentices won't - have their consciousness yoinked). - - tweak: It takes half an hour for the REAL chaos of ragin' mages to start, for - at least a semblance of normality. - Dave The Headcrab: - - rscadd: Adds the advanced energy revolver, toggles between taser and laser modes. - - rscdel: Removes the detective's revolver from the blueshield's locker. - - tweak: Changes the taser the blueshield starts with into an advanced energy revolver. - Deanthelis: - - rscadd: Added the ability for the Magnetic Gripper to pick up and place light - tiles. - Fethas: - - bugfix: Readds the hud icon showing up for master and servent - - rscadd: adds mindslave datum hud thingy based on TGs gang huds - Fox McCloud: - - bugfix: Fixes not being able to add/remove Weapon Permit from IDs. - - bugfix: Fixes the energy sword being invisible in-hand when turned on. - - bugfix: Fixes the telebaton being invisible in-hand when extended. - - bugfix: Fixes eye-stabbing not having an attack animation or hitsound. - - bugfix: Fixes some kitchen utensils playing the wrong hit-sound and playing twice - in some cases. - - bugfix: Fixes the butcher cleaver sprite being backwards. - - bugfix: Fixes the telebaton sprite being missing from the side. - - bugfix: Fixes the meat cleaver being invisible in-hand. - - spellcheck: Corrects some grammatical descriptive errors for the elite syndicate - hardsuit. - - rscadd: completely overhauls implants to TG's standards. - - rscadd: Adds storage implant. - - rscadd: Adds microbomb and macrobomb implants. - - rscadd: Adds in support for removing implants directly into cases. - - rscdel: Removes Bay style explosive implants. - - rscdel: Removes compressed matter implants. - - tweak: Tweaks the uplink to reflect removal of the old implants and inclusion - of the new. - - bugfix: Fixes/cuts down on the lag caused by monkey cubes. - Jey: - - tweak: Inflatable walls and door can now be deflated by altclicking them - - bugfix: Fixed lag from expanding multiple monkeycubes at once. - KasparoVy: - - imageadd: Adds blank icons with standardized timings for species tail wagging, - used in icon generation. - - bugfix: Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or - WEST. - - bugfix: Ensures tails will overlap stuff as normal only when facing NORTH so as - to avoid unwanted interference with the base sprite. - - bugfix: Tails now appear in ID cards, overlays things correctly. - - bugfix: Tails now overlay and are overlaid by things correctly in preview icons. - - tweak: Modifies the positioning of tail icon generation in the ID card preview - icon generation file. - - tweak: Modifies the positioning of tail icon generation in the player preferences - preview icon generation file. - - tweak: Breaks limb generation into its own layer, breaks tail generation into - a second layer that can be overlaid by limbs. - - tweak: If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER - will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER - gets all remaining directions. Otherwise icons are generated in the traditional - manner. - - tweak: Adjusts the Unathi right arm east direction and animated tail sprites, - recolouring a random pixel and fixing a floating tail respectively. - - tweak: Adjusts position of tail layer such that tails' north direction sprites - will overlay backpacks (more importantly, satchel straps). - - tweak: Accommodates admin-overrides to the body_accessory species check by setting - the default animation template to Vulpkanin. - - tweak: Adjusts north-direction Unathi static tail sprite, now attaches to the - body in the correct location. - - rscadd: Adds some TG underwear. - - rscadd: Adds an NV science goggles worn sprite. - - rscadd: Ports Bay/TG berets. - - tweak: Adjusts beret sprite, recolours strange orange pixels. - - tweak: Adjusts NV science goggles object icon. Removed strange border and centered - it. - - rscadd: Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi - prosthetics. - Kyep: - - rscadd: Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon - sprite on status monitors - - bugfix: Changing level to green/blue now clears the status monitors, so they no - longer show higher alert levels after the level is changed - NTSAM: - - rscadd: Added a rainbow IPC screen. - PPI: - - tweak: Modifies the effective time limit to activate the Nuclear Challenge as - Nukeops from two minutes to seven minutes - Tastyfish: - - rscadd: The QM now actually has a QM stamp instead of a fake one, as well as an - approved and denied stamp. - - rscadd: New area named 'Genetics Maintenance' solidifying/relabelling the confusing - area between the morge and Mech Bay as being fully maintenance again, but working - correctly and with proper doors. - - spellcheck: Fixed a few maintenance door names to be in parity to the rest of - the station. - - rscadd: Added the ability to print the records photo of a crew member from a security - records console. Useful for Wanted notices! - Tigercat2000: - - rscdel: You can no longer use the gibber for monkies. - - spellcheck: Cleaned up gibber.dm styling. - - rscadd: The fire alarm now uses NanoUI, with color coded alert levels. - - tweak: Upgraded NanoUI (again), fancy FontAwesome icons. - - wip: Didn't add any butts. Yet. -2016-01-20: - DarkPyrolord: - - rscadd: Adds in hardsuit sprites for Vulpkanin - FalseIncarnate: - - rscadd: Allowed cheap lighters and individual matches to be put into cigarette - packages at the cost of cigarette space. - - rscadd: Matches can now be lit and put out by striking the match on your shoes. - Good for if you lose that matchbox, or want to just feel cool. - Fox McCloud: - - bugfix: Fixes brute damage on weapons not knocking people down. - - tweaks: Tweaks implant behavior to be more consistent and unified. - - tweak: Lowers the pAI cooldown from 60 seconds to 5 seconds. - - rscadd: Raw telecrystal can now be used to charge uplink implants. - - bugfix: Fixes being unable to holster the pulse pistol - - bugfix: Fixes being able to holster shotguns - KasparoVy: - - tweak: Improved shading on all Vulpkanin hardsuit tails. - - tweak: Vulpkanin hardsuit helmet respriting (colour tweaks). - - rscadd: Vulpkanin hardsuit helmets with proper flashlight-on sprites. - Tastyfish: - - tweak: The ID computer Access Report printout now separates the access list with - commas so it's actually readable. - - bugfix: The ID computer Access Report printout isn't blank if you don't have an - authorization card in anymore. - - rscadd: In the supply ordering & shuttle consoles, one can now cancel an order - at either the Reason or Amount input dialogs. - - bugfix: Table flipping uses correct sprites. - TheDZD: - - rscadd: Adds world.Topic() handling so that users are notified in-game when pull - requests are opened, closed, or merged on the Github repo. -2016-01-23: - Fox McCloud: - - rscdel: Removes Vampire HUD - - tweak: moves the Vampire blood counter to a more easy to see location - - rscadd: Adds in a Changeling chemical counter display - - rscadd: Adds in a Changeling sting counter display - - rscadd: Vampire total blood and usable blood will now appear under status - - tweak: Changes vampire blood display to be similar to ling chemical counter - - bugfix: Fixes unnecessary toxin damage being dealt on severe bloodloss - - bugfix: Fixes human mobs not receiving proper random names - - rscadd: Adds in knight armor - - rscadd: Grants the chaplain a set of crusader knight armor - - rscadd: Adds in cult-resistant ERT paranormal space suit - - rscadd: Allows the Chaplain to convert his null rod into a holy sword with crusader - knight armor - - tweak: Chaplain's closet is now a secure closet - - rscadd: Adds in Assault Gear crate to cargo - - rscadd: Adds in military assault belt - - rcsadd: Adds in spaceworthy swat suits - - tweak: tweaks bandolier to hold 2 additional shotgun shells - - tweak: bartender starts off with +2 additional shells - - tweak: Reduces the cost of the space suit crate and doubles its contents - - rscadd: Refactors knives so their behavior is more universal - - bugfix: Fixes Hulk not properly being removed when your health drops below a threshold - - bugfix: Fixes flickering vision in a mining mech - Tastyfish: - - rscadd: Poly has taken a seminar on the latest trends in engine operations. - - rscadd: Player-controller parrots can now hear their headsets. - Tigerbat2000: - - bugfix: The nuclear disk escaping on the shuttle no longer counts as a syndicate - minor victory. - - bugfix: Cultists can once again actually greentext the escape objective. -2016-01-24: - KasparoVy: - - bugfix: Fixes markings overlaying underwear. - - rscadd: Nude icon in underwear.dmi - - bugfix: Fixes Vox robes not using the correct on-mob sprites. - - bugfix: Fixes unreported bug where there was a slim chance during character preview - icon generation that a character with Security Officer set to high would get - rendered with either the wrong beret sprite or no beret sprite at all. - - bugfix: Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites. - Tastyfish: - - bugfix: Passively power-consuming borg modules, such as the peacekeeper movement - and shield module, won't spam the user infinitely if they're low on power anymore. -2016-01-29: - Crazylemon: - - bugfix: 'The DNA scanner has now undergone a seminar to recognize fake identities; - It will now scan the actual person''s identity, rather than their disguise (read: - wearing a mask with or without someone else''s ID).' - - rscadd: Matter eater now allows you to eat humans as if you were fat. - - tweak: Eating mobs with an aggressive grab now generates attack logs. - Crazylemon64: - - bugfix: For a short while, there was a clerical error where all AI communications - equipment was replaced with bananas. This has now been fixed. - - tweak: Ghosts can now see the contents of smartfridges and look at the drone console - - tweak: Humans now only produce one message when shaken while SSD - - bugfix: The supermatter no longer will irradiate everyone, everywhere, when it - explodes. - - tweak: Writing on paper will now add hidden admin fingerprints, so that you can't - forge mean notes in someone else's name. - - bugfix: Brains are no longer able to escape their brain by being a sorcerer. - - bugfix: Astral projecting with other runes on the same tile will now no longer - prevent you from re-entering - - bugfix: Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya! - FalseIncarnate: - - tweak: Allows plants to be identified as enhanced*. Enhancing plants results from - using reagents (like saltpetre) that affect the stats of a seed instead of using - mutagens/machines. *May not meet standards for being classified as "organic - produce". (This was already possible, just renames enhanced plants for easier - differentiation) - Fox McCloud: - - bugfix: Fixes mutadone not working with some genetic mutations - - bugfix: Fixes banana honk and silencer being alcoholic - - bugfix: Fixes Kahlua being non-alcoholic - - bugfix: Fixes polonium not metabolizing - - bugfix: Fixes being able to receive free unlimited boxes from the Merchandise - store - - rscadd: Adds in wooden bucklers - - tweak: Re-adds roman shield to the costume vendor - - tweak: Buffs Riot shield damage from 8 to 10 - - rscadd: Adds in a Skeleton race - - tweak: Tweaks the skeletons colors to be more realistic and to blend in less with - the floor - - rscadd: Adds in lichdom spell for the wizard - - rscadd: Adds in lesser summon guns spell for wizard - - rscadd: adds in Mjolnir and the singularity hammer as weapons the wizard can purchase - - rscadd: Wizard can purchase the charge spell from the spell book - - rscadd: Wizard can purchase a healing staff from the spell book - - tweak: Tweaks and lowers spell costs of utility spells for wizard - - tweak: Re-organizes the spellbook to be better divided into categories and have - a better window size - - tweak: Knock now opens+unlocks lockers - - tweak: Magic Missile has a slightly longer cooldown and no longer deals damage, - but has a lower cooldown is upgraded - KasparoVy: - - rscadd: Navy blue Centcom Officer's beret for use by the Blueshield. - - rscadd: Adds the new navy blue beret to the Blueshield's locker. - - tweak: Gives the Blueshield's berets (black and navy blue) the exact same strip - delay and armour as the Security Officer's beret. - - rscadd: Adds TG energy katana back and belt sprite. - - rscadd: Bo staff back sprite. - - tweak: Adjusts energy katana sprites to make the weapon stand out a bit more from - the regular katana. - - rscadd: Cutting open the toes of footwear so species with feet-claws can wear - them. - - rscadd: Toeless jackboots. - - tweak: Cleans up glovesnipping and lighting a match with a shoe. - - tweak: Lighting a match with a shoe produces a more appropriate message, handled - at the same standard as glove-snippingboot-cutting. - Tastyfish: - - rscadd: Cargonia now has its own section in the manifest. - TheDZD: - - rscdel: Due to budget cuts and reports of operatives accidentally firing enough - bullets to reach a state of what our scientists refer to as "enough dakka," - Syndicate High Command has decided to restore the Syndicate Strike Team arsenal - to using standard-issue L6 SAW ammunition. -2016-01-31: - Crazylemon64: - - bugfix: Syndicate borgs can now interact with station machinery - - rscadd: People with slime people limbs can now *squish - - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver - transplant will let them take alcohol like a champ - lacking a liver will have - the same effect as being a skrell, when drinking - FalseIncarnate: - - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs. - - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power. - Fox McCloud: - - rscadd: Updates Summon Guns and Magic to include many of the new guns - - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages - Tastyfish: - - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like - before. - - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red. - pinatacolada: - - rscadd: Adds NanoUI to the operating computer - - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the - computer, with a menu to selectively turn them on and off -2016-02-10: - Crazylemon64: - - tweak: The cloner now checks for NO_SCAN on the brain when scanning - unclonable - species are now truly unclonable. You are still able to revive them with a brain - transplant and a defib, however. - - rscadd: A tier-4 DNA scanner linked to a cloning system will now be able to reproduce - a body from a brain's DNA, in event of the original corpse being gibbed or similar. - - bugfix: Species with organic limbs and NO_BLOOD will no longer bleed (though still - on hit - write that off as "bone powder") - - tweak: Skeletons now lack internal organs, except for the runic mind which exists - in their head - an analogue for the brain - - rscadd: Skeletons that drink milk will be regenerated at a moderate pace, have - a small chance of mending bones, and will praise the great name of mr skeltal - - tweak: Adds a reagent system for species reacting to specific reagents - - rscadd: Slime People can now select from all human hairstyles, and their "hair" - will be tinted a shade of their body. - - tweak: Increases the frequency of the cortical borer event. - - tweak: People with borers cannot commit suicide - this applies to a controlling - borer, too. - - tweak: Borers can no longer overdose their hosts. - - tweak: Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, - Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic - at healing when directly injected. Salicyclic acid was removed too, as its functionality - is duplicated by both hydrocodone and saline-glucose. - - bugfix: A mind trapped by a cortical borer can now understand things it could - understand when normally in its body. - - rscadd: Changes chemistry's welding tank to a wall-mounted version, to increase - the room available. - - rscadd: You can now gib butterflies and lizards with a knife - - rscadd: Ghosts can now follow mecha - - bugfix: You can now access an R&D console by emagging it - it did nothing before. - - bugfix: Walls will now properly smooth and show damage. - - bugfix: Fixes the dialog that occurs when the AI shuts off to actually do what - it says it does - Fox McCloud: - - bugfix: Fixes not being able to attach IEDs to beartraps - - bugfix: Can no longer spamclick someone to death using headslamming on a toilet/urimal - - tweak: Toilet/urinal headslamming now plays a sound - - tweak: Toilet headslamming damage reduced slightly - - rscadd: Can now fill open reagent containers in a toilet to receive "toilet water". - - tweak: No more message spam when someone fills a container using a sink - - rscadd: Can now wash your face using a sink, which washes away lipstick and wakes - you up slightly - - tweak: Washing things will now use progress bars - - tweak: Ensures consuming a single syndicate donk pocket won't get you addicted - to meth - - tweak: Kinetic Accelerators and E-bows automatically reload - Glorken: - - rscadd: Added a Knight Arena for Holodeck. - - imageadd: Added red and blue claymore sprites. - - spellcheck: Changed overrided to overrode when emagging Holodeck computer. - KasparoVy: - - rscadd: Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden - SWAT sechailer. - - rscadd: Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin. - - rscadd: Warden now gets their own version of the SWAT sechailer in their locker. - - tweak: HOS now gets the appropriate version of the SWAT sechailer in their locker. - - tweak: Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin. - - tweak: Properly shades Vox bandana down-state sprites. - - rscadd: Readds Tajaran bald hairstyle. - - rscadd: Alternate style of non-Human breath mask (incl. surgical/sterile mask) - down-state positioning. - - tweak: Corrects all non-Human species' breath mask (incl. surgical/sterile mask) - down-state icons to use the right position style. - - tweak: Minor adjustments to Tajaran breath mask up-state sprites. - PPI: - - rscadd: Adds a reconnect button to the File menu in the client. - - rscadd: Adds head patting - Regen: - - tweak: Powersink can now drain a lot more power before going boom - - tweak: Buffed the powersinks drain rate - - tweak: Buffed explosion from an overloaded powersink, try to find it instead of - overloading the grid. - - rscadd: Admin log warning before the powersink explodes - Spacemanspark: - - rscadd: Miners can now utilize the power of mob capsules to take along their lazarus - injected mining creatures! - - rscadd: Store your Pokemo- er, sorry, I mean mining mobs that you've captured - in the lazarus capsule belt. - Tastyfish: - - bugfix: Species that don't breathe can kill themselves now! - - rscadd: Suicide messages are now catered to your species. - - tweak: Shortened the default pill & patch name when using the ChemMaster. - - rscadd: The chaplain now has a service radio headset, as Space Jesus intended. - TheDZD: - - tweak: When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is - now "Adminhelp." - - tweak: Mentorhelps and PM replies from mentors appear in a bold aqua blue color. - - tweak: Adminhelps and PM replies from admins appear in a bold bright red color. - - tweak: PM replies from players appear in a dull/dark purple color. - - rscadd: Adds admin attack log to players being converted to cult. - - rscadd: Adds shadowling thrall jobbans. - - rscadd: Jobbanned players who are converted to shadowling thrall, revolutionary, - or cultist will have the control of their body offered up to eligible ghosts. -2016-02-13: - Crazylemon64: - - tweak: Relaxes the check on what atoms you can follow to any movable atom - - tweak: Mages are now more ragin - - tweak: Admins can now adjust the total number of wizards at runtime by tweaking - either max_mages, or players_per mage - DaveTheHeadcrab: - - rscadd: Adds new worn icons for duffelbags to better reflect their size, compliments - of WJohn at /tg/ - FalseIncarnate: - - rscadd: Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), - cheese, and flat dough (because we lack proper tortillas) in the microwave. - - rscadd: Adds chimichangas. You know you want a deep-fried burrito. - Fox McCloud: - - tweak: Updates some spell icons with better/higher quality icons - - tweak: Updates unarmed attacks to allow for more customization - - tweak: Updates martial arts so they factor in specie's attack messages and sounds - - tweak: Re-balances Sleeping Carp fighting style - - tweak: Re-balances Bo Staff - - tweak: 'Rebalances Golem: they should now be spaceproof, fire+cold proof, rad - proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee - damage. Their armor has been reduced to 55 melee across the board, their slip - immunity removed, pain immunity removed, and they''re slightly slower' - - bugfix: Fixes Ei Nath generating two brains - - bugfix: Ensures the Necromatic Stone generates actual skeletons - - bugfix: Can now strip PDA/IDs from Golems - - bugfix: Fixes sleeping carp grab not being an instant aggressive grab - - bugfix: Fixes an exploit with declaring war on the station - KasparoVy: - - rscadd: Orange and purple bandanas for all station species. - - rscadd: The ability to colour bandanas with a crayon in a washing machine. - - tweak: Refactors the bandana adjustment system. - - tweak: Minor adjustments to Tajaran and Unathi bandana east/west sprites. - - tweak: Adjusting a bandana will now take if off of your head/face and put it in - an available hand. If both hands are available, it goes in the selected hand. - - bugfix: Adjusting a coloured bandana will no longer revert it to the original - coloured icons anymore. - - bugfix: Adjusting a bandana from mask-style to hat-style means the bandana won't - obscure your identity anymore. - - rscadd: Greys now use re-positioned smokeables. They no longer smoke out the eyes. - TheDZD: - - bugfix: Fixes spacepods being able to shoot through walls. - - tweak: Lowers spacepod weapons fire delay. - - tweak: Increases spacepod weapons energy costs. - - tweak: Makes spacepods move at speeds not rivaling those of photon beams. They - are now a hair bit faster than a person with a jetpack. - - tweak: Reduces battery costs for spacepod movement. -2016-02-24: - Crazylemon64: - - tweak: The defib should be more reliable on people who have ghosted - - tweak: The defib will now give a message if the ghost is still haunting about - - rscadd: Attacking someone with an accessory will now let you put things on them - without having to strip them. - - bugfix: Borers will now properly detach upon death of a mob they are controlling - - tweak: Borers can now see their chemical count while in control of a mob - - rscadd: Borers can now silently communicate with their host - this is not available - to the host until the borer has either begun to communicate, or has taken control - at least once - this is to avoid spoiling that the borer exists - - tweak: Borers won't be able to talk out loud inside of a host, by default - they - can remove this safeguard with a verb under their borer tab. Borer hivespeak - is unaffected. - - tweak: Borers infesting and hiding are now silent. - - tweak: Made borer's chem lists more nicely formatted - - bugfix: No more superspeed attacking simplemobs - - tweak: New players now show up properly under the "who" verb when used as an admin - - rscadd: Mining drones will now automatically collect sand lying around - - bugfix: RIPLEYs can now drill asteroid turfs for sand - - rscadd: You can now load exosuit fuel generators with items containing their material - - this means you can fuel yourself off of ores, but this will be highly inefficient - and cost you mining points later on, as you can't take fuel back out. - - rscadd: You can now load the fuel generators from an ore box. - - tweak: The plasma generator now produces 3x as much power from the same amount - of fuel - this lets it even remotely compete with the uranium generator. - - tweak: You can now light cigarettes off of burning mobs. - - tweak: Exosuit tracking beacons now fit in boxes - prior, they were far too large - for even a backpack, as they shared the same size as all other mecha equipment - - tweak: Miners can now collect ore by walking over it with an ore satchel on. - FalseIncarnate: - - rscadd: Adds prize tickets as a replacement for physical arcade prizes. - - rscadd: Adds a buildable prize counter to exchange tickets for prizes. - - rscadd: Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors. - - rscadd: Adds colorful wallets, for that old school arcade pride. - - bugfix: Fixes accidental removal of plump helmet biscuit recipe. - - rscadd: Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), - and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2) - - bugfix: Fixes Metastation. Seriously fixed a lot, just read the PR description - for the full list. - FlattestGuitar: - - rscadd: Adds IPC alcohol and a few derivative drinks - - tweak: IPCs can now drink and be fed from glasses - Fox McCloud: - - tweak: Laser eyes mutation no longer drains nutrition - - tweak: 'splits the EMP kit into two things: the standard EMP kit (2 grenades and - an implant), and the EMP flashlight by itself' - - tweak: nerfs heart attacks so they do less damage - - tweak: Pickpocket gloves now put the item you strip into your hands as opposed - to the floor - - tweak: Picketpocket gloves can now silently strip accessories - - tweak: Pickpocket gloves will no longer give a message for messing up a pickpocket - KasparoVy: - - bugfix: Adjusting masks while they are not on the face will no longer turn off - internals. - - bugfix: Adjusting masks while they are not on the face will now cause the mask - to hide/reveal the wearer's identity the next time it's worn as intended. - - rscadd: Adds the ability to open/close bomber jackets. - - rscadd: Adds a security bomber jacket. This jacket inherits the protection and - storage capabilities as a standard Security vest with additional bomber jacket - benefits. - - rscadd: Adds UI button in top left of screen for jacket adjustment. - - tweak: Replaces the standard bomber jacket in the Pod Pilot bay with the Security - version. - - tweak: Centralizes jacket/coat adjustment handling. - - tweak: All jackets start closed by default. - - rscadd: Geneticist duffelbag on-mob sprite (for all species). - - rscadd: Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit. - - tweak: Refactors back-item icon generation. - - bugfix: Typo in the description of Santa's sack. - - bugfix: Missing punctuation and gender macros in the description of the bag of - holding. - - bugfix: The tweak to back-icon generation fixes a bug where the wrong sprite name - was being used to generate back-item icons. - PPI: - - rscadd: Adds the ability to hide papers in vents. You can now leave a romantic - love letter, exchange information in secret, or hide papers infused with the - power of nar'sie from sight. - Regen1: - - rscadd: Adds the Immolator laser gun, a modified laser gun with 8 shots that will - ignite mobs, can be made in R&D - Spacemanspark: - - rscadd: Adds *yes and *no emotes to Synthetics. Glory to Synthetica. - Tastyfish: - - tweak: The PDA system has been completely redone behind the scenes! It should - be functionally similar, although there is now a Home and Back button at the - bottom as appropriate. - - rscadd: All of the heads now have multicolored pens. - - rscadd: EngiVend now has 10 camera assemblies. - - tweak: Borgs can now use vending machines. - - rscadd: There are now picture frames that can be made from the autolathe or wood - planks for papers, photos, posters, and canvases! - pinatacolada: - - tweak: Makes the Protect Station AI law board no longer consider people that damage - the station crew, instead of human - ppi: - - tweak: When revealed Revenants will not be able to move at the maximum move speed, - nor be able to pass through any solid object, like walls, windows, grills, computers - and mechs. -2016-02-26: - FalseIncarnate: - - tweak: Chocolate can now make you fat, as expected. - Fox McCloud: - - tweak: stamina damage now regenerates slightly faster - - rscadd: Adds in whetstones for sharpening objects - - tweak: Kitchen vendor starts off with 5 salt+pepper shakers - - tweak: Can now point while lying or buckled - - bugfix: Fixes Capulettium Plus not silencing - - bugfix: Fixes slurring, stuttering, drugginess, and silences last half of what - they should - KasparoVy: - - bugfix: Jackets that start open are recognized as actually being open already - now. This fixes a bug with certain items that don't have an open state, or cases - where it ended up giving an item the wrong icon (one that didn't exist) - Spacemanspark: - - bugfix: Fixes synthetics from giving off the proper message in the chat box when - using the *yes and *no emotes. - Tastyfish: - - rscadd: Wheelchairs, janicarts, and ambulances can now go through doors according - to the user's driver's access. -2016-03-07: - Crazylemon64: - - rscadd: People with VAREDIT can now write matrix variables - - rscadd: People with VAREDIT can now modify path variables - - tweak: Refactors the variable editor code somewhat. - - rscadd: The buildmode area tool now shows reticules of what you've selected. - - bugfix: Switching mobs while using the buildmode tool no longer screws up your - UI. - - tweak: Refactors buildmode so it's no longer a special-case system. - - rscadd: Adds a copy mode to build mode, which lets you duplicate objects. - - tweak: Any mob in buildmode can work at the fastest possible rate. - - bugfix: Fixed a problem where the icons of a person would not correctly update - when changing gender. - - tweak: One's hairstyle only adjusts on gender change if it's incompatible with - your new gender. - - bugfix: Fixed a bug where a person's icon would only be updated if their sprite - had a new layer added or removed. - - bugfix: You no longer lose your name when monkeyized and reverted - you'll still - look like a monkey while you're a monkey, though. - - bugfix: Your organs will now match your gender when you are cloned. - - bugfix: Skeletons (when a body rots) no longer retain a fleshy torso. - - bugfix: Putting people in an active cryotube now produces the message on insertion, - rather than release. - - bugfix: An EMP'd cloning pod will now display its sprites correctly. - FalseIncarnate: - - tweak: Water Balloons can be filled from more sources than just beakers and watertanks. - Fox McCloud: - - bugfix: Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, - on use - - bugfix: Noir mode only activates when the glasses are equipped to your actual - eyes - - rscadd: Noir Glasses mode can be toggled on or off (defaults to off) - - bugfix: Mimes can no longer use spells and continue speaking - - tweak: Mime abilities are now spells with proper icons - - tweak: Mime wall now last 30 seconds, up from 5 - - tweak: forecfields/invisible walls now block air currents - - rscadd: Adds the Sleeping Carp scroll to the uplink for 17 TC - - bugfix: Fixes Shadowlings being able to use guns - - bugfix: Fixes sleeping carp scroll users being able to use guns - - bugfix: Fixes the Experimentor throwing one item at a time - - tweak: Experimentor menu now automatically refreshes after use - - tweak: Lowers surgery times across the board - - tweak: Removes scalpels causing 1 damage on successful surgery - - tweak: Removes random chance to fracture ribs on a successful surgery - - tweak: Mining drills now have an edge - KasparoVy: - - tweak: Jackets who have the verb available but are not intended to be adjusted - will not have the action button available. - - bugfix: You can now adjust breath masks while buckled into beds and chairs. - - bugfix: Known issues with adjusted jackets using the wrong sprites. - - rscadd: Blueshield coat in hand and item icons. - - rscadd: Hulks now rip apart adjustable and droppable jackets. The items stored - in the jackets get dropped on the ground. - Tastyfish: - - tweak: Infrared emitters can now be rotated while already in an assembly via the - UI popup. - - tweak: The infrared emitter can no longer be hidden inside of boxes and still - work. - - rscadd: The beach now has a border and is splashier. - - rscadd: Gives Psychiatrist a paper bin, clipboard, and multicolored pen. - - rscadd: Gives the Librarian / Jouralist a multicolored pen. - - rscadd: Gives the NT Representative a clipboard. - - tweak: The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being - confused with the deadly toxin. - VampyrBytes: - - bugfix: Fixes emotes ending with s needing 2. Emotes now work with grammatical - options eg ping or pings, squish or squishes - - tweak: Updated emote help with missing emotes. Help will also show any species - specific emotes for your current species -2016-03-08: - Crazylemon64: - - tweak: Slime people are now more vulnerable to low temperatures. - - rscadd: Slime people are able to slowly regrow limbs at a high nutrition cost. - - rscadd: Slime people now slowly shift color based on reagents inside of them - - disabled by default, toggle it with an IC verb - - tweak: Slime people's cores are more vulnerable to damage - - bugfix: Species-related abilities now properly are removed - no more vox hair - stylists, unfortunately. - Fethas: - - bugfix: the nest buckle now looks for the right organ path - - bugfix: Fixed some sprites. - - bugfix: No more putting no drops in rechargers, - Fox McCloud: - - soundadd: Implement's goon's gibbing sound - - soundadd: Implement's goon's gibbing sound for robots/silicons - - sounddel: Removes old gibbing sound - Spacemanspark: - - rscadd: Lazarus Injector's can now be emagged to activate their special features, - alongside using EMPs on them. - Tastyfish: - - rscadd: Mimes now have a new ore, Tranquillite, used to bring peace and quiet - to the station. - - rscadd: There are also permanent invisible walls and silent floors that can be - made from tranquillite. - - rscadd: The Recitence mech is now buildable! - - tweak: The Recitence mech is now playable! - - tweak: Mid-round selection for various creatures and antagonists now consistently - asks permission. - TheDZD: - - rscadd: Adds justice helmets with flashing lights and annoying sirens. - - rscadd: Adds crates containing said helmets. - - rscadd: Also includes a version of the helmet that can only be spawned by admins, - and just has a single red light in the center instead of the stereotypical police - blinkers. - monster860: - - bugfix: Space pod transitions are now fixed. -2016-03-16: - Crazylemon64: - - tweak: Being in godmode now makes you immune to bombs - - rscadd: Science members now get compensated when they ship tech disks to centcomm. - - rscdel: Science crew are no longer paid when they "max" research. - - bugfix: Roboticists now get credit for making RIPLEYs and Firefighters - - tweak: Slime people can now regrow limbs on a more lax nutrition requirement - - tweak: Enhances the nutripump+ to let slime people regrow limbs with it active - - bugfix: Skeletons, slime people, IPCs, and Diona no longer leave blood when hit - - bugfix: Rejuvenating a slime person will no longer clog up their "blood" - - tweak: Slime people will now regenerate "blood" from having water in their system - - tweak: The decloner can now be created again - - rscadd: Environment smashing mobs can now destroy girders. - DaveTheHeadcrab: - - tweak: Removes the check for species on the update_markings proc. - FalseIncarnate: - - tweak: Xeno-botany is now more user-friendly, and less random letters/numbers. - - rscadd: Hydroponics now has a connector hooked up to the isolation tray and a - new connector in their back room for those strange plants that like spewing - plasma or eating nitrogen. - - rscadd: You can now (finally) build the xeno-botany machines, and science can - print off their respective boards. - Fethas: - - tweak: Syringes are no longer sharp - - bugfix: byond likes direct pathing so item/organ/internal not item/organ even - if it shouldn't be in the internal_organs list. This was preventing the list - from doing stuff correctly. - - tweak: fixed ipc organ manipulation surgery, you can now insert a replacment ipc - organ directly instead of needing a screwdriver in your main hand - - bugfix: nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase - i am an idiot - - bugfix: Fix, hopefully, for a runtime for clientless mobs whos head are cut off... - - bugfix: Hopefully fixes issues with diona eyes - - bugfix: Though shalt not eat robotic organs..including cybernetic implants.. - - bugfix: ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL - FlattestGuitar: - - rscadd: Adds three new synthanol drinks - - tweak: Drinking synthanol is now a bad idea if you're organic - - tweak: A glass of holy water now looks like normal water - Fox McCloud: - - soundadd: Adds in drink fizzing sound - - tweak: Drink/bartender recipes use this new fizzing sound in addition to a few - other recipes - - soundadd: Adds in a fuse burning sound - - tweak: Bath salts, black powder, saltpetre, and charcoal use this sound now - - soundadd: Adds in a matchstrike+burning sound - - tweak: Lighting a match triggers this new sound - - soundadd: Adds in scissors cutting sound - - tweak: Cutting someone's hair uses this new sound - - soundadd: Adds in printer sounds - - tweak: printing off papers from various devices typically uses these sounds - - soundadd: Adds computer ambience sounds - - tweak: black box recorder and R&D core servers both play this sound at random - rare intervals - - tweak: Reduces the tech level (and requirement) for nanopaste - - tweak: Reduces the tech level (and requirement) for the plasma pistol - - tweak: Removes Nymph and drone tech levels - - tweak: Reduces tech levels on the flora board - - tweak: Adds tech level requirements to mech sleepers, mech syringe guns, mech - tasers, and mech machine guns - - tweak: Increases tech cost of the decloner - - tweak: Removes the pacman generators - - tweak: Removes emitter - - tweak: Removes flora machine (functionless anyway) - - tweak: Removes the pre-spawned nanopaste - - tweak: Removes space suits - - tweak: Removes excavation gear - - tweak: Replaces the soil with actual hydroponic trays (more aesthetic than anything) - - tweak: Removes most external asteroid access from the station - - tweak: Excavation storage is now generic science storage - - tweak: removed the plasma sheet - - bugfix: Fixes augments not showing up in R&D unless specifically searched for - - bugfix: Fixes some augments being unavailable in mech fabs - - bugfix: Fixes augments having no construction time - - bugfix: Fixes xenos not gaining plasma when breathing in plasma - - bugfix: Fixes plasma reagent not generating plasma for a person - - rscadd: Screaming has different sounds based on being male or female - - soundadd: Implements Goon's screaming sounds. - - rscadd: Screaming tone is now based on age of character instead of being random - - tweak: Ups the cooldown on screaming from 2 seconds to 5 seconds - - tweak: Removes chance for Whilhelm scream - - rscadd: Borgs can now scream - - rscadd: Monkey's now have a unique screaming sound - - rscadd: IPCs now scream like cyborgs - - rscadd: Updates slot machines to have higher jackpots and more payouts with more - interesting sounds - - rscadd: 'Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink - (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, - which inserts and implant without surgery' - - tweak: tweaks a large number of chems; behaviors are largely retained, but new - flavor messages, probabilities, etc may be present; overall, you can expect - chems to do the same thing - - tweak: 'Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed - on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all - produce cholesterol in your body.' - - rscadd: Mixing Sarin, Meth, or Cyanide will poison in a very small area of the - reaction if you're not on internal OR not wearing a gas mask - - rscadd: Chemist warddrobe now has two gas masks - - tweak: Teslium will now impact synthetics AND organics - - bugfix: Fixes facehuggers hugging already infected people - - bugfix: Fixes facehuggers hugging people while dead - - bugfix: Fixes Embryo's developing twice as fast as they should - - bugfix: Fixes up some behaviors with xeno eggs - - tweak: Xeno acid can now melt through floors and the asteroid - - rscadd: Xeno's now play the gib sound when actually gibbed - - rscadd: Implements Changeling headcrabs/headspiders - - bugfix: Fixes xenos not throwing their organs when gibbed - - bugfix: Fixes swallowed mobs not being ejected when a human is gibbed - - rscadd: Adds in spider eggs reagent, an infectious reagent that requires surgery - to correct - - bugfix: Fixes EMPs causing eye implant users to be permanently blind - - tweak: Increases bag of holding's storage capacity - - rscadd: Removing a heart no longer kills the patient instantly, but induces a - heart attack - - bugfix: Demon hearts will not work - - bugfix: Should now actually be able to re-insert hearts - - rscadd: Reworks addictions to bettter differentiate them betweeen overdosing and - make them more realistic. - - tweak: 'changes which chems are addictive, currently, the follow reagents are - now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, - omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird - cheese, ephedrine, diphenhydramine, teporone, and morphine' - - rscadd: sleepers help you recover from addiction faster - - rscadd: Can now make cable coils in autolathes - - bugfix: Fixes the slot machine announcements not displaying properly - Tastyfish: - - tweak: The super fart mutation now gives you a spell-like ability instead of augmenting - the emote. - - tweak: Vampire abilities are now in their own Vampire tab, as well being action - buttons at the top, like spells. - - bugfix: Cloning a vampire no longer makes them lose their abilities. - - bugfix: Vampires can no longer hypnotize chaplains. - - bugfix: Being a full vampire (500+ total blood) actually makes you immune to holy - water reliably now. - - rscadd: 'Some old away missions are back: Academy, Black Market Packers, Space - Hotel, Station Collision, and Wild West. Go out and round up some hostiles!' - - bugfix: Shuttle consoles now pair up to the engineering, mining, research, or - labor shuttle when built or used before pairing, as long as the shuttle is near - the console, or the shuttle is moved to be nearby. - monster860: - - rscadd: Mining station now has a podbay. - - rscadd: Ore scooping module for the spacepod. - - rscadd: 'Three mining lasers for spacepod: Basic, normal, and burst.' - - bugfix: Shooting weapons south or west of spacepod will actually hit adjacent - targets now, and won't shoot through walls anymore. - taukausanake: - - rscadd: Mice can now be picked up like diona -2016-03-22: - Crazylemon64: - - bugfix: Repairs all sorts of eldritch occurences that happen when you put an organic - head on an IPC body, as well as some decapitation bugs - - bugfix: Makes heads keep hair on removal - - bugfix: Amputated limbs from a DNA-injected individual now will keep their appearance - of the DNA-injected person - - bugfix: Wounds will vanish on their own now - - rscadd: Admins now have an "incarnate" option on the player panel when viewing - ghosts for quick player instantiation - - bugfix: Fixes a runtime regarding failing a limb reconnection surgery - - bugfix: Copying a client's preferences now overrides the previous mob's DNA - - bugfix: A DNA injector is now more thorough, and affects the DNA of mobs' limbs - and organs - - bugfix: DNA-lacking species can no longer be DNA-injected - - bugfix: Brains are now labeled again - - rscadd: Splashing mitocholide on dead organs will make them live again. - - rscadd: The body scanner now detects necrotic limbs and organs. - - bugfix: pAIs and Drones are now affected by EMPs and explosions while held. - Fethas: - - rscadd: Adds a surgery for infection treatmne/autopsys that is simply cut open, - retract, cauterize - - bugfix: fixes a dumb error in internal bleeeding surgerys - - rscadd: Chaos types no longer random teleport, but will make the target hallucinate - everyone looks like the guardian. - FlattestGuitar: - - rscadd: Adds a snow, navy and desert military jacket. - Fox McCloud: - - tweak: Removes random 1% chance to heal fire damage - - tweak: Removes passive healing from resist heat mutation - - tweak: Regen mutation heals every cycle (albeit less, on average), but doesn't - cost hunger - - bugfix: Fixes not being able to speak over xeno common or hivemind when you receive - the Xeno hive node - - rscadd: Adds in the ability to transfer non-locked metal+glass only designs from - the protolathe to autolathe - - tweak: Changes Outpost Mass Driver to prevent accidental spacings - - tweak: Shadow people no longer dust on death, are rad immune+virus immune, and - can be cloned. Slip immunity removed - - tweak: Shadowlings no longer get hungry or fat and no longer dust on death - KasparoVy: - - rscadd: The ability to change your head, torso and groin as an IPC in the character - creator. Non-IPCs cannot access the parts. - - rscadd: Head, torso and groin sprites for all mechanical limb/bodypart brands - but Morpheus and the unbranded ones (since those already exist) from Polaris. - - rscadd: Faux-eye optics for non-Morpheus heads. - - rscadd: The ability to change optic (eye) colour if you've got a non-Morpheus - head. - - rscadd: The ability to choose human hair styles (wigs) and facial hair styles - (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. - Conversely, Morpheus heads cannot choose wigs or facial hair. - - rscadd: Two hair styles from Polaris. - - rscadd: The ability for IPCs to wear undergarments (shirts and trousers). - - rscadd: Antennae (colourable) for IPCs. - - tweak: IPC monitor adjustment verb will now adjust optic colour if the head is - non-Morpheus. - - bugfix: Combat/SWAT boots can now be toecut and jacksandals can't. - - bugfix: ASAP fix to what would've broken the ability to configure prostheses in - character creation. - - bugfix: Adjusted masks no longer block CPR (including bandanas). - - bugfix: You can no longer run internals from adjusted breath masks (or airtight - adjustable masks in general). - Regens: - - tweak: Robotic hearts will now properly give the mob a heart attack instead of - just damaging it when EMP'd - - rscadd: Assisted organs will now also take damage from EMP's - - bugfix: Internal robotic and assisted organs will now actually take damage from - EMP's - Tastyfish: - - rscadd: Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get - caught! - - tweak: You can now set the PDA messenger to automatically scroll down to new messages. - - rscadd: Pet collars now act as death alarms and can have ID's attached to them. - - tweak: All domestic animals can now wear collars. - - rscadd: You can now make video cameras at the autolathe. - TheDZD: - - bugfix: Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly - idiotic. - TravellingMerchant: - - imageadd: Kidan have new sprites! - tigercat2000: - - rscadd: Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean. - - bugfix: Lighting overlays can no longer go below 0 lum_r/g/b - - bugfix: Shuttles will work with lighting better. - - bugfix: Wizards can no longer teleport to prohibited areas such as Central Command. -2016-03-25: - Crazylemon64: - - bugfix: You now will actually have the correct `real_name` on your DNA. - - bugfix: No more roundstart runtimes regarding IPC hair. - - bugfix: Mitocholide rejuv will work more usefully now. - - bugfix: Limbs and cyborg modules will no longer appear in your screen. - - bugfix: Cyborg module icons are now persistent throughout logging in and out. - - bugfix: Various cyborg modules, like engineering, now use the proper icon. - FlattestGuitar: - - rscadd: Adds confetti grenades. - Fox McCloud: - - bugfix: Fixes Sleeping Carp combos not having an attack animation - - bugfix: Fixes several chems not properly healing brute/burn damage, consistently, - as intended - KasparoVy: - - bugfix: Unbranded heads and groins no longer invisible. - - bugfix: Zeng-hu left leg will now be in line with the body when facing south. -2016-03-26: - Fox McCloud: - - rscadd: Adds in dental implant surgery. Implant pills into people's teeth. - - tweak: Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 - for details). In general, Shadowlings can no longer enthrall or engage in Shadowling - like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with - a ride array of New abilities such as extending the shuttle or making thralls - into lesser shadowlings. Shadowling gameplay should not revolve almost entirely - around darkness, as opposed to pre-hatch shenanigans. - - rscadd: Robotics now has a "sterile" surgical area for performing augmentations - - rscadd: Adds the FixOVein and Bone Gel to the autolathe - - tweak: ensures all surgical tools have origin tech on them; lowers origin tech - on FixoVein - KasparoVy: - - rscadd: Slime People can now wear underwear. - - rscadd: Slime People can now wear undershirts. - TheDZD: - - tweak: NT has removed trace amounts of a highly-addictive substance from the "100% - real" cheese used in cheese-flavored snacks. As a result, incidence rates of - crewmembers becoming addicted to Cheesie Honkers should reduce to zero. - - tweak: After receiving complaints about crewmembers often being unable to physically - function without a back-mounted barrel of coffee, NT has replaced station all - sources of coffee on the station, including coffee beans themselves with a largely - decaffeinated version. It was funny the first time almost every crewmember aboard - the NSS Cyberiad was lugging around their own oil barrel filled with coffee, - it wasn't so funny, nor good for productivity the eighteenth. -2016-04-02: - Crazylemon64: - - rscadd: Metal foam walls will now produce flooring on space tiles - - bugfix: Syringes will now draw water from slime people. - FalseIncarnate: - - tweak: Let's you know when your container is full when filling from sinks. - - tweak: Prevents splashing containers onto beakers and buckets that have a lid - on them. - - rscadd: Pill bottles can now be labeled with a simple pen. - - tweak: Beakers/buckets (and pill bottles) now accept 26 character labels from - pens. - Fethas: - - tweak: Various spells have had a tweak to stun/reveal/cast, some other number - stuff... - - rscadd: Nightvision - - tweak: harvest code is now in the abilites file. - - rscadd: New fluff objectives - - bugfix: Hell has recently remapped its blood transit system and you can now once - again crawl through blood. We are sorry for the-GIVE US YOUR SOUL! - FlattestGuitar: - - tweak: Alcoholic beverages now have proper levels of ethanol in them. Good luck - passing out after a beer. - Fox McCloud: - - rscadd: Adds in the Lusty Xenomorph Maid Mob; currently admin only. - - bugfix: Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect - name - - tweak: removes xenomorph egg from hotel - - tweak: upgrades are no longer needed to for the available toys in the prize vendor - - rscadd: Implements Advanced Camera Consoles. A type of camera console that function - like AI's vision style. Non-buildable/accessible. - - rscadd: Adds in Xenobiology Advance Cameras. A type of camera console that functions - like advanced cameras, but only works in Xenobiology areas; can move around - slimes and feed them with the console as well. Also non-buildable/accessible - (for now). - - rscadd: Adds in cerulean slime reaction that generates a single use blueprint. - On use it colors turfs a lavender color - - rscadd: Adds disease1 outbreak event - - rscadd: Adds appendecitis event - - rscadd: Roburgers now properly have nanomachines in them - - rscadd: Re-adds nanomachines - - tweak: Experimentor properly generates nanomachines instead of itching powder - - bugfix: Fixes big roburgers having a healing reagent in them - - rscadd: Adds nanomachines to poison traitor bottles - - rscadd: Tajarans can now eat mice, chicks, parrots, and tribbles - - rscadd: Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, - parrtos, and tribbles - - bugfix: fixes spawned changeling headcrab behavior - KasparoVy: - - bugfix: Incisions made at the beginning of embedded object removal surgery can - now be closed in the same procedure. - ProperPants: - - rscadd: Maint drones have magboots. - - rscdel: Removed plastic from maint drones. Literally useless for station maintenance. - - tweak: Increased starting amounts of some materials for maint drones and engi - borgs. - - experiment: Reduced the number of lines taken by Engineering cyborgs calling on - materials stacks. - - rscadd: Operating tables can be deconstructed with a wrench. - - spellcheck: Fixed and shortened description of metal sheets. - Tastyfish: - - rscadd: Bots can now be controlled by players, by opening them up and inserting - a pAI. *beep - - bugfix: MULEbots can now access the engineering destination. - - bugfix: All MULEbot destinations should now have the correct load/unload direction, - meaning the crates won't be dumped inside the flaps. - - rscadd: Diagnostic HUD's now give health and status information about bots. - - bugfix: MULEbot rampage blood tracks are now rendered correctly and handle UE - traces as appropriate. - - experiment: Bots should (hopefully) lag the game less now. - - tweak: Beepsky contains 30% more potato. - - tweak: Action progress bars are now smooth. - - tweak: Clicking a filled inventory slot's square with an open hand now clicks - the item in the slot. - - rscadd: Status displays now display the time when in Shuttle ETA mode and no shuttle - activity is happening. - - tweak: Shuttle ETA countdowns on status displays are now amber. - - rscadd: pAI's can now use the PDA chatrooms. - - rscadd: Adds treadmills to brig cells, to give the prisoners something productive - to do. - TheDZD: - - rscdel: A lot of the guns and armor in the station collision, space hotel, academy, - and wild west away missions have been removed/replaced. - - rscdel: Removes that fucking facehugger from station collision. - tigercat2000: - - rscdel: Virus2 has been removed. - - rscadd: Virus1 is back. Viva la revolution. - - rscadd: You can now have up to 20 characters. -2016-04-07: - Crazylemon64: - - bugfix: Removes an offset from the advanced virus stealth calculation, causing - viruses to be more stealthy than the sum of their symptoms. - - bugfix: Mulebots will now send announcements to relevant requests consoles on - delivery again. - FalseIncarnate: - - rscadd: Adds logic gates, for doing illogical things in a logical manner. - - rscadd: Adds buildable light switches, for all your light toggling needs. - - bugfix: Fixes a resource duplication bug with mass driver buttons. - Fethas: - - tweak: maybe makes them last longer...maybe..and fixes the event end message - Fox McCloud: - - rscadd: Maps in the slime management console to Xenobio - - tweak: Reduces Xenobio monkey box count from 4 to 2 - - bugfix: Fixes weakeyes having a negligible impact - - rscadd: Can spawn friendly animals with a new gold core reaction by injection - with water - - tweak: Hostile animal spawn increased from 3 to 5 for hostile gold cores - - tweak: Swarmers, revenants, and morphs no longer gold core spawnable - - bugfix: Fixes invisible animal spawns from gold core/life reactions - - rscadd: Adds tape to the ArtVend - - tweak: Can no longer use sentience potions on bots - - rscadd: Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's - more toxic than regular plasma and generates plasma gas when spilled onto turfs. - - tweak: Slimecore reactions now require plasma dust as opposed to dispenser plasma - - rscadd: Added in new Rainbow slime; inject with plasma dust to get a random colored - slime. Acquire by having 100 mutation chance on a slime when it splits. - - rscadd: Monkey Recycler can produce different types of monkey cubes; change the - cube type by using a multitool on the recycler - - tweak: Epinephrine/plasma reagents changing mutation rate has been removed - - tweak: Mutation chance is inherited from slime generation to slime generation - as opposed to being purely random. - - tweak: 'New reactions added for red and blue extracts: red generates mutator, - which increases mutation chance, and blue generates stabilizer, which decreases - mutation chance.' - - tweak: Slime glycerol reaction removed - - tweak: Slime cells are now high capacity cells (more power than before) - - tweak: extract enhancer increases the slime core usage by 1 as oppose to setting - it to three - - tweak: slime enhancer increases slime cores by 1 as opposed to setting the core - amount to 3 - - tweak: Chill reaction lowers body temperature slightly more so it doesn't just - wear off instantly - - tweak: Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox - - bugfix: Processors no longer produce 1 more slime core than intended - - bugfix: Less blank/spriteless/empty foods from the silver core reaction - - tweak: Virology mix reactions now use plasma dust as opposed to plasma - - tweak: Statues can no longer move/attack people unless they're in total darkness - or all mobs viewing them are blinded - - tweak: statues are invincible to anything other than full out gibbing. - - tweak: Statues flicker lights spell range increased - - tweak: Blind spell no longer impacts silicons - - bugfix: Fixes statues being able to attack/move whenever they feel like it, regardless - of client statues - - bugfix: Fixes blind spell impacting the statue - Tastyfish: - - tweak: Beepsky is no longer a pokemon. - - tweak: pAI-controlled Bots now reliably speak human-understandable languages over - the radio. - - rscadd: More floor blood for the blood gods. (Or rather, as much as there was - supposed to be.) - tigercat2000: - - rscadd: Items in your off hand will now count towards access. -2016-04-12: - FalseIncarnate: - - tweak: Adjusting the setting of a vendor circuit board is no longer random, but - instead provides a select-able list. - - tweak: Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, - acid requirement replaced by metal. - - bugfix: Burnt matches can no longer light cigarettes, pipes, or joints. - Fethas: - - rscdel: Nukes the cargo train code rscadd:Adds simple vehicle framework and converts - secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, - red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and - secway onto metastation (but not ambulance no pareamedic garage, no i am not - mapping that) - - bugfix: You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully - surgery on diona works right - Fox McCloud: - - rscadd: Adds in TraitorVamp; game mode that's essentially like TraitorChan, but - with a Vampire instead of a Changeling - - tweak: Vampires cannot use holoparasites - - tweak: Malf AI will automatically lose if it exits the station z-level - Tastyfish: - - tweak: All cats can kill mice now. - - tweak: E-N can't suffocate. - - tweak: Startup time is now shorter. - - rscdel: Removed the Station Collision away mission from rotation, due to multiple - conceptual and technical issues. -2016-04-14: - Aurorablade: - - rscdel: Removes the !!FUN!! of having headslugs gold core spawnable. - Fox McCloud: - - soundadd: Added in sounds (instead of a chat-based message) for when airlocks - are bolted/unbolted - - soundadd: Added in sound for when airlocks deny access - - tweak: cutting/pulsing wires will play a sound - - tweak: ups nuke ops game mode population requirement from 20 to 30 - - rscadd: Adds in mining drone upgrade modules to increase their health, combat - capability, or reduce their ranged cooldowns - - rscadd: Adds in mining drone "AI upgrade" a sentience potion that only works on - mining bots - - tweak: Mining bots should be less likely to shoot you when attacking hostile mobs - - tweak: Killer tomatoes actually live up to their name now and are hostile mobs - - tweak: Killer tomatoes are an actual fruit now; activate it in your hands to make - them into a mob - - tweak: Killer tomatoes are directly mutated from regular tomatoes instead of blood - tomatoes - - tweak: Increased the yield of regular tomatoes by 1 - - tweak: Tweak some stats on the killer tomato seeds - - bugfix: Fixes the blind player preference not doing anything - - rscadd: Adds portaseeder to R&D - - tweak: Scythes will conduct electricity now - - tweak: Mini hoes play a slice sound instead of bludgeon sound - - tweak: Plant analyzer properly has a description and origin tech - - tweak: Can have hulk+dwarf mutations together - - tweak: Can have heat+cold resist together - - tweak: Can only remotely view people who also have remote view - - bugfix: Fixes cold mutation not having an overlay - - bugfix: Hallucinations will no longer tick down twice as fast as they should nor - will they spawn twice as many hallucinations as they should - - bugfix: Incendiary mitochondria no longer asks who you want to cast it on (it - always is meant to be cast on yourself) - - bugfix: Fixes permanent nearsightedness even when wearing prescription glasses - KasparoVy: - - tweak: 'Head accessories now behave like facial hair: They will no longer be hidden - by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).' - - bugfix: Wearing a piece of clothing that blocks head hair will no longer make - head accessories (facial markings/horns/antennae) invisible until an icon update - is triggered while the headwear is off. - Meisaka: - - bugfix: law manager no longer freaks out with Malf law - Tastyfish: - - tweak: The /vg/ library computer interface has been ported, giving a much better - use experience. - - rscadd: Books can now be flagged for inappropriate content. - TheDZD: - - rscdel: Removes shitty Caelcode bees. - - rscadd: Hydroponics can now manage bee colonies, bees produce honeycombs that - can be ground to obtain honey, a decent nutriment+healing chemical - - rscadd: Hydroponics can inject a queen bee with a syringe of a reagent to alter - her DNA to match that reagent, meaning all honeycombs produced will contain - that reagent in small amounts - - rscadd: Bees with reagents will attack with that reagent. It takes 5u of a reagent - to give a bee that reagent. - - rscadd: Added the ability to make Apiaries and Honey frames with wood - - rscadd: Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey - - rscadd: Added the ability to make more Queen Bees from Royal Bee Jelly by using - it on an existing Queen, to split her into two Queens - - rscdel: Removes some snowflakey mob behavior from bears, snakes and panthers. - - rscadd: Hudson is feeling punny. - - experiment: Hostile mob AI should now be a bit more cost-efficient. - monster860: - - rscadd: Adds area editing, link mode, and fill mode to the buildmode tool -2016-04-20: - Crazylemon64: - - rscadd: Bureaucracy crates now contain granted and denied stamps. - FalseIncarnate: - - bugfix: Anomalies will now be properly neutralized by signals that match their - code and frequency, instead of using the default frequency and their code. - FlattestGuitar: - - rscadd: Adds shot glasses. - Fox McCloud: - - tweak: Removes the ability to put a pAI into securitrons and ED-209's - - imageadd: Drinking glasses now have an in-hand sprite - - tweak: DNA injectors no longer have a delay when used on yourself - - tweak: DNA injectors no longer delete on use, but become used, much like auto-injectors - - bugfix: Fixes a bug where you can exploit the genetic scanner to get multiple - injectors - - bugfix: Fixes not being able to cancel creating an DNA injector - - tweak: remove spacesuits causing injections to the head to take longer - - bugfix: FIxes heat resist mutation not making you immune to high pressure, fire, - or high temperatures - - tweak: removes some not-well-known damage resists from cold/heat mutations - - tweak: Re-maps botany a bit to make it more bee and botanist friendly - - rscadd: Adds in Abductors Game Mode - MarsM0nd: - - tweak: Embeded object removal is now done with hemostat again - - rscadd: Borgs are able to do embeded object surgery - Tastyfish: - - tweak: Makes the server startup substantially faster. - monster860: - - bugfix: Crowbarring open a spesspod doors is no longer broken - tigercat2000: - - rscadd: -tg- thrown alerts have been added. This means you get an alert when buckled - or handcuffed or many many other things happen to you. It then gives you a tool - tip when you hover over it, and it may or may not do something when you click - it. Have fun! -2016-04-25: - CrAzYPiLoT: - - rscadd: Adds buildable holographic gameboards that, when opened, produce a fully-functional - JavaScript chess interface, which includes a chess AI. If you win, it will produce - 80 tickets for your spending! - FlattestGuitar: - - tweak: a human's species is now visible on examination - Fox McCloud: - - rscadd: Improves attack animations with items, making it more clear who's attacking - you and with what - - tweak: Updates Revolution game mode so it better scales with total player population - - tweak: Head revs start off with a flash, spraycan, and chameleon security HUD - - rscadd: Add chameleon security hud, which is basically sec shades with the ability - to disguise as a number of regular glasses - - rscadd: Updates mining loot crates to feature far more actual loot - - tweak: Mining loot crates are now opened by inputting a 4 digit password and have - 10 tries to guess the password string - - bugfix: Fixes bees, mech syringes, and darts not properly calling INGEST for a - reagent - Meisaka: - - bugfix: The light on/off function for drones works again, toggling between lowest - setting and off. - - bugfix: Guardians can toggle their lights off and on again. - - bugfix: AI, pAI, robots and drones can now use *yes emote without extra ss on - the end. - - rscadd: emote *help for silicons updated/added. - - tweak: '*twitch_s emote changed to *twitches, incorrect variations of some emotes - can no longer be used.' - tigercat2000: - - rscadd: Added 4 new HUD styles, "Operative", "Plasmafire", "Retro", and "Slimecore" - - rscadd: You can now view HUD changes in real-time, by going to Preferences (top - right tab) > Game Preferences and changing the HUD style (limited to humans). - - rscadd: There are now three HUD styles you can get via the f12 button- Full, which - contains all of your buttons, Minimal, which only contains a few essential buttons, - and None, which is a completely blank screen. - - rscdel: Removed the remaining aiming code due to maintainability issues and incompatibility - with HUD styles. - - tweak: Mobs with HUD's now use a unique subtype instead of an anti-OOP else-if - chain. - - tweak: Refactored how objects (IE, stuff you pick up) is rendered to the HUD. - This should fix the reoccuring "stuff on my screen that definately isn't meant - to be there" bug, but keep an eye out for things that do not appear. -2016-05-04: - CrAzYPiLoT: - - rscadd: Adds gameboards to bar and permabrig. - Crazylemon64: - - bugfix: AIs are no longer created for temporary messages. - Fethas: - - rscadd: Sniper Rifles for nuke ops. - - bugfix: you can now actually shove heads on spears again. - - tweak: Before i removed the traitor chemist item i cleaned up the harm reaction - code paths. - FlattestGuitar: - - tweak: cheap lighters only damage your hand if you fail to properly use such a - complicated contraption, not the whole body - - rscadd: ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with - style/ - Fox McCloud: - - rscadd: Slime batteries now self-recharge. - - rscadd: Adds in door wands--control doors from range - - rscadd: Each head of staff (and the QM) starts off with a door wand to control - the doors in their respective departments - - bugfix: Fixes nutrition alert icon kicking in too early - - rscadd: Adds in a new hairstyle - - bugfix: Fixes cig icons not updating under some circumstances - - tweak: Updates the Tesla; it will now have to be "fed" or it can run out of energy; - the rate at which it gains additional energy balls and power has been greatly - lowered. - - tweak: energy ball will now be drawn towards the singularity beacon - - tweak: fuel tank explosions a bit stronger and will arc tesla blasts further - - tweak: Tweaked some game mode population requirements to enhance general game - mode balance and player experience. - - tweak: Reworks overdosing to have more unique effects and also scale, in part, - on volume - - tweak: Epinephrine, Atropine, and Ephedrine have a lower OD threshold - - tweak: Saline penetrates the skin - - tweak: Synaptizine and Teporone now have OD threshold - - rscadd: Adds in berserker disease (treat with haloperidol) - - rscadd: Adds in Jenkem, a nasty gross drug made with toilet water - - rscadd: Adds in food poisoning; get it from eating poorly made food, from salmonella, - or fungus - - rscadd: 'Adds in the Shock Revolver, a replacement for the stun revolver remove: - removes the stun revolver remove: removes the prototype SMG+ammo from the protolathe' - IK3I: - - bugfix: Can no longer holster items with No-Drop active. - - bugfix: Saves prosthesis users from Tox-Comp's wrath - KasparoVy: - - bugfix: Disembodied prosthetic heads that aren't monitors won't make you go bald - when they're re-attached. - - bugfix: '''Optic'' markings will disappear when your head gets removed, and reappear - if it gets re-attached.' - - bugfix: Disembodied prosthetic heads that aren't monitors will now be rendered - with hair & facial hair. - - bugfix: Disembodied prosthetic heads with optical markings (markings with the - head set as the origin) will be rendered with those markings. - - bugfix: Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new - antennae) will now be animated properly. - - rscadd: 3 more antennae. - - rscadd: An alt. and monitor head model for every prosthetic brand but Zeng-hu. - Morpheus only gets an alt model, not another monitor. - - rscadd: Animated optical markings to fit the new alt. heads. - - rscadd: Screen styles for the alt. Hesphiastos head. - - tweak: Companies that make prosthetic body parts can (and do) now offer separate - models for qualified recipients. - - tweak: Removed the frames from screen styles in order to allow the same styles - to be applied to all monitor heads. - LittleBigKid2000: - - rscadd: Booze dispensers can now dispense synthanol - Norgad: - - rscadd: Adds a disposals chute to the Mechanic's Workshop - QuinnAggeler: - - rscadd: Adds the Drask as a 30KP race - - rscadd: Adds their language, Orluum - - rscadd: Adds a stylecolor for their language - - rscadd: Adds their butts (for photocopying) - - rscadd: Adds, at last, another race with skin tone (humies move over) - - rscadd: Adds a reason to make bad ice puns - - bugfix: Adds a check for brain death (brain damage of 120 or more) to the proc - responsible for reviving IPCs - pinatacolada: - - tweak: Makes fridge boards be selectable by screwdriving them - - bugfix: Virology fridge now accepts syringes, beakers, and bottles - - bugfix: Plasmamen security now spawn with their suit slot items in their bags - - tweak: Pod pilots spawn with taser in the suit slot - - tweak: removes armor from plasmamen magistrate suits -2016-05-10: - Crazylemon64: - - bugfix: Ragin' Mage creation works correctly again. - FalseIncarnate: - - rscadd: Adds a Briefcase Full of Bees as a Botanist-only traitor item (10 TC) - - bugfix: Fixes worker bees having an insatiable desire to murder bots. (Syndi-bees - still murder them though) - FlattestGuitar: - - tweak: Robots now slur and stutter robotically - - rscadd: Adds tape gags. Click on someone with a roll of tape to shut them up! - Fox McCloud: - - tweak: Removes material efficiency upgrades from the mech fab and protolathe - - tweak: Ore redemption machine sheets/points per ore scaled from 1 up to 2 (down - from 1 up to 4) - - bugfix: Fixes materials exploit duplication - - bugfix: Fixes the protolathe locking up under some circumstances - - tweak: 'Updates the laser cannon to be range based: the further its projectile - travels, the more damage it does. Base damage greatly reduced.' - - tweak: removes fungus from mushrooms - - tweak: adds fungus to "mold" plant - - tweak: adds mold seeds to hydro vendor - - tweak: bumps up ???? reagent from 1 to 5 on bad recipes - - rscadd: 'Adds in 3 disease: Grave Fever, Space Kuru, and Non-contagious GBS' - - rscadd: Adds Reagent to cause Space Kuru and Non-contagious GBS to traitor poison - bottles - - rscadd: Initropidril now has a recipe - - rscadd: Adds a number of new reagents - - tweak: Brain burgers now contain prions instead of mannitol - - tweak: Scientists and chemists can no longer purchase traitor poison bottles - - tweak: random drug bottles now have a much wider range of reagents in them - - bugfix: Fixes UI On slot machine saying it costs 5 credits when it's 10 - - bugfix: Fixes abductors having tails - - bugfix: Fixes traitor scissors having a different hair-cutting sound - - bugfix: Fixes simple animals not dying right away when they reach zero health - - bugfix: Fixes a few farm animals, simple xenos, and a hivebot from having incorrect - health - - tweak: Buffed health pack usage on simple animals (should heal roughly 20 damage - on them, per use) - - tweak: Emotes no longer need to be purely lowercase to work - - rscadd: Chaplain can now select a green book as his Bible - - rscadd: Adds in His Grace, a hijack-only traitor item for the Chaplain - IK3I: - - rscadd: Added key and tumbler based pod locks - - rscadd: Made Pod Locks and keys buildable in Pod Fabricator - - rscadd: Made Pod Keys recoverable from cryo - - rscadd: Added lock to Security Pod - - rscadd: Added a key for Security Pod to HoS and Pod Pilot Offices - - rscadd: New sprites for several pieces of pod equipment - - bugfix: Using a multitool on a decalock now gives usable info - NTSAM: - - bugfix: Fixes the stuttery rainbow screen for IPCs. - - bugfix: Fixes the green IPC screen. - QuinnAggeler: - - rscadd: Adds a sound emote for the Drask - - rscadd: Gives Drask the ability to eat soap - - rscadd: Adds a racial flag for the Drask - - bugfix: Makes syndicate, paramedic, clown, and EVA helmets display correctly on - Drask - tigercat2000: - - rscadd: The station blueprints can now show you where wires/pipes/disposal pipes - are supposed to go. -2016-05-17: - AugRob: - - rscadd: Add screwdriver sound when opening/closing panels on airlocks - Fox MCCloud: - - tweak: Removes "harm" traitor objective - - tweak: Increases non-escape/hijack/die objectives from 1 to 2 - - tweak: Tweaks available objectives to traitors a bit - Fox McCloud: - - tweak: Players can no longer see how many players have readied up or who has readied - up - - tweak: Hulks, Shadowlings, and Golems can no longer use laserpointers - - rscadd: Adds in the ability to flip over someone with *flip - - tweak: Fixes and improves foam to better interact with reagents - KasparoVy: - - tweak: Refactors hair so it's on the head (organ). - - tweak: Adjusts some Vox hair style names so they're consistent with all others. - - tweak: Refactors Morph and the order by which options are presented. - - tweak: Players with heads of a different species than the body will now only be - able to access the head accessories, hair/facial hair styles of the head's species. - - bugfix: Fixes some typos. - - bugfix: Fixes a bug where hairgrownium made you bald and super hairgrownium only - changed the hair/facial hair styles of Humans. - - bugfix: Fixes a bug where Morph wouldn't correctly set eye colour or skin tone. - - bugfix: Fixes a typo that didn't really have any negative effect on the beard - organ to begin with. - - bugfix: Fixes bugs where Alopecia and Facial Hypertrichosis disease symptoms wouldn't - update player sprite correctly. - - rscadd: Adds a new Vox hairstyle. - - rscadd: You can now change your head accessory (and its colour), body markings - (and their colour), and body accessory if you're a species that has such things - via the Morph genetic power and C.M.A. (the bathroom SalonPro Nano-Mirrors and - admin verbs). - monster860: - - bugfix: Fixes sleep() in telecomms - - rscadd: Windows can now be constructed and deconstructed using RCD's. -2016-05-20: - Fox McCloud: - - bugfix: Fixes Chaplains being able to be vampires - - bugfix: Cryopods will now always display the occupant's name - KasparoVy: - - bugfix: Fixes a runtime with Dioneae by repathing their limbs. - QuinnAggeler: - - bugfix: Makes dehydrated space carp description more accurate and informative - monster860: - - rscadd: Adds the permanent teleporter. Use the circuitboard on a teleporter hub - to set the target before constructing it. -2016-05-24: - CrAzYPiLoT: - - rscadd: Adds the ability to attach signalers to bear traps. Stealthy hunting! - Crazylemon64: - - rscadd: You can now fasten the circulators in the TEG kit with a wrench - no adminbus - needed to set it up, now - - rscadd: You can now rename cassette tapes with a pen. - - rscadd: You can now wipe data from a tape from its right-click menu. - FalseIncarnate: - - rscadd: 'Adds 4 new types of fudge for the chef to make: Peanut, Chocolate Cherry, - Cookies ''n'' Cream, and Turtle Fudge.' - - tweak: Normal fudge recipe now uses milk instead of cream. - - tweak: Mutant/Modified/Enhanced plants will no longer infinitely increase their - name length, and instead will be simply "mutant", "modified", or "enhanced" - plant as determined by the last type of modification they were subject to. - - tweak: Bees can no longer phase through hydroponics lids, giving botanists a way - to finally stem the tide of pollination. - - bugfix: Premade beeboxes now spawn with the right type of bees, specifically of - the worker caste. - Fox McCloud: - - tweak: Donk pockets have more omnizine, but only upon fully consuming the donk - pocket - - tweak: swarmers will drop an artificial bluespace crystal on death - - tweak: Orion Trail guards now drop an energy shield and C20R on death - - tweak: Reviving simple animals with strange reagent will prevent them from dropping - any further loot - KasparoVy: - - bugfix: Rejuvenating a mob now unbuckles them correctly (if they're buckled to - something). - - bugfix: Rejuvenating a mob will no longer remove their hair. - - bugfix: Rejuvenating a mob will no longer permanently blacken their eyes. - - bugfix: Rejuvenating a mob will no longer remove their prostheses with fleshy - limbs, it will just fix the prostheses. - - bugfix: Rejuvenating a mob will not remove organs/limbs belonging to other species - if said organs/limbs are in the same place(s) as the mob's default organs/limbs - would be. - - bugfix: Fixes a runtime when trying to flip with an object other than a grab in - your hand. - - bugfix: Doing a 'cybernetic repair' procedure on the head of a disfigured IPC - will re-figure them. - - tweak: Rejuvenating a mob will only regrow organs/limbs that are missing (by comparison - to the standard organs for their species). - - tweak: The regenerate_icons proc will now update skin tone and body accessories - properly. - - rscadd: Organ rejuvenation now clears disfigurement and closes open wounds. - - rscadd: Rejuvenating a mob will end all in-progress surgeries. - - rscadd: Vox get their cortical stacks back, since the non-implant ones don't interfere - with the Heist game-mode. - - rscadd: Rejuvenating a long-dead or husked mob will now clear the appropriate - mutations. - QuinnAggeler: - - rscadd: Species disguise variable for clothing items - - rscadd: Species disguise string, "High-tech robot," for cardborg suit and helmet - - tweak: ABSTRACT flagged clothing items will not be displayed on examination - Tastyfish: - - rscdel: Removes n2 pills healing vox oxyloss, and o2 pills poisoning vox. - monster860: - - rscadd: Adds the floor painter. Sprite by FlattestGuitar -2016-05-25: - CrAzYPiLoT: - - rscadd: Adds an unread change notification. - Fox McCloud: - - tweak: Removes Dragon's Breath Recipe - - tweak: Removes Ghost Chilli Juice - - bugfix: Fixes buckled flipping over someone - IK3I: - - bugfix: Sleepers, scanners, and borg chargers no longer remove you from existence - when destroyed - - bugfix: Hostile mobs are no longer fooled by your clever scanner and recharger - tricks -2016-05-31: - CrAzYPiLoT: - - bugfix: Fixes potential exploits involving door remotes. - - rscadd: Adds another type of remote door control. - Fox McCloud: - - rscadd: Allows Chaplain to select a wide new range of null rod customizations - - tweak: Slightly increases null rod damage (15->18) - - bugfix: Fixes abductors speaking other languages - - bugfix: Fixes traitors getting less TC on some game modes - QuinnAggeler: - - tweak: All lazarus revived mobs become valid for pet collaring - Tastyfish: - - rscadd: Adds a suicide for light tubes. - - experiment: Progress bars, buttons, and several of the values in UI's are now - animated. - - tweak: Deconstructing glass tables now gives a stack of 2 sheets of glass. - monster860: - - tweak: Upgrading the experimentor will no longer reduce the chance of upgrading - an item's tech - - rscadd: Guest passes can now be attached to an ID card. - - rscadd: Adds a HoP guest pass computer, which is like a normal guest pass computer, - but using an ID with ID computer access will allow it to issue guest passes - with any access. - - rscadd: Adds the HoP guest pass computer to the HoP office. - - rscadd: Moves the guest pass computer in robotics to RnD. -2016-06-02: - CrAzYPiLoT: - - bugfix: Fixed a text problem in virtual gameboard description. - - rscadd: Made gameboards deconstructable and movable. - - tweak: Added a light to gameboards. Pretty! - Crazylemon64: - - bugfix: There will no longer be a mountain of startup runtimes when people have - custom languages. - DaveTheHeadcrab: - - tweak: Removes xenobio golem rune creation sound - - rscadd: Added overlays for sec belts that reflect the items stored therein. - Fox McCloud: - - bugfix: Fixes Chapel and Chaplain's office not having a light switch - - bugfix: Fixes mass driver only being usable once due to weird pressure - - bugfix: Fixes chapel being overly dark near coffins - - bugfix: Fixes not being able to sheath the claymore in the Crusader Armor - IK3I: - - rscadd: crate cargo system - - rscadd: passenger seat system - - rscadd: loot box secondary cargo system (install it and your pod has a standard - inventory) - - rscadd: lock busters for the CE and Armory - - bugfix: incappacitated people can't operate the door controls anymore - - bugfix: Items dropped in a pod can now be scrounged up - - bugfix: security can rip you out of an unlocked pod - - bugfix: The pod code isn't full of tumors any more - Tastyfish: - - bugfix: Holsters now have an action button while on your suit again. - monster860: - - rscadd: 'Adds the following words to the AI announcer: active, airlock, alcohol, - arrival, arrivals, becoming, between, blob, briefing, camp, chair, chapel, closet, - cyberiad, declared, detective, diona, dock, docked, docking, docks, drask, drunk, - emag, equipment, evacuation, experimentor, gateway, hail, hallway, holoparasite, - honk, hull, ian, imminent, interested, intruders, kida, kidan, labor, library, - mime, mimes, miner, miners, mining, n2o, nuke, office, op, operational, ops, - pod, pods, poly, pun, renault, representative, runtime, scrubbers, sequencer, - skree, skrek, skrell, space, spider, spiders, still, stupid, swarmer, swarmers, - sword, technology, teleport, teleported, teleporter, teleporting, tesla, tool, - unathi, vacant, vault, vents, vulpkanin, weld, window, windows, yet' -2016-06-12: - CrAzYPiLoT: - - bugfix: Fixed the long-lasting bug of handcuffed people keeping their chainsaws. - Crazylemon64: - - bugfix: No more language message-spam on roundstart - DaveTheHeadcrab: - - rscadd: Adds a new icon for the detective's scanner. - - tweak: Detectives scanner now has access to DNA and fingerprint records. - Fox McCloud: - - rscadd: 'Adds three new chaplain weapons: pirate saber, multiverse sword, and - possessed/talking sword' - - bugfix: Fixes not being able to sheath the claymore in the Crusader Armor - - rscadd: Adds in a mocha drink - - bugfix: Fixes ice being unobtainable for the jobs that use it most - - bugfix: Fixes laser armor losing its reflecting ability - - bugfix: Fixes the lack of progress bars for more stack-based construction - - bugfix: Fixes Experimentor producing coffee machines instead of cups - - tweak: Can deconvert mindslaves by removing their mindslave implant - - tweak: Can deconvert Vampire thralls by feeding them holy water - - bugfix: Fixes mindslaves not having a HUD for the master and mindslave - - bugfix: Fixes being able to duplicate just about anything in the Experimentor - - bugfix: Fixes not being able to use tank transfer valves or one tank bombs in - the Experimentor. - - bugfix: Fixes infinite-throw spam - - bugfix: Fixes being able to resist out of grabs by moving (that is to say, it'll - actually work now) - - bugfix: Fixes passive grabs using the wrong HUD icon - - tweak: Tabling duration reduced from 5 to 2 - - tweak: Can no longer wield double-bladed energy swords as a hulk - - bugfix: Fixes on map stools having the wrong offsets, making it look like you're - not sitting on them - FreeStylaLT: - - rscadd: Added (Enabled) Mind Batterer for Traitors - - spellcheck: Fixed uplink implant description (Said 5 when actually gave you 10 - TCs) - Glorken: - - bugfix: Shifts Zeng-Hu left leg over in order to regain thigh gap. - - bugfix: Chops off a pixel on Bishop feet so that they fit into shoes. - KasparoVy: - - tweak: Old placeholder IPC butt sprite replaced with the finished QR-code sprite. - Krausus: - - bugfix: Fixes ghosts failing to follow mobs that move in unusual ways - - bugfix: Fixed tape allowing mobs with sufficient access to move through solid - objects. - Many -tg-station Coders, TheDZD: - - rscdel: Old gun code is now gone. - - rscadd: Ports the vast majority of TG's gun code and their guns (any previously - unavailable guns, and newly-added guns will remain unavailable to players). - Expect some changes that might not be listed here due to the sheer scope of - this refactor. - - rscadd: Probably some new bugs. - - bugfix: A lot of old gun bugs. - - rscadd: Mouth suiciding with a gun no longer instantly kills you, you fire the - gun at yourself at 5x damage (assuming it even did damage to begin with). - - tweak: Mouth suicide shooting does not work on harm intent. - - tweak: You can now bash people with guns while on harm intent instead of shooting - them point-blank. - - rscadd: You can now mouth suicide other people, doing so still takes the full - 12 seconds to mouth suicide, but has the same 5x damage multiplier. - - tweak: Vox spike throwers are real guns that fire spike bullets now, instead of - just being fake guns that threw spikes. They do 25 damage per hit, have 30 armor - piercing, cause a 1 second stun (not the kind that drops you to the floor), - and cause some bleeding. They have 2 round burst fire as well, and have 10 shots - per clip. A new should should recharge every 20 or so seconds. - - tweak: Xray lasers now have a maximum range of 15 tiles. - - bugfix: Zoomed guns now actually fire accurately while zoomed. - - rscadd: Using Suicide with guns now actually does gun-like things. - - tweak: The clown no longer deletes guns if he fucks up with them due to being - clumsy. - - bugfix: Emitters no longer become inaccurate over long ranges. - - tweak: Power gloves now override middle-click and alt-click when worn. - - tweak: Power gloves give a notification when worn. - - tweak: Power gloves now have special examine text when examined by an antagonist. - - tweak: Proto SMGs now only have a 21 shot clip. - Spacemanspark: - - rscadd: Adds the ability to make a more irritated buzz noise at people as a synthetic. - The original buzz is still there. - Tauka Usanake: - - rscadd: Adds more belt icon overlays - Twinmold: - - rscadd: Nar'Sie AI Hologram and Error Sprite - - bugfix: Fixes space pod equipment variable. Can now properly install/uninstall - equipment. - - bugfix: Check Seat verb no longer pulls out installed equipment. - - bugfix: You can now have a passenger in your pod if you have a passenger seat. - monster860: - - rscadd: Adds comical implant. It is an implant that causes you to have a comic - sans voice. It can be made in the protolathe using bananium. - - rscadd: The comical implant now spawns by default inside IPC clowns - - bugfix: Fixes the window getting stuck when you try to drag or resize a NanoUI - window too fast with Fancy NanoUI enabled - - bugfix: Fixes a small quirk with the resize handle. - - bugfix: Fix javascript error in cargo UI - pinatacolada: - - bugfix: removes atmos tech SOP from supply SOP - - bugfix: Fixes defibing people without a heart - - bugfix: Fixes defib saying it didn't work stopping a heart attack when they do -2016-06-19: - DaveTheHeadcrab: - - tweak: Defibs now must be used within 3 minutes of death. - - tweak: Combat defibs now induce heart attack when you stun with them (Emagged - defibs have a 10^ chance to do this) - Fox McCloud: - - rscadd: Adds in the ability to make latex glove balloons (cable coil+latex glove) - - bugfix: Fixes latex gloves not having an in-hand icon for the left hand - - rscadd: Telephones will now ring when activated in-hand - - tweak: Force on telephones removed - - tweak: The break room privacy shutters now apply to all windows in the medical - break room and not just the ones out front - - tweak: His Grace grants massive stamina regeneration - - tweak: pre-made styptic, silver sulfadiazine, and synth flesh patches now apply - instantly - - tweak: Styptic and Burn patches now have unique icons - - bugfix: Partially fixes graffiti so it's actually visible - FreeStylaLT: - - spellcheck: changed its to it's in lockbox description - - bugfix: changed \red to formatting - - tweak: changed stetchkin's price from 9 TC to 4 TC, suppressor's from 3 TC to - 1 TC - KasparoVy: - - bugfix: Secure briefcase now has the same flags, hitsounds, attack verbs, throw - speed and carrying capacity as a regular briefcase. Yes, it can hold paper bins - now. - - bugfix: Dethralling a Shadowling thrall that has darksight activated clears their - darksight. - LittleBigKid2000: - - bugfix: The vox raider's base is now filled with nitrogen instead of regular dusty - air. - TheDZD: - - bugfix: Teaches camera assemblies the meaning of the word "respect" (for NODROP - items). - - bugfix: Sates the insatiable hunger that orange shoes once had for secborg cuffs. - - rscdel: Cryodorms will no longer kick you to lobby if you have logged off when - they despawn your body, they will now always ghost you. - - tweak: The defense values on the riot armor helmet is now identical to those on - the riot armor suit. - - tweak: Knight armor (including the chaplain's crusader armor) now has a slowdown - of 1 instead of no slowdown. - Twinmold: - - bugfix: Fixes being able to eat cybernetic implants so you cannot eat them/force - feed them to people. - - tweak: Lowers the range of Malfunction from 4 tiles to 2 tiles, due to ability - to insta-kill IPCs/incapacitate those with mechanical hearts. - - tweak: Lowers amount of confusion given from Revenants from 50 to 20 per Defile. - - bugfix: Sets a maximum confused amount from the Revenant's Defile ability (now - 30). - - bugfix: Makes Syndicate Bombs show a more accurate time remaining until detonation. - monster860: - - tweak: Makes stock parts build 5x faster - - tweak: Adds a last-second loop-back sort pipe so that items with a mail tag don't - end up on the disposals conveyer, and get flushed right back around. This enables - an item to be sent from anywhere on the station to anywhere else on the station - without going through the disposals conveyer. - - bugfix: Fixes a bug where drones can get stuck if they have their destination - set to the RD office. This also fixes the bug where attempting to send a package - from the test lab always ends up in the RD office. - tkdrg, Delimusca, Aranclanos, TheDZD: - - rscadd: Gun mimics (including wand, staff, projectile guns, and energy guns) created - by the staff of animation will shoot things. - - rscadd: Mimics created by the staff of animation now have googly eyes. - - bugfix: Fixes the disturbing lack of death caused by wand of death projectiles. -2016-06-28: - CrAzYPiLoT: - - tweak: Replaced the current recycler sound with a new one. - DaveTheHeadcrab: - - rscadd: Adds workboots to be worn by engineers. - - bugfix: Fixes the scanner's search functionality. - FalseIncarnate: - - bugfix: To save on adhesive costs, Nanotrasen has stopped gluing stools to the - floor. The resulting bodily injuries probably won't cost more than the glue. - Fethas: - - rscadd: you can now pick up potted plants and stealth - FlattestGuitar: - - tweak: changes some alcohol values, the weaker ones are no longer as weak - - tweak: refactored alcohol, you can now take short breaks between sips and still - pass out in a gentlemanly manner - - tweak: different species have different levels of alcohol resistance, check in - with your bartender for more information - - tweak: The medical HUD will now be a bit smoother. Neat. - Fox McCloud: - - rscadd: Warden starts off with a pair of Krav Maga Gloves - - rscadd: 'New Steal objective: steal the warden''s krav maga gloves' - - rscadd: Clonepods will automatically suck in nearby meat - - rscadd: Slime processors will automatically suck in nearby dead slimes - - bugfix: Actually fixes vamp chaplains - - bugfix: Fixes clumsy check on guns not working properly, resulting in people with - glasses shooting themselves in the foot - - rscadd: pAI candidates can now see who requested them - KasparoVy: - - rscadd: Adds Yi to Vox-pidgin syllables. (Port from VG.) - - rscadd: Adds framework for icon-based skin tones. (Port from VG.) - - rscadd: Adds Vox-compatibility for all remaining eyewear. - - rscadd: Raiders now get a random skin tone and eye colour on spawn. - - rscadd: Species default hair, facial hair and head-accessory colours can now be - defined. - - rscadd: Newly created Vox mobs will spawn with the same hair colour as they used - to have pre-greyscaling. - - bugfix: Noir vision will no longer grey out the HUD. (Port from VG.) - - bugfix: Tails will not be coloured if the person's species doesn't have skin colour. - - bugfix: Vox hair (head and facial) have been greyscaled and can now be customized - by the full colour range. - - bugfix: IPC parts from the mech fabricator won't turn IPCs invisible upon attachment - anymore. - Krausus: - - rscadd: Added a custom runtime error handler. - - rscadd: Added an in-game runtime viewer. - Kyep: - - rscadd: Admins now hear boink sound when faxed, command sends ERT request, etc - - rscadd: Admins can reply to faxes via radio - - rscadd: Admins can reply to faxes with pre-written fax templates - - rscadd: Admins can reply to faxes with 'evil faxes', special faxes that have negative - effects on their intended recipient (and nobody else) - - rscadd: Admins can now join as "Nanotrasen Navy Officer", and "Special Operations - Officer". They spawn on adminstation and ERT office, respectively. They are - not announced and do not appear on crew manifest. - - tweak: '"Select equipment" verb outfits tweaked for consistency with the above - job outfits' - - bugfix: Teleporter on admin station now works. - - bugfix: Added antag-only warning to bee briefcase, to reduce chances of traitors - killing themselves with it. - LittleBigKid2000: - - rscadd: Space explorer corgis can now safely explore space - Norgad: - - rscadd: Maintenance around the incinerator has been expanded. - - rscadd: Engineering maintenance finally has an APC. - - rscadd: The incinerator has been moved eastward, there is now a construction area - in it's previous location. - Tastyfish: - - bugfix: Cryo tubes, sleepers, and body scanners now eject random items the occupant - dropped, upon the occupant being ejected. - TheDZD: - - rscadd: Adds an adminbuse gun that fires gun mimics, you can varedit the gun's - `mimic_type` var to any gun path, and it'll fire that gun as mimics. By default - it fires stetchkin pistol mimics. - - bugfix: Fixes minor issues caused by some guns having text paths for power cells. - - bugfix: Fixes some runtimes and inconsistencies with the telegun and temperature - gun. - - tweak: The Tesla engine has acquired a grudge for lockers, and will now smite - any in its path. - - bugfix: Unstable bluespace teleportation devices have been removed from energy - guns, meaning they should no longer teleport from one hand to another when switching - firing modes. - Twinmold: - - bugfix: You can once again resist borer control with the Resist verb. - VampyrBytes: - - rscadd: Emotes can now be accessed through verbs as well as say * - - rscdel: Emotes accessed through say * no longer take parameters after a - - - rscadd: Emotes now take parameters through input boxes - - rscadd: Emotes now have support for blind and deaf characters - - rscadd: Emotes now personalise messages - - tweak: Flip can now be targeted with or without a grab - - tweak: All emotes that are affected by being muzzled now make the user make some - kind of noise - - bugfix: monkeys now have access to all the emotes that the npc tries to perform - - rscadd: Leap genetics ability lets you jump over things - monster860: - - tweak: UI now gets it's own plane - - tweak: RnD console now uses NanoUI! Sweet! - - bugfix: Fixes tranquillite being outside the box in the materials list. Mimes - are supposed to be trapped inside a box, not outside one. - - tweak: Replaces the weird unicode "x" character in some design names with the - actual letter "x" so that it doesn't fuck up NanoUI - - rscadd: RCD gets a UI - - rscadd: RCD-built airlocks can now receive different types and accesses. - - rscadd: You can now shift-click to examine as silicon, instead of ctrl-shift-clicking, - which is something absolutely no one would guess. - - bugfix: Pulsing multiple doors' "open door" wires at the same time using a remote - signaller now actually opens them at the same time. - - bugfix: Fixes wormhole projector not having an icon. - - tweak: Wormhole projector has 0 failchance now. - - rscadd: Portals made by wormhole projectors can be removed via a multitool - - bugfix: Fixes ghost being able to request docking at trader ship consoles - tigercat2000: - - rscadd: Ported goon HTML chat from /vg/ / Goon - - tweak: All uses of \black have been removed - - tweak: All uses of \icon have been replaced with bicon() - tkdrg: - - rscadd: Admins now have a verb to wipe all scripts from telecomms. -2016-07-02: - Fethas: - - bugfix: adds comfirmation dialogs to transforms from player panel - Fox McCloud: - - rscadd: Adds in laughter demons - - rscadd: Can summon laughter demons as a wizard - - rscadd: Chem master can produce instantaneous medical patches if all chems are - safe - - rscadd: Can now purchase sniper rifle and associated ammo on uplink during nuke - ops - - tweak: Most melee and laser armor values halved or reduced; some bullet armor - reduced slightly - - tweak: Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still - slow though) - - tweak: Mining armor caps out at 60 melee resist as opposed to 80 - - tweak: Ling melee armor reduced; bullet and laser values buffed a bit and slowdown - removed - - tweak: Chameleon jumpsuit has a little bit of armor - - tweak: Detective's forensic jacket now has identical armor to the native detective - jacket - - tweak: Armor penetration added to energy swords, chainsaws, scythes, and spears - - bugfix: Fixes stun batons, telebatons, and abductor batons piercing/bypassing - shields - FreeStylaLT: - - rscadd: Adds appropriate battle yells to sleeping carp - KasparoVy: - - imageadd: Engineer boots that've had their toes cut open now have a sprite. - - imageadd: Vox now have engineer workboot sprites. - - imagedel: Removes unused SWAT boot sprites that were really just copypasted jackboot - sprites. - Krausus: - - tweak: The late-join job listing is now big enough to show all the jobs at once, - and organizes them into labeled categories. - - bugfix: Fixed Hotkey Help and hotkey mode toggle messages not appearing. - - tweak: The late-join job listing will now ignore (mis)clicks for the first second - after popping up. - Kyep: - - tweak: '"Loyalty" implants are now known as "Mindshield" implants' - - tweak: Admins playing CC jobs can no longer get antag status from autotraitor. - Tastyfish: - - rscadd: There's essentially a completely new space hotel map! Explorers rejoice! - TheDZD: - - tweak: Chance for vampires to burn in the chapel has been greatly reduced (from - a 35% chance down to 8% per tick). - - tweak: Vampires do not scream from chapel/space burning until they actually start - catching fire. - - tweak: Threshold for vampires to catch fire from space/chapel burning changed - from 60 health to 50 health. - - tweak: Fire stacks from vampire burning no longer apply twice 35% of the time - while below the health threshold. - VampyrBytes: - - bugfix: No more *me emoting from your corpse! - monster860: - - bugfix: Fixes ghosts having a generic icon when darkness is toggled off - tigercat2000: - - rscadd: There's a new tab in the character setup screen, "loadouts". This allows - you to spawn with a limited number of preset items. - - tweak: 'Character setup now uses #defines for the different tabs.' -2016-07-07: - Ar3nn: - - tweak: Adds tech levels to RnD console main menu - FalseIncarnate: - - bugfix: Chicks no longer lose their souls (literally) when becoming adults. - - bugfix: Intercoms, fire alarms, and air alarms no longer contain internal portals - to a realm of infinite cables and circuit boards. - Fox McCloud: - - tweak: Space lube damage removed and duration reduced from 7 to 5 - - tweak: Azide and CLF3+Firefighting foam now play a bang sound when mixed - - rscadd: Can now pet pAI's with help intent - - bugfix: Fixes sechuds and nightvision sechuds having flash protection - FreeStylaLT: - - rscadd: Added windows and a missing firelock to Genetics/Cloning - - tweak: Tweaked layout of Genetics slightly - - rscadd: Added photocopier to R&D. - - tweak: Tweaked RD's office layout slightly - - tweak: Changed access on Tcomms' external airlocks' buttons to be same as general - Tcomms access - - bugfix: fixed the airless tiles in Assembly Line's windows - KasparoVy: - - imageadd: Adds improved Vox mask/goggle sprites. - - imageadd: Adds Vox-compatible versions of most suits. - - rscadd: Adds species-fitting and icon override handling to clothing accessories - and suit collars. - - rscadd: You can now open/close Clown Officer and Soldier coats. - - rscadd: Adds by-species tail hiding. - - tweak: Tidies up and refactors the way the Captain's space helmet shows Vox hair - but hides every other species'. - - bugfix: Reactive armour's sprite will now update as soon as you turn it on/off - or EMP it. - Krausus: - - bugfix: Fixed borers dying in hosts who happened to be somewhere cold, such as - space. Even if their host was in a space suit. - - bugfix: Fixed borers forgetting to detach from a host when it died. - - bugfix: Fixed borers being able to assume control of a dead host. - - bugfix: Fixed dead borers in a host being able to speak with the host and ghosts. - - bugfix: Fixed employees starting every shift at least 3 minutes late. You aren't - getting paid to stand around, people! - - bugfix: Fixed animal beatdowns being twice as noisy as they should be. - - bugfix: Pod lock busters should now properly bust pod locks. - - bugfix: The late-stage effects of the "sensory destruction" disease symptom should - now properly destroy your senses. - - bugfix: Autotraitor should now continue picking new in-game traitors, instead - of picking one and dying. - - bugfix: Lacking a head no longer makes you immune to becoming a husk or skeleton. - - bugfix: Security and medical records should probably stop crashing people. - - bugfix: Altering details on an Agent ID Card will now actually update what's seen - when examining the card. - Kyep: - - tweak: Fixes NT Special Ops Officer's headset so he can correctly hear, and talk - on, the Special Ops (deathsquad) channel. - - bugfix: Fixed oversight in keycard authentication devices that incorrectly treated - trialmins like fullmins, resulting in situations where calling an ERT became - impossible. - - tweak: If an ERT request gets no answer for 5 minutes, admins now get a one time - reminder that it was sent. - TheDZD: - - bugfix: Burst fire selection is now a proc, as it was meant to be, rather than - a verb. - TullyBurnalot: - - tweak: AI can no longer interact with IV Drips - - tweak: Robots can no longer remove beakers/blood bags from IV Drips - - bugfix: Fixed clown door deconstruction - - bugfix: Fixed mime door deconstruction -2016-07-09: - Chakirski: - - rscadd: Adds disabled_component() to cyborgs. - - bugfix: EMPs now disable binary communication for as long as the stun time. - - tweak: Syndicate thermal imaging glasses (mesons) can now be prescription upgraded - like normal mesons. - - tweak: Green glasses from the AutoDrobe can now be prescription upgraded. - FalseIncarnate: - - rscadd: Deepfryers are no longer arcane mysteries, and can be (de)constructed - and upgraded. - Fox McCloud: - - rscadd: Grenade have a chance to explode when the person holding them is shot - - rscadd: Flamethrowers can release their tank's contents if the person holding - them is shot - - tweak: 'Can no longer self-trigger blocked shield events (ie: no self-harm to - trigger a reactive teleport armor)' - - tweak: Hugging someone/shaking them up bypasses shield checks (oh no, hugs of - death) - - tweak: Riot shields have a +30% chance to block thrown projectiles - - tweak: Hunter pounces are now a thrown attack as far as shield go, and yes, can - be blocked by riot shields now - - tweak: Energy shields no longer block anything other than beam and energy projectiles - - tweak: Being able to be pushed is based on the block chance of the item you're - holding instead of it just being based on riot shields - - rscadd: Adds in cursed wizard heart, purchase it from the wizard's spell book - for 1 point, but be wary of not keeping the heart beating... - FreeStylaLT: - - rscadd: Added a bunch of new items to maint, some rare uplink gear included. (see - PR for full list) - - tweak: made gas masks, nothing and extinguishers less common in maint - Krausus: - - bugfix: Players probably won't get stuck as plants forever anymore. Probably. - - tweak: Refactored job ban checking, which should massively reduce round start-up - time. - - bugfix: Job bans/unbans will now take effect instantly, rather than at the next - server restart. - TheDZD: - - bugfix: DNA injectors no longer always activate powers that are supposed to have - a chance to activate. - - tweak: Dionae can no longer activate the radiation disability, nor the run superpower - except via adminbus. - - rscadd: Adds genetic instability, which causes a variety of negative effects, - including toxin damage, burn damage, cloneloss, and even gibbing. Effects get - worse as stability gets lower, burn damage starts below 85 stability, tox and - clone below 70, and gibbing once you're below 40. - - rscadd: Adds Curse of the Cluwne touch attack spell, which wizards can pick, heavily - based off of the same spell from Goonstation. Said spell adds an unremovable - honk tumor to the target, gives them NODROP neon green clown gear, makes them - stutter, makes them almost eternally fat, confuses them, makes them clumsy and - speak in Comic Sans, and severely brain damages them. Use it on a cluwne however... - - bugfix: Fixes a bug where honk tumors would cause NODROP items to still be moved, - despite being unable to be unequipped. - TullyBurnalot: - - rscdel: Botanist access to the morgue revoked - - tweak: Added custom messages for evil faxes - - tweak: Added unique text body for each non-evil fax template - - rscadd: Added a "Keep up the good work" fax template - - rscadd: Added a "ERT Instructions" fax template - - rscadd: Photocopiers can be emagged - - rscadd: Emagged photocopiers deal 30 burn damage to all mobs copying their butts - - tweak: Deconstructing Comfy Chairs yields 2 metal sheets - - tweak: Boxes no longer allowed inside evidence bags to prevent them going into - themselves - - tweak: Monocles are now prescription upgradable - - rscadd: Monocles added to Loadout selection - - tweak: Spinning a revolver's chamber makes a noise again - - tweak: Revenants can actually be killed now. - - tweak: AntagHUD activation disqualifies player from rebooted drones - - tweak: Sergeant Ian hat now visible - Twinmold: - - bugfix: Fixes the inconsistency of getting 2 metal rods when you wirecutter a - destroyed grille down to 1. -2016-07-13: - Ar3nn: - - rscadd: Adds a silence button to newscasters, which will silence the regular update - sounds - Chakirski: - - imageadd: Adds new bacon sprites. - - rscadd: Bacon can now be cooked from the grill. Just grill raw bacon. - - tweak: Raw cutlets are now sliceable into raw bacon strips. - - tweak: Plasma and N20 look more gassy. - DaveTheHeadcrab: - - tweak: Greys no longer speak in wingdings. - - rscadd: Greys now have a species-specific language. - Fox McCloud: - - tweak: Overall borg power useage has been lowered - - tweak: Borgs who have completely run out of power can now still move around/see/talk, - but they will be unable to interact with machinery/doors around them; they can - still bump open doors, however. Borgs with no cell are still completely paralyzed - and can't do anything. - - tweak: IPCs are now properly impacted by space's burn damage - - tweak: NT Rep's cane stuns for less and invokes a cooldown between use, similar - to telebatons - - tweak: Oxygen damage number changed a bit; damage is based upon volume lost more - now - - tweak: Species that have blood but are oxygen immune will now take tox damage - - rscadd: Health analyzers will now work with species with exotic blood and inform - the user what type of exotic blood they have - - rscadd: Other machinery that display blood levels (op table, sleepers, advanced - scanners, etc) will now work with exotic blood - - bugfix: Changeling regen will now properly restore blood if you have exotic blood - fix Fixes being blurry for 20+ minutes when you were low on blood for a mere - 3 minutes - - tweak: Heart damage impacting blood volume removed - - tweak: Nutrition draining when low on blood removed - - bugfix: Station cinematics shouldn't have inventory overlays over top of the animation - - bugfix: Station cinematics should properly clear off the screen and delete now - - bugfix: pAIs are no longer valid targets for gun turrets (like on the syndicate - ship) - - rscadd: Adds in Rathen's secret, a new spell for the wizard that AoE stuns - - rscdel: Removed borg jetpacks - - rscadd: Adds in borg ion pulse system; borgs with ion pulse enabled consume extra - power for each turf they move but can travel on space. Can upgrade any borg, - at R&D with an ion pulse upgrade - - rscadd: 'Adds in cyborg self repair upgrade: very slowly repairs cyborgs at the - cost of extra power. Available at R&D' - - tweak: 'Mining cyborg module tweaked slightly: GPS, shovel, mini welding tool - and mini extinguisher added, wrench and screwdriver removed' - - tweak: reset borg module removes speed boost - - bugfix: Fixes borg's stun arm bypassing shields - KasparoVy: - - imageadd: Adds Vox compatible versions of all jumpskirts. - - imageadd: Adds Vox compatible version of the CMO jumpsuit. - Krausus: - - bugfix: Players will ALMOST DEFINITELY never get stuck as plants anymore. I mean - it this time! - - bugfix: Fixed morgue trays not updating themselves when you ghost into/out of - your body. - Kyep: - - tweak: Changed access requirement on lethal injection locker to sec access (same - access required for the chair its right next to. - - tweak: Changed access requirement on exile implant locker to armory access. - - tweak: Ghosts no longer miss out on ERTs due to not knowing it was called, or - not being able to find the verb. They are now prompted about joining an ERT - when one is called. - - bugfix: Fixed a condition where 'we are assembling an ERT' message is broadcast, - but no ERT is generated. - - bugfix: Typo fixes in ERT messages. - - tweak: Entering a cryo pod, then deliberately selecting OOC->Ghost, and clicking - yes on the prompt, will now instantly send you to long-term storage, removing - you from the round, despawning your body, freeing your job slot, and giving - a new objective to any antag that had you as a target. - - tweak: Announcements about someone entering long-term storage via a cryopod now - include that person's rank. - - tweak: When an antag target cryos, the message the antag gets about their objectives - changing is now clearer. - TheDZD: - - rscadd: Adds "salts" as a say verb for deadchat ghosts. - TullyBurnalot: - - rscadd: Universal Recorder added to NT Rep Locker - - rscadd: Box of recorder tapes added to NT Rep and IAA Locker - - rscadd: Fax Guide added to Captain, HoS, HoP, NT Rep and IAA Lockers - - rscadd: Butt copy alert added to photocopiers - - rscadd: Butt copy alert comes with *ping noise - - tweak: Photocopiers start with 60 toner - Twinmold: - - bugfix: Vampires with sleeping carp (traitor+vampire rounds) can now suck people's - blood like normal. - monster860: - - rscadd: The ChemMaster now uses NanoUI! Yey! - - bugfix: Alerts are no broken ghostly outlines -2016-07-20: +2016-11-23: + !!python/unicode 'A Giant-Ass Mountain of Salt': + - !!python/unicode 'rscadd': !!python/unicode 'Re-adds PDA slot.' + !!python/unicode 'Alexshreds': + - !!python/unicode 'tweak': !!python/unicode 'pAIs can see the crew manifest again.' + - !!python/unicode 'tweak': !!python/unicode 'Engineers and Atmos Techs have access + to the ORM' + !!python/unicode 'Alffd': + - !!python/unicode 'rscadd': !!python/unicode 'Added a 6th Vulpkanin tail option.' + - !!python/unicode 'tweak': !!python/unicode 'Fixes animations, side view, and pixel + fill for Vulpkanin tail 6' + !!python/unicode 'Allfd': + - !!python/unicode 'rscadd': !!python/unicode 'Added hologram fluff sprites' + !!python/unicode 'Ar3nn': + - !!python/unicode 'tweak': !!python/unicode 'Adds tech levels to RnD console main + menu' + !!python/unicode 'AugRob': + - !!python/unicode 'rscadd': !!python/unicode 'Add screwdriver sound when opening/closing + panels on airlocks' + !!python/unicode 'Aurorablade': + - !!python/unicode 'rscdel': !!python/unicode 'Removes the !!FUN!! of having headslugs + gold core spawnable.' + !!python/unicode 'Certhic': + - !!python/unicode 'bugfix': !!python/unicode 'Corrected some air alarms so that + atmos computer can access them' + - !!python/unicode 'bugfix': !!python/unicode 'Bodyscanner now sees mechanical parts + in internal organs' + !!python/unicode 'Chakirski': + - !!python/unicode 'rscadd': !!python/unicode 'Adds disabled_component() to cyborgs.' + - !!python/unicode 'bugfix': !!python/unicode 'EMPs now disable binary communication + for as long as the stun time.' + - !!python/unicode 'tweak': !!python/unicode 'Syndicate thermal imaging glasses + (mesons) can now be prescription upgraded like normal mesons.' + - !!python/unicode 'tweak': !!python/unicode 'Green glasses from the AutoDrobe can + now be prescription upgraded.' + !!python/unicode 'Chakishreds': + - !!python/unicode 'tweak': !!python/unicode 'You can now click on objects in a + gassy room at the expense of ninja floors.' + !!python/unicode 'Chopchop1614': + - !!python/unicode 'bugfix': !!python/unicode 'fixes transformation sting not working.' + - !!python/unicode 'bugfix': !!python/unicode 'transformation sting now checks if + the target has DNA or not' + !!python/unicode 'Coldflame': + - !!python/unicode 'rscadd': !!python/unicode 'Adds three new variants of 10mm ammunition, + AP, HP, and Incendiary. Currently admin-only.' + !!python/unicode 'CrAzYPiLoT': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes the footsteps sounds to the + fullest.' + !!python/unicode 'Crazylemon': + - !!python/unicode 'rscadd': !!python/unicode 'Fully enables a system to allow species + to have unique procs and verbs that come and go with the species.' + - !!python/unicode 'rscdel': !!python/unicode 'IPCs lose their change monitor verb + when changing species now. Gone are the days of recalling a past IPC life to + perform self-barbery! Oh, woe is me!' + - !!python/unicode 'bugfix': !!python/unicode 'Sleepers and Body Scanners will now + reliably work when rotated' + - !!python/unicode 'bugfix': !!python/unicode 'SSD humans should be asleep more + reliably now.' + !!python/unicode 'Crazylemon64': + - !!python/unicode 'bugfix': !!python/unicode 'Sleeping simple animals should tick + down sleeping as normal - deaf simple mobs are no longer a thing' + !!python/unicode 'DarkPyrolord': + - !!python/unicode 'rscadd': !!python/unicode 'Adds in hardsuit sprites for Vulpkanin' + !!python/unicode 'Dave The Headcrab': + - !!python/unicode 'tweak': !!python/unicode 'Nerfs the damage the Detective''s + revolver does from 15 brute to 5 brute.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds a 300 round capacity buckshot + magizine that fits into the L6 Saw.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds a 25 round capacity 40mm HE + magizine that fits into the L6 Saw.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds the ''Devastator'' L6 SAW, starts + off loaded with the buckshot magizine.' + - !!python/unicode 'rscadd': !!python/unicode 'Gives the SST the ''Devastator'' + L6 Saw, and one of each mag type in their bag.' + !!python/unicode 'DaveTheHeadcrab': + - !!python/unicode 'rscadd': !!python/unicode 'Adds new worn icons for duffelbags + to better reflect their size, compliments of WJohn at /tg/' + !!python/unicode 'Deanthelis': + - !!python/unicode 'rscadd': !!python/unicode 'Added the ability for the Magnetic + Gripper to pick up and place light tiles.' + !!python/unicode 'FalseIncarnate': + - !!python/unicode 'rscadd': !!python/unicode 'Plants will now begin to die over + time if their age exceeds 5 times their TRAIT_MATURATION value.' + - !!python/unicode 'tweak': !!python/unicode 'Weed growth chance per process in + trays has been slightly increased (Previously: 5% chance if no seed, 1% otherwise;Now: + 6% / 3%).' + - !!python/unicode 'tweak': !!python/unicode 'Pest growth in trays has been slightly + buffed. (Previously: 3% chance to increase by 0.1; Now: 5% chance to increase + by 0.5)' + !!python/unicode 'Fethas': + - !!python/unicode 'rscadd': !!python/unicode 'Due to Archmage Steve leaving the + nya-cromantic stone near the microwave, the true power of the stone has been + unleashed. Subjects of the stone are not only ressurected ... but resurrected + as catgirls ... We fired steve.' + !!python/unicode 'FlattestGuitar': + - !!python/unicode 'rscadd': !!python/unicode 'Adds IPC alcohol and a few derivative + drinks' + - !!python/unicode 'tweak': !!python/unicode 'IPCs can now drink and be fed from + glasses' + !!python/unicode 'FlattestNerd': + - !!python/unicode 'tweak': !!python/unicode 'the e20 will now get logged when it + goes BEWM, as it should.' + !!python/unicode 'Fox MCCloud': + - !!python/unicode 'tweak': !!python/unicode 'Removes "harm" traitor objective' + - !!python/unicode 'tweak': !!python/unicode 'Increases non-escape/hijack/die objectives + from 1 to 2' + - !!python/unicode 'tweak': !!python/unicode 'Tweaks available objectives to traitors + a bit' + !!python/unicode 'Fox McCloud': + - !!python/unicode 'bugfix': !!python/unicode 'fixes a bug relating to some brute/burn + damage being dealt to human mobs.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds in overloading APCs, causing + them to arc electricity to mobs in range.' + - !!python/unicode 'tweak': !!python/unicode 'Makes Engineering related APCs overload + proof.' + - !!python/unicode 'rscadd': !!python/unicode 'Implements the timestop spell.' + - !!python/unicode 'rscadd': !!python/unicode 'Implements new sepia slime reaction + which halts time in an AoE.' + - !!python/unicode 'tweak': !!python/unicode 'sentience potions no longer can make + slimes sentient.' + - !!python/unicode 'tweak': !!python/unicode 'Removes Hulk instant stun.' + - !!python/unicode 'tweak': !!python/unicode 'Hulk damage increased.' + - !!python/unicode 'tweak': !!python/unicode 'Hulk wears off at a lower health threshold.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes strange reagent not working + on simple animals.' + - !!python/unicode 'tweak': !!python/unicode 'Reduces the amount shock damage and + bounces for the Tesla engine.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes Syndicate Cyborg''s LMG being + invisible.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes the uplink kit having implanters + that were both nameless and looked as if they had been used.' + !!python/unicode 'Fox McCloud and KorPhaeron': + - !!python/unicode 'rscadd': !!python/unicode 'Adds in mining shelters' + - !!python/unicode 'rscadd': !!python/unicode 'Adds in a few more dice types and + ensure dice are packed in bags and not pill bottles' + !!python/unicode 'Fox-McCloud': + - !!python/unicode 'rscadd': !!python/unicode 'Adds in a few makeshift items/weapons: + molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes some personal crafting behaving + as other than intended' + !!python/unicode 'FreeStylaLT': + - !!python/unicode 'rscadd': !!python/unicode 'Added (Enabled) Mind Batterer for + Traitors' + - !!python/unicode 'spellcheck': !!python/unicode 'Fixed uplink implant description + (Said 5 when actually gave you 10 TCs)' + !!python/unicode 'General Chaos': + - !!python/unicode 'rscadd': !!python/unicode 'Ports TG''s mech bay recharger code.' + !!python/unicode 'GeneralChaos81': + - !!python/unicode 'rscadd': !!python/unicode 'Ability to place and remove conveyor + belts and levers.' + !!python/unicode 'Glorken': + - !!python/unicode 'rscadd': !!python/unicode 'Added a Knight Arena for Holodeck.' + - !!python/unicode 'imageadd': !!python/unicode 'Added red and blue claymore sprites.' + - !!python/unicode 'spellcheck': !!python/unicode 'Changed overrided to overrode + when emagging Holodeck computer.' + !!python/unicode 'IK3I': + - !!python/unicode 'bugfix': !!python/unicode 'Can no longer holster items with + No-Drop active.' + - !!python/unicode 'bugfix': !!python/unicode 'Saves prosthesis users from Tox-Comp''s + wrath' + !!python/unicode 'IcyV': + - !!python/unicode 'rscadd': !!python/unicode 'Adds a unique axe for Atmos-traitors' + !!python/unicode 'Improvedname': + - !!python/unicode 'rscadd': !!python/unicode 'Adds 4 epinephrine autoinjectors + to nanomedplus vending machines' + !!python/unicode 'Jey': + - !!python/unicode 'tweak': !!python/unicode 'Inflatable walls and door can now + be deflated by altclicking them' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed lag from expanding multiple + monkeycubes at once.' + !!python/unicode 'KasparoVy': + - !!python/unicode 'rscadd': !!python/unicode 'Added the security gasmask, sexy + mime mask, bandanas, balaclava, welding gas mask and wrestling masks for Vox. + Added adjusted-state sprites for the Vox breath, medical, and surgical masks.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed a duplicate of the human + balaclava sprite.' + - !!python/unicode 'tweak': !!python/unicode 'Modifies the Vox plague-doctor, fake + moustache, sterile and medical mask sprites to fit the Vox anatomy and animates + the Vox SWAT mask. Corrects the names of some Vox mask adjusted-state sprites.' + !!python/unicode 'KorPhaeron and Fox McCloud': + - !!python/unicode 'tweak': !!python/unicode 'Merges Malf AI into traitor AI' + - !!python/unicode 'tweak': !!python/unicode 'Malf AI''s starting CPU reduced from + 100 to 50' + - !!python/unicode 'tweak': !!python/unicode 'Hacking APCs gives 10 additional CPU' + - !!python/unicode 'rscadd': !!python/unicode 'Hacking APCs throws an alert to the + AI when it''s hacking that automatically clears when hacking is complete (sounds + too)' + - !!python/unicode 'rscadd': !!python/unicode 'Traitor AI''s start off with a syndicate + headset' + - !!python/unicode 'rscadd': !!python/unicode 'Adds doomsday device module for AI''s + for 130 CPU; when activated, it will purge the station of all life if the AI + is not destroyed after 7.5 minutes' + - !!python/unicode 'rscadd': !!python/unicode 'Adds in AI upgrade modules which + allows you to giving hacking abilities to the AI or allow it to have increase + surveillance capabilities' + !!python/unicode 'Krausus': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes ghosts failing to follow mobs + that move in unusual ways' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed tape allowing mobs with sufficient + access to move through solid objects.' + !!python/unicode 'Kyep': + - !!python/unicode 'rscadd': !!python/unicode 'Blob, vine and virus outbreaks are + now more clearly labeled as such, to avoid people confusing them with each other' + !!python/unicode 'LittleBigKid2000': + - !!python/unicode 'rscadd': !!python/unicode 'Booze dispensers can now dispense + synthanol' + !!python/unicode 'LittleBigKid2000 and TullyBBurnalot': + - !!python/unicode 'rscadd': !!python/unicode 'Stethoscopes can now be used to tell + if a person''s heart or lungs are damaged, or if they have any at all. Now they''re + actually useful instead of telling you the obvious in a vague way.' + - !!python/unicode 'bugfix': !!python/unicode 'Stethoscopes can no longer be used + to hear the heartbeat and breathing of a person that doesn''t have a heart or + lungs.' + !!python/unicode 'Many -tg-station Coders, TheDZD': + - !!python/unicode 'rscdel': !!python/unicode 'Old gun code is now gone.' + - !!python/unicode 'rscadd': !!python/unicode 'Ports the vast majority of TG''s + gun code and their guns (any previously unavailable guns, and newly-added guns + will remain unavailable to players). Expect some changes that might not be listed + here due to the sheer scope of this refactor.' + - !!python/unicode 'rscadd': !!python/unicode 'Probably some new bugs.' + - !!python/unicode 'bugfix': !!python/unicode 'A lot of old gun bugs.' + - !!python/unicode 'rscadd': !!python/unicode 'Mouth suiciding with a gun no longer + instantly kills you, you fire the gun at yourself at 5x damage (assuming it + even did damage to begin with).' + - !!python/unicode 'tweak': !!python/unicode 'Mouth suicide shooting does not work + on harm intent.' + - !!python/unicode 'tweak': !!python/unicode 'You can now bash people with guns + while on harm intent instead of shooting them point-blank.' + - !!python/unicode 'rscadd': !!python/unicode 'You can now mouth suicide other people, + doing so still takes the full 12 seconds to mouth suicide, but has the same + 5x damage multiplier.' + - !!python/unicode 'tweak': !!python/unicode 'Vox spike throwers are real guns that + fire spike bullets now, instead of just being fake guns that threw spikes. They + do 25 damage per hit, have 30 armor piercing, cause a 1 second stun (not the + kind that drops you to the floor), and cause some bleeding. They have 2 round + burst fire as well, and have 10 shots per clip. A new should should recharge + every 20 or so seconds.' + - !!python/unicode 'tweak': !!python/unicode 'Xray lasers now have a maximum range + of 15 tiles.' + - !!python/unicode 'bugfix': !!python/unicode 'Zoomed guns now actually fire accurately + while zoomed.' + - !!python/unicode 'rscadd': !!python/unicode 'Using Suicide with guns now actually + does gun-like things.' + - !!python/unicode 'tweak': !!python/unicode 'The clown no longer deletes guns if + he fucks up with them due to being clumsy.' + - !!python/unicode 'bugfix': !!python/unicode 'Emitters no longer become inaccurate + over long ranges.' + - !!python/unicode 'tweak': !!python/unicode 'Power gloves now override middle-click + and alt-click when worn.' + - !!python/unicode 'tweak': !!python/unicode 'Power gloves give a notification when + worn.' + - !!python/unicode 'tweak': !!python/unicode 'Power gloves now have special examine + text when examined by an antagonist.' + - !!python/unicode 'tweak': !!python/unicode 'Proto SMGs now only have a 21 shot + clip.' + !!python/unicode 'MarsM0nd': + - !!python/unicode 'tweak': !!python/unicode 'Embeded object removal is now done + with hemostat again' + - !!python/unicode 'rscadd': !!python/unicode 'Borgs are able to do embeded object + surgery' + !!python/unicode 'Meisaka': + - !!python/unicode 'bugfix': !!python/unicode 'law manager no longer freaks out + with Malf law' + !!python/unicode 'NTSAM': + - !!python/unicode 'rscadd': !!python/unicode 'Added a rainbow IPC screen.' + !!python/unicode 'Norgad': + - !!python/unicode 'rscadd': !!python/unicode 'Adds a disposals chute to the Mechanic''s + Workshop' + !!python/unicode 'PPI': + - !!python/unicode 'tweak': !!python/unicode 'Modifies the effective time limit + to activate the Nuclear Challenge as Nukeops from two minutes to seven minutes' + !!python/unicode 'Pinatacolada': + - !!python/unicode 'rscadd': !!python/unicode 'Makes the swedish gene spit out weird + swedish chars and sounds' + !!python/unicode 'ProperPants': + - !!python/unicode 'rscadd': !!python/unicode 'Maint drones have magboots.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed plastic from maint drones. + Literally useless for station maintenance.' + - !!python/unicode 'tweak': !!python/unicode 'Increased starting amounts of some + materials for maint drones and engi borgs.' + - !!python/unicode 'experiment': !!python/unicode 'Reduced the number of lines taken + by Engineering cyborgs calling on materials stacks.' + - !!python/unicode 'rscadd': !!python/unicode 'Operating tables can be deconstructed + with a wrench.' + - !!python/unicode 'spellcheck': !!python/unicode 'Fixed and shortened description + of metal sheets.' + !!python/unicode 'QuinnAggeler': + - !!python/unicode 'rscadd': !!python/unicode 'Adds the Drask as a 30KP race' + - !!python/unicode 'rscadd': !!python/unicode 'Adds their language, Orluum' + - !!python/unicode 'rscadd': !!python/unicode 'Adds a stylecolor for their language' + - !!python/unicode 'rscadd': !!python/unicode 'Adds their butts (for photocopying)' + - !!python/unicode 'rscadd': !!python/unicode 'Adds, at last, another race with + skin tone (humies move over)' + - !!python/unicode 'rscadd': !!python/unicode 'Adds a reason to make bad ice puns' + - !!python/unicode 'bugfix': !!python/unicode 'Adds a check for brain death (brain + damage of 120 or more) to the proc responsible for reviving IPCs' + !!python/unicode 'Regen': + - !!python/unicode 'tweak': !!python/unicode 'Powersink can now drain a lot more + power before going boom' + - !!python/unicode 'tweak': !!python/unicode 'Buffed the powersinks drain rate' + - !!python/unicode 'tweak': !!python/unicode 'Buffed explosion from an overloaded + powersink, try to find it instead of overloading the grid.' + - !!python/unicode 'rscadd': !!python/unicode 'Admin log warning before the powersink + explodes' + !!python/unicode 'Regen1': + - !!python/unicode 'rscadd': !!python/unicode 'Adds the Immolator laser gun, a modified + laser gun with 8 shots that will ignite mobs, can be made in R&D;' + !!python/unicode 'Regens': + - !!python/unicode 'tweak': !!python/unicode 'Robotic hearts will now properly give + the mob a heart attack instead of just damaging it when EMP''d' + - !!python/unicode 'rscadd': !!python/unicode 'Assisted organs will now also take + damage from EMP''s' + - !!python/unicode 'bugfix': !!python/unicode 'Internal robotic and assisted organs + will now actually take damage from EMP''s' + !!python/unicode 'Spacemanspark': + - !!python/unicode 'rscadd': !!python/unicode 'Miners can now utilize the power + of mob capsules to take along their lazarus injected mining creatures!' + - !!python/unicode 'rscadd': !!python/unicode 'Store your Pokemo- er, sorry, I mean + mining mobs that you''ve captured in the lazarus capsule belt.' + !!python/unicode 'Tastyfish': + - !!python/unicode 'tweak': !!python/unicode 'Instruments now use NanoUI.' + - !!python/unicode 'spellcheck': !!python/unicode 'Corrected the blueshield mission + briefing.' + !!python/unicode 'Tauka Usanake': + - !!python/unicode 'rscadd': !!python/unicode 'Adds more belt icon overlays' + !!python/unicode 'TheBeoni': + - !!python/unicode 'rscadd': !!python/unicode 'Adds "unique" jumpsuit for Pod Pilot + so they can finally stop using security one Added picture because i do not like + that red label' + !!python/unicode 'TheDZD': + - !!python/unicode 'rscadd': !!python/unicode 'Ports over changelog system from + /tg/station.' + !!python/unicode 'Tigerbat2000': + - !!python/unicode 'bugfix': !!python/unicode 'The nuclear disk escaping on the + shuttle no longer counts as a syndicate minor victory.' + - !!python/unicode 'bugfix': !!python/unicode 'Cultists can once again actually + greentext the escape objective.' + !!python/unicode 'Tigercat2000': + - !!python/unicode 'rscadd': !!python/unicode 'Added 96x96 (3x) res option to icons + menu' + !!python/unicode 'TravellingMerchant': + - !!python/unicode 'imageadd': !!python/unicode 'Kidan have new sprites!' + !!python/unicode 'TullyBBurnalot': + - !!python/unicode 'tweak': !!python/unicode 'Handless cuffing no longer possible. + Can still cuff people with one hand' + !!python/unicode 'TullyBurnalot': + - !!python/unicode 'tweak': !!python/unicode 'AI can no longer interact with IV + Drips' + - !!python/unicode 'tweak': !!python/unicode 'Robots can no longer remove beakers/blood + bags from IV Drips' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed clown door deconstruction' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed mime door deconstruction' + !!python/unicode 'Twinmold': + - !!python/unicode 'rscadd': !!python/unicode 'Nar''Sie AI Hologram and Error Sprite' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes space pod equipment variable. + Can now properly install/uninstall equipment.' + - !!python/unicode 'bugfix': !!python/unicode 'Check Seat verb no longer pulls out + installed equipment.' + - !!python/unicode 'bugfix': !!python/unicode 'You can now have a passenger in your + pod if you have a passenger seat.' + !!python/unicode 'Twinmold93': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes a runtime issue caused by using + the detective''s scanner on the space hotel cleaver.' + - !!python/unicode 'bugfix': !!python/unicode 'Scrubber pipe missing segment behind + the operating theatres.' + !!python/unicode 'Ty-Omaha': + - !!python/unicode 'tweak': !!python/unicode 'Gives Combat Gloves to Code Red ERT + agents.' + - !!python/unicode 'tweak': !!python/unicode 'Gives Code Gamma Engineering ERT agents + Combat Gloves.' + !!python/unicode 'VampyrBytes': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes emotes ending with s needing + 2. Emotes now work with grammatical options eg ping or pings, squish or squishes' + - !!python/unicode 'tweak': !!python/unicode 'Updated emote help with missing emotes. + Help will also show any species specific emotes for your current species' + !!python/unicode 'Yurivw': + - !!python/unicode 'bugfix': !!python/unicode 'Condimaster now actually makes bottles. + Removed: Unused options in admin secret menu are now removed.' + !!python/unicode 'chopchop1614': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed the C4 labcoat exploding bug' + !!python/unicode 'monster860': + - !!python/unicode 'bugfix': !!python/unicode 'Space pod transitions are now fixed.' + !!python/unicode 'monster860, clusterfack, and DeityLink': + - !!python/unicode 'rscadd': !!python/unicode 'Adds space parallax' + !!python/unicode 'pinatacolada': + - !!python/unicode 'rscadd': !!python/unicode 'Adds NanoUI to the operating computer' + - !!python/unicode 'rscadd': !!python/unicode 'Adds health announcing, critical + and oxygen damage aural alerts to the computer, with a menu to selectively turn + them on and off' + !!python/unicode 'ppi': + - !!python/unicode 'tweak': !!python/unicode 'When revealed Revenants will not be + able to move at the maximum move speed, nor be able to pass through any solid + object, like walls, windows, grills, computers and mechs.' + !!python/unicode 'taukausanake': + - !!python/unicode 'rscadd': !!python/unicode 'Mice can now be picked up like diona' + !!python/unicode 'tigercat2000': + - !!python/unicode 'rscadd': !!python/unicode 'Nukeops now have an assault pod, + they can use it for 30 TC. Loud and mean.' + - !!python/unicode 'bugfix': !!python/unicode 'Lighting overlays can no longer go + below 0 lum_r/g/b' + - !!python/unicode 'bugfix': !!python/unicode 'Shuttles will work with lighting + better.' + - !!python/unicode 'bugfix': !!python/unicode 'Wizards can no longer teleport to + prohibited areas such as Central Command.' + !!python/unicode 'tkdrg': + - !!python/unicode 'rscadd': !!python/unicode 'Admins now have a verb to wipe all + scripts from telecomms.' + !!python/unicode 'tkdrg, Delimusca, Aranclanos, TheDZD': + - !!python/unicode 'rscadd': !!python/unicode 'Gun mimics (including wand, staff, + projectile guns, and energy guns) created by the staff of animation will shoot + things.' + - !!python/unicode 'rscadd': !!python/unicode 'Mimics created by the staff of animation + now have googly eyes.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes the disturbing lack of death + caused by wand of death projectiles.' + !!python/unicode 'tristan1333': + - !!python/unicode 'rscadd': !!python/unicode 'Spacepod paint' +2016-11-28: Allfd: - - rscadd: Added hologram fluff sprites - Ar3nn: - - rscdel: Gets rid of some weird lattices floating in mid-space - Chakirski: - - imageadd: Adds M.E. Reaper sprite. - - rscadd: AI can now choose a 32x64 reaper hologram. - - tweak: Cigarette packs no longer show near-duplicate messages when examined. - CrAzYPiLoT: - - rscadd: Ports randomized space ruins from /tg/ station. There is a number of maps - which can be spawned at any location on the empty z-level at roundstart, and - up to three random ones will be chosen each round. Credits to KorPhaeron. - - rscadd: Lays the groundwork for a future lavaland implementation, if we choose - to have it. - - rscadd: Adds a feature to the map loader where areas with the right var set can - be distinctly initialized on map load - meaning separate APCs, and the like. - - rscadd: Using a z-level specific initialization freeze system, large elaborate - maps like the cyberiad can be loaded without a single runtime, with minimal - impact on the round elsewhere. - - rscadd: Adds a delete mode to the "Fill" buildmode - just alt-click for the second - corner, and everything within will be removed. - - rscadd: Adds a "Jump To" function in VV, which is useful for getting an idea of - what exactly you're looking at. - - rscadd: Added view count to newscaster feeds and messages. + - bugfix: Fixes an issue with the processing of GitHub changelog emoji in the php + webhook. Crazylemon64: - - bugfix: Abductors consoles link correctly again - DaveTheHeadcrab: - - tweak: Plastic explosives are now a subtype of grenades. Shouldn't be any noticable - difference for players. - - tweak: Plastic explosives no longer use the wire datum. You may directly attach - an assembly holder (Such as a remote signaller + igniter assembly) - - rscadd: Adds X-4 shaped charges, designed for breaching explosively without harming - the user. Pick some up at your local nukies r us. - - rscadd: Replaces tablecrafting with personal crafting, click the hammer icon by - your intent selector to use it. - - rscdel: Removes the PDA slot, your PDA can now go in your ID slot (Again). - - rscadd: You can now alt click to remove an ID from a PDA, for quick interaction - while it's in your ID slot. - - rscadd: Adds an overlay for an ID while it's inserted into your PDA. - FalseIncarnate: - - rscadd: Adds new Bottler machine for making unique beverages! Order one from cargo - today! - - rscadd: Adds 6 new drinks obtainable via the Bottler. Get brewing! - - bugfix: Grapes now can be properly juiced again, as they now have the right kitchen - tag. - - rscadd: Adds effects to the Paradise Pop reagents. Drink them all to unlock their - powers! - Fox McCloud: - - rscadd: Adds in fans which can block atmospherics passing over them - - bugfix: All mass driver blast doors have a fan underneath them, allowing you to - use them repeatedly instead of once - - bugfix: Fixes medical, security, and employment records not being displayed - - rscadd: Adds in a weather system - - tweak: Removes most of the miner's uniform equipment from their lockers and puts - it in a miner's wardrobe - - tweak: Miners start off with a lot of their clothing equipment equipped to them - - rscadd: Miners now have unique headset sprites - - tweak: Miners no longer have lanterns, but a seclite; they can attach this to - their kinetic accelerators now - - tweak: Miners have workboots instead of black shoes - - tweak: Miners no longer have a default mining scanner but an advanced one that - works at reduced range (5 instead of 7) and has a longer cooldown between pulses - (5 instead of 3.5) - - tweak: removed extra mining hardsuit from the outpost - - tweak: removed medikit spam from outpost; now just a toxin kit and a regular medical - kit - - rscadd: Bluespace crystals now earn you points and can be refined into bluespace - polycrystal sheets - - tweak: Spare vouchers from QM and HoP removed - - tweak: removed armor from the fake tactical turtleneck - - rscadd: Can scan vending machines with your PDA to pay for items (if there's an - ID in your PDA) - - tweak: Sleepers no longer require a console to build, only the sleeper itself - - tweak: Clicking on the sleeper brings up the menu that was previously brought - up for the console - - rscadd: Adds in syndicate sleepers--these sleepers are not only syndie themed - but also allow the user to inject chems into themselves while inside the sleepers - - tweak: Sleepers can now inject silver sulfadiazine - - tweak: removes cryofeeds from cryodorms and adds in 2 more cryopods - - bugfix: Fixes pre-spawned loaded belts not having proper overlays - - tweak: nanites will no longer purge chems, but will now heal internal organ damage, - attempt to mend fractures, and will no longer cure beneficial viruses - - bugfix: cold and hot drinks should now properly heat you up or cool you down (this - also goes for medical reagents) - - tweak: beer no longer reduces jitteriness - - tweak: toxins special and antifreeze heat you up - - tweak: banana juice and banana honk now heals monkeys - - bugfix: Fixes atrazine not killing nymphs - - tweak: mining autoinjectors no longer poison you - - tweak: combat hypospray now has omni+epinephrine+teporone - - tweak: stimpack is now meth+coffee instead of meth+epinephrine - - tweak: Cheese and synth meat amount creation scales with volume of the reaction - - tweak: sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, - and IAA are no longer left out) - - bugfix: Fixes syndi+shielded+hos hardsuit sprite issues - - bugfix: Fixes wizard's who have a regular satchel set in their prefs winding up - with none - - bugfix: Spellbooks are automatically bound to wizards at round start (no more - ragin' exploitative mages) - - bugfix: Fixes mining outpost lacking an APC - - bugfix: Fixes being able to exploit and turn artificial bluespace crystals into - regular bluespace crystals - FreeStylaLT: - - rscadd: Added courtroom, left of brig. - - tweak: Remapped brig - - tweak: Moved prisoner processing and evidence storage to the right of brig, next - to Detective's office. - - tweak: Changed current processing to Interrogation and a hallway. - - tweak: Re-mapped Conference and Locker rooms. - - tweak: Lots of other minor tweaks to brig. - - tweak: Seriously, way too many small changes to list here, go and have a look - at the brig yourself. - - rscdel: Removed temp. detainment and observation from brig. + - bugfix: The RCD no longer shall work as a remote permissions control KasparoVy: - - bugfix: Wearing a suit will no longer cause runtimes due to the way suit-collars - are handled. - - bugfix: The north direction sprite of the Vulpkanin 'Patch' facial hair style - won't hang a pixel off the head anymore. - Krausus: - - tweak: All admins can now see "admin log" messages. - - rscadd: Admins can now toggle "admin log" messages on or off. - - tweak: Admins will no longer be notified about ghosted admins jumping around. - - bugfix: Beating on simple animals will no longer be twice as noisy as intended. - - bugfix: Emergency Response Teams are now usable again. - Kyep: - - tweak: adds botany, basketball court, individual cells, library computer and more - to perma. Makes it far less boring. - - tweak: Tracking implants are now useful, showing the implanted person's general - location, and health status, on prisoner consoles. - - bugfix: The NODROP flag now works correctly on jumpsuits. - - tweak: 'Improved admin ''select equipment'' verb. ERT option now works, costumes - get IDs and proper headsets, two new costumes added, and some outfits minorly - tweaked (e.g: tunnel clowns get toolbelts).' - - bugfix: Prevented NPCs being made into objective targets. - LittleBigKid2000 and TullyBBurnalot: - - rscadd: Stethoscopes can now be used to tell if a person's heart or lungs are - damaged, or if they have any at all. Now they're actually useful instead of - telling you the obvious in a vague way. - - bugfix: Stethoscopes can no longer be used to hear the heartbeat and breathing - of a person that doesn't have a heart or lungs. - Tauka Usanake: - - rscadd: Adds a Hydroponics HUD and a night vision version of it that can both - be created in R&D. It provides additional details on plants in hydro trays and - soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of - the plant as well as whenever it is ready to be harvested or is dead. - TullyBBurnalot: - - tweak: Handless cuffing no longer possible. Can still cuff people with one hand - TullyBurnalot: - - tweak: Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW - - rscadd: When emagged, Photocopiers now have a cooldown if used to copy butts - Twinmold: - - bugfix: Fixes removing ID cards from laptops with the Eject ID verb. - monster860: - - rscadd: A bunch of interfaces now use /datum/browser. - - rscadd: The ChemMaster now uses the asset cache, eliminating the enormous lag - spike when you first use it. Yey! - - bugfix: Fixes the window not closing when selecting an icon for the chem-master - - bugfix: Fixes the chem master window not updating when selecting an icon - - tweak: The chem-master icon selection window now has a 4x5 grid of icons. - tigercat2000: - - rscadd: Gas tanks now have an action button for accessing their interface. - - rscadd: You can now shift-click on movable HUD elements (such as action buttons) - to reset them to their initial position. - - tweak: Implants with limited uses, such as freedom implants, now delete themselves - when they run out of uses. -2016-07-21: - Alffd: - - rscadd: Added a 6th Vulpkanin tail option. - - tweak: Fixes animations, side view, and pixel fill for Vulpkanin tail 6 - FalseIncarnate: - - bugfix: Engineers can properly show up for work with their hats and coats to keep - warm. - Fox McCloud: - - tweak: Tajarans and Unathi can now wear all shoe and glove types - - tweak: Glove clipping removed except for black gloves, which makes them fingerless - gloves - - rscadd: Adds sandals as a loadout option - - rscadd: Adds in simple animal mob spawners - - rscadd: Adds shielded hardsuit to the nuke ops uplink for 30 TC - - rscadd: Implements the powerfist and adds it to the uplink for 8 TC - - rscdel: Removed drinking glass shattering (regular bottle shattering is still - a thing) - - rscadd: Captain's flask is now gold instead of silver - - tweak: Bottles have a throwforce of 15 - - rscadd: can crack eggs into drinking glasses - - tweak: Detective's flask starts out with 30 units of whiskey - - rscdel: removes redundant object verbs that have an action button - - bugfix: Fixes up mindswap spell so it behaves more properly - - bugfix: Fixes genetic abilities action buttons not properly clearing - - bugfix: Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs - and other sources - - bugfix: ACTUALLY FIXES MINING APC - - bugfix: Fixes brig cell timers not having the option to flash people - FreeStylaLT: - - rscadd: Added new syndicate item Chameleon SecHUD to uplink store, available for - all antags. It can morph into various eyewear while being a flashproof sechud. - Kyep: - - rscadd: Added new syndicate costumes to "select equipment" admin verb. - TullyBBurnalot: - - rscadd: More beds outside the Operating Theaters, Pajama Wardrobes outside and - inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per - OR, table with cards - - tweak: Sinks moved closer to Surgical Tables, moved light fixtures in the Operating - Theaters, tables with surgical tools now made of glass for maximum style points - and Xenomorph Larva Whack-A-Mole - monster860: - - bugfix: Brig timer UI reopening after being closed fixed. -2016-07-28: - A Giant-Ass Mountain of Salt: - - rscadd: Re-adds PDA slot. - Crazylemon64: - - rscadd: Adds an explosion buildmode - - bugfix: '"Drop Everything" in VV no longer causes limbs to fall to the ground.' - FlattestGuitar: - - tweak: IAAs can now select the classic secHUD in loadouts - - rscadd: adds bananas and suit jackets to the loadout system - - rscadd: adds dress shoes and fancy sandals to the loadout system - - bugfix: Miners can now get the mining coat from loadouts - Fox McCloud: - - bugfix: Fixes organ repair surgery saying an organ wasn't damaged when it actually - was - - tweak: Removes the 1 burn heal from regular ointment - - tweak: Regular bandages will now disinfect (in addition to stopping bleeding as - they previously did) - - bugfix: Fixes a few crafting recipes not having the proper category - - bugfix: Fixes laser slugs not firing lasers - - tweak: Adjusts the damage/consistency of improvised slugs - - rscadd: Adds in craftable bolas; throw them at someone to slow them down - - rscadd: Secvend starts off with e-bolas - - rscadd: Can make spears with personal crafting now - - bugfix: Fixes teacups and some other drinks having no sprite, in-hand, or object - - rscadd: adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, - and windoor assemblies - - tweak: Cablecuffs are now made by opening the cable stack's crafting menu by using - it in your hand - - bugfix: Fixes cablecuffs not having a unique in-hand icon - - bugfix: Fixes cable coils not having a unique in-hand icon - - tweak: All cablecuffs will be red, regardless of what they're produced from - - bugfix: Fixes an unlimited metal exploit - - rscadd: IV Drip sprites updated; has visual feedback for if it's injecting or - taking blood - - tweak: IV Drip injection rate dramatically increased - - rscadd: Warning ping for when someone is low on blood - - rscadd: Support for species with exotic blood type - - rscadd: Alt-Click to toggle between modes - - tweak: Sensory restoration virology symptom no longer has anti-stun properties - nor heals brain damage, but has a lower acquisition level - - tweak: Damage convert heals individual limbs instead of healing overall damage - (actual impact is low) - - rscadd: Librarian now starts off with a bookbag - - tweak: Bookbag can now hold Bibles, cult tomes, books, and spellbooks - - rscadd: Can empty a bookbag into a bookshelf - - bugfix: Fixes an exploit where you could generate wood out of thin air - - bugfix: Fixes blobspores doing more damage than intended - Fox-McCloud: - - rscadd: 'Adds in a few makeshift items/weapons: molotovs, grenade lances, golden - bikehorn, paper bags, and DIY chainsaws' - - bugfix: Fixes some personal crafting behaving as other than intended - FreeStylaLT: - - bugfix: Fixed brig cell block APCs not getting power - - bugfix: 'Fixed space buggery Kyet made :angry:' - - bugfix: Fixed missing light near labor shuttle dock - - bugfix: Fixed wrongly placed cobweb in solitary - - bugfix: Fixed basketball court not having a basketball - - rscadd: Added windows to brig processing entrance - - rscadd: Re-added the missing EOD and biohazard lockers in Armory - - rscdel: 6 gas masks from Armory - - rscadd: Added grid check into random events. - Krausus: - - tweak: The voting panel now uses the browser datum, which means it looks nicer. - - tweak: The voting panel now updates while a vote is in progress. - - tweak: When a vote is started, it will now include a link to open the vote panel, - as an alternative to typing in "vote". - - tweak: Custom votes will now show full voting results upon completion. - - bugfix: Admins should no longer lose the "cancel vote" link in the voting panel. - - bugfix: View Variables should probably stop crashing admins. - - tweak: The RnD console now shows an overlay while you're waiting for it to do - work, rather than using a separate wait screen. - - rscadd: Admins now have click shortcuts for opening a player panel, showing mob - info, and viewing variables. Specifics are in Hotkey Help. - Kyep: - - rscadd: Admins can now see attacks against SSD players more easily. - - tweak: Clarified the text you get when examining a SSD player. - - bugfix: It is now possible for admins to remove a person's vamp thrall status. - - rscadd: Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb. - - bugfix: Fixes an issue with spy loadouts, and excessive access on loadouts in - general - Spacemanspark: - - bugfix: Cardboard boxes now have their own specific name in the cardboard sheets - menu. - TheDZD: - - bugfix: Fixes tempgun not recharging. - - bugfix: Fixes tempgun beams costing one tenth of what they are supposed to. - - bugfix: Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related - tools should. - - bugfix: Mentors should no longer get spammed by the library checkout computer - on occasion. - - bugfix: Mentors should no longer get spammed by mirrors due to body accessories. - TullyBurnalot: - - tweak: AI Integrity Restorers now destroy any AIs inside if they get EMP'd - - tweak: AI Integrity Restorers can be deconstructed if broken via explosions. This - kills the AI inside - Twinmold: - - bugfix: Can no longer destroy pods with anything other than brute and burn weapons. - - bugfix: Can no longer pull someone out of a pod when no one is actually in the - pod. - - tweak: Can now melee attack pods with weapons when harm intent is on. - - tweak: Vox Objective 4 now calculates the kills vox raiders actually have, instead - of always complete. - Ty-Omaha: - - tweak: Gives Combat Gloves to Code Red ERT agents. - - tweak: Gives Code Gamma Engineering ERT agents Combat Gloves. - monster860, clusterfack, and DeityLink: - - rscadd: Adds space parallax - tigercat2000: - - rscdel: Removes space parallax, due to server overhead, input lag & bugs -2016-08-01: - Crazylemon64: - - rscadd: Admins are now able to print a map of the z levels. - - rscadd: Admins are now capable of scrambling the z levels' transitions. - - bugfix: Janiborg trash bags no longer fit down disposals when empty - Fethas: - - bugfix: (Maybe?)..We actually check if the race HAS BLOOD before trying to suck - them - - rscadd: Due to various complaints from tajarans having hand cramps, glove makers - have removed plasteel from the fabric. - - tweak: Plasmaman can no longer be vampires. - - tweak: Removes the mask check on both victim AND vampire, also makes the message - a bit more obscure, so it's up to your imagination of where you are biting them - and with what. - Fox McCloud: - - tweak: Medical stacks now have 6 uses - - tweak: Medical stacks now heal 25 burn/brute - - tweak: Applying a medical stack to others is instant, no matter what - - tweak: Applying any medical stack to yourself has a 2 second delay - - tweak: Applying a splint to yourself has a 10 second delay - - tweak: No more RNG fumbling of putting splints to yourself - - tweak: Confirmation for applying medical stacks is now green - - tweak: Advanced Medkits now have 2 trauma kits, 2 burn kits, a health analyzer, - 1 roll of gauze, and medipen. - - tweak: Amount of splints in medical vendors increased from 2 to 4 - - bugfix: Fixes weird icon updates when getting healed by medical kits - - rscadd: Adds in object burning system that allows things to be lit on fire - - tweak: being on fire should heat you up a bit quicker and do a bit more damage - - tweak: Novaflowers ignite you rather than uselessly heating you up - - tweak: Adjusts a few pyrotechnic chems to better fit with other tweaks to fire - damage - IcyV: - - rscadd: Adds a unique axe for Atmos-traitors - Krausus: - - bugfix: Probably fixed some very specific items messing up View Variables for - no adequately explicable reason. - - bugfix: Fixed round-end antagonist report failing to print due to null objectives. - Kyep: - - rscadd: Added atmos grenade kit to traitor uplink. - - bugfix: 'Fixed bug with adv pinpointers and CMO hypospray theft objectives. Fixes - #5232' - TheBeoni: - - rscadd: Adds "unique" jumpsuit for Pod Pilot so they can finally stop using security - one Added picture because i do not like that red label - TheDZD: - - bugfix: Shadowling ascendance and badmins pressing the "Destroy All Lights" button - should no longer bring the server to its knees. - - bugfix: Broken lights will no longer re-break. - TullyBurnalot: - - bugfix: Using ATMs leaves fingerprints behind - Twinmold: - - bugfix: Nuke Ops airtank connected to pipenet now. - tigercat2000: - - rscadd: Readded colored cable-cuffs. - - tweak: Making stacks of metal rods now updates the icon correctly. -2016-08-03: - Fox McCloud: - - bugfix: Fixes a rare case where the singularity would escape containment when - properly set up+contained - Krausus: - - tweak: Non-respawnable ghosts will no longer qualify for mid-round rejoining (event - antags, golems, posibrains, etc). Drones, PAIs, and ERTs are exceptions to this. - - tweak: Cryodorms will no longer produce respawnable ghosts for the first 30 minutes - of the round. - - bugfix: Fixed the spooky arrival shuttle. Cryo'd ghosts will now appear above - their cryo pod, in the spooky cryodorms. - - tweak: Cryodorms will now despawn you 90% faster if you willingly enter one. - - tweak: Suiciding in the first 30 minutes of a round will no longer allow you to - ghost and be respawnable. - - tweak: Becoming a non-respawnable ghost lasts the entire round, even if you ghost - in a respawnable manner later on. - - tweak: You can no longer spam pinging posibrains, and cannot ping them at all - if you cannot volunteer for one. - - rscadd: Missing limbs will now be grayed out on your health doll. - chopchop1614: - - bugfix: Fixed the C4 labcoat exploding bug -2016-08-08: - Ar3nn: - - bugfix: Telekinesis no longer is subject to meatspace problems - Chakirski: - - rscadd: Added animal AI holograms. - - tweak: .45 Magazine sprites for the M1911 are now longer invisible. - - tweak: Hoodies no longer look like labcoats while in hand. - - tweak: Ectoplasm spawns in cult mining rooms instead of an invisible "weapon". - - tweak: Duffel bag descriptions and names no longer contain "duffle". - - tweak: Syndicate medical duffel bags can now be seen while in hand. - Crazylemon64: - - rscadd: Adds a "Save" buildmode for admins to preserve their creations for later. - This is currently in an early stage, so don't be surprised by errors! - FlattestGuitar: - - tweak: Holy Water will no longer make you stutter for ages if you're not a cultist - Fox McCloud: - - bugfix: Fixes Orion Ship message being unheard when held in-hand - - rscadd: Adds headphones into the game as a loadout item - - tweak: Removes fireproof core malf AI power - - tweak: upgrade turrets malf AI power CPU reduced from 50 to to 30 - - tweak: Overload machine cost increased from 15 to 20 - - tweak: Override machine cost increased from 15 to 30 - - tweak: can override/overload field generators again - - tweak: Machine uprisers will slowly die if they aren't attacking someone - - rscadd: Adds in Hostile lockdown malf AI power for 30 CPU - - rscadd: Adds break air and fire alarms malf AI powers for 50 and 25 CPU respectively - - tweak: AI's no longer have flood mode on air alarms by default - - rscadd: Adds in lip reading malf AI power for 30 CPU - - tweak: Allows accessories to hypothetically grant armor to their wearer - - bugfix: Greytide spear illusions actually have an attack sound now - - bugfix: fixes the wormhole event being much shorter than intended - FreeStylaLT: - - rscadd: Walls now melt when hot - - rscadd: Added actual coated rwalls - you can make them by clicking on an existing - rwall with at least 2 plasteel in hand. Has infinite temp resistance. - - tweak: Replaced all fake coated rwalls with new rwalls in both metastation (where - they should be) and boxstation - - tweak: Bandaging someone no longer stabs your eyes with bright green - - bugfix: Fixed repainted-to-wood metal flooring in courtroom - it's now actually - wood - - bugfix: Fixed windoor in witness stand facing the wrong way - KasparoVy: - - bugfix: Traitors with the Maroon objective will no longer succeed if their target - is in a locker on the shuttle. - - bugfix: Traitors with the Assassination objective will no longer fail if their - target is assassinated/borged/debrained but on a Z-level greater than the derelict. - Krausus: - - bugfix: Fire will now totally consume you, rather than timidly hiding under your - clothes. - - bugfix: Admin freeze overlays should no longer disappear from humans until they're - actually unfrozen. - LittleBigKid2000: - - rscadd: Adds cheap sunglasses. They provide no flash protection, but are available - in the loadout and clothesmate. - Pinatacolada: - - rscadd: Makes the swedish gene spit out weird swedish chars and sounds - Ty-Omaha: - - tweak: Fixes "is too cumbersome to carry in one hand" from showing up to other - players. - Yurivw: - - bugfix: 'Condimaster now actually makes bottles. Removed: Unused options in admin - secret menu are now removed.' - chopchop1614: - - bugfix: fix bluespace crystals exploit -2016-08-18: - Alexshreds: - - tweak: pAIs can see the crew manifest again. - - tweak: Engineers and Atmos Techs have access to the ORM - Ar3nn: - - tweak: dusting playermobs now generates remains fitting for their race. - Chakishreds: - - tweak: You can now click on objects in a gassy room at the expense of ninja floors. - Chopchop1614: - - bugfix: fixes transformation sting not working. - - bugfix: transformation sting now checks if the target has DNA or not - Crazylemon: - - tweak: Alt+Click should be quicker now - - tweak: The Alt+Click panel vanishes only when you alt click a turf distant from - yourself - - rscadd: Adds `json_to_object_arbitrary_vars`, a proc intended for use with SDQL - - tweak: Eye color is tracked on the eyes only, instead of on the body. - - bugfix: The CMA panel no longer runtimes when you change species. - - bugfix: Deserializing a human now preserves hair and eyes. - - bugfix: Associative lists in VV now display properly again - - rscadd: Admins can now click on the DI panel buttons to debug the corresponding - controller in VV - - bugfix: Fat people are now fat when naked. - - bugfix: Encased mobs can now examine - Crazylemon64: - - bugfix: Makes teleportation checks more consistent, which will ensure that teleporting - in the away mission no longer works. - - bugfix: People on the space ruins level no longer count as dead for assassinate - objectives. - - bugfix: Space border turfs will now regain their destination when over-written - and replaced on the edge of the map - - bugfix: The space manager will no longer runtime if a space ruin writes on the - edge of the map - DaveTheHeadcrab: - - tweak: ERT gloves reverted to how they used to be. - FalseIncarnate: - - rscadd: WOLOLO! Traitor Chaplains can now WOLOLO with the new Missionary Staff - and Robes. WOLOLO! - Fethas: - - bugfix: The whitelist will respect addons better, didn't even have to make a ban - appeal.. - FlattestGuitar: - - tweak: Detective's coolness variable cranked up to 14.5, they will no longer vomit - over corpses. - - tweak: Now you're less likely to vomit over a corpse if you're a normal human - being. - - tweak: golems now have their master saved in attack logs - Fox McCloud: - - rscadd: Adds in formal captain's uniform and armor - - rscadd: Adds rapier to captain's locker - - rscadd: Adds lace up shoes to captain's locker - - rscadd: Adds crown to captain's locker - - tweak: Dramatically speeds up conveyor belts - - bugfix: Appendicitis and Disease Outbreak events will no longer impact clientless - mobs - - bugfix: Fixes bandolier being invisible on spawn - - rscdel: Removes the jukebox from the bar - - tweak: Detective Scanner, Fedora Tipping, Pontificating, and Cap Flipping are - now action buttons - - bugfix: Cane Gun and NT Rep's cane now acts as actual canes - FreeStylaLT: - - bugfix: Fixed missing space transition tiles in emergency shuttle transit - - bugfix: Fixed lack of prisoner access to lower part of labor camp shuttle - - tweak: Changed UO45's and MO19's away missions' external tiles to just airless - ones. - - tweak: Changed MO19's exterior to be more rock than ground, this is to make Linda - cry less when this mission is passed. - General Chaos: - - rscadd: Ports TG's mech bay recharger code. - IcyV: - - rscadd: Adds an exploding chameleon flag for traitors. - KorPhaeron and Fox McCloud: - - tweak: Merges Malf AI into traitor AI - - tweak: Malf AI's starting CPU reduced from 100 to 50 - - tweak: Hacking APCs gives 10 additional CPU - - rscadd: Hacking APCs throws an alert to the AI when it's hacking that automatically - clears when hacking is complete (sounds too) - - rscadd: Traitor AI's start off with a syndicate headset - - rscadd: Adds doomsday device module for AI's for 130 CPU; when activated, it will - purge the station of all life if the AI is not destroyed after 7.5 minutes - - rscadd: Adds in AI upgrade modules which allows you to giving hacking abilities - to the AI or allow it to have increase surveillance capabilities - Krausus: - - tweak: Karma spending is now slightly more straightforward and sanity-checked. - - tweak: Ghosts can now see non-crew antagonists in the Award Karma listing. - - tweak: You can now ctrl+click on yourself to stop pulling something. - Kyep: - - rscadd: Added Syndicate Infiltration Teams (SITs), which are like Syndicate Strike - Teams (SSTs) but focusing on stealth rather than direct combat. Useful for getting - ghosts into rounds, spicing up rounds, having traitors with teamwork, and new - kinds of traitor objectives like kidnap. - - bugfix: Fixed bug that Dust implants had no icon. - LittleBigKid2000: - - bugfix: The arrivals checkpoint camera monitor is now connected to some camera - networks by default. - - bugfix: Talking swords can now be understood by their wielders, and everyone else. - - rscadd: Engineering cyborgs now have floor painters. Absolutely nothing bad can - happen because of this. - Norgad: - - rscadd: Coated Reinforced Walls now have unique sprites - TullyBurnalot: - - tweak: Trash Bags fit in satchels/bags/duffelbags, but cannot be transported after - being filled up. - - tweak: Advanced Mops clean faster, can clean more - - tweak: Holosign Projectors can create more signs - - tweak: Ghosts can no longer create dirt - - tweak: Dirt creation slowed down. "Clean Station" may actually be remotely possible - now - - tweak: Janitorial Closet tidied up - - rscadd: Can fill Light Replacers with boxes directly - - rscadd: Can recycle 3 broken/burnt bulbs into a functioning one - - bugfix: Can no longer cheat around NODROP by inserting NODROP lightbulbs into - Light Replacers - - bugfix: Ghosts can no longer trip Proximity Sensors - - bugfix: Ghosts can no longer trip Infrared Sensors - - bugfix: Effects (like hallucinations) can no longer trip Proximity and Infrared - Sensors - - bugfix: IDs are no longer dropped if their owner cryos with the ID inside a PDA - inside a bag (very specific, yes) - Ty-Omaha: - - tweak: Allows sechailer phrases to be selectable - - tweak: Quick-equipping a PDA will now prioritize the PDA slot before the ID slot. - taukausanake: - - bugfix: Gives proper mix_messages for Uplink, Synthignon, and Synth 'n Soda drinks - tristan1333: - - rscadd: Spacepod paint -2016-08-19: - Crazylemon: - - bugfix: pAIs should now save - FalseIncarnate: - - tweak: Repairing burn damage to robotic limbs now consumes cable in the process. - Each length used repairs 3 burn damage, up to 15 damage per click. - - tweak: Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). - Heal amount unchanged. - - tweak: Self-repairing with cables or welders now incurs a 1 second delay between - click and heal completion. Being repaired by a friend is still no delay (but - requires a friend). - Fox McCloud: - - rscadd: Adds in the Kinetic Smasher as a mining purchase - - bugfix: Fixes slap emote text being the wrong partial color - - bugfix: Fixes the attack text of simple animals attacking human mobs - IcyV: - - rscadd: Adds in an amount of new graffiti - - bugfix: Fixes the issue of other graffiti only being able to be done in black. - Krausus: - - bugfix: Flavor text and records are no longer horrifically butchered when saved - in the database. - TheDZD: - - tweak: Lowered genetic instability damage thresholds by 5 across the board. Effectively - meaning that you can have one additional minor power without shifting into the - next threshold. - - tweak: Lowered the rate at which damage scales with instability, and the decreased - upper cap on each damage type. - - tweak: The base activation probability for powers is now 100%, rather than 45%. - Abilities affected include everything except Cloak of Darkness, Chameleon, No - Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent - activation chances (varying from 5% to 10%). - - tweak: Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), - Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), - and Chameleon (10% to 25%). -2016-08-29: - Crazylemon: - - tweak: You can now mend incisions after having cut open someone's ribcage. - - bugfix: Abductor surgery works again - - bugfix: Face repair surgery works again - - bugfix: The `to_chat` messages are now more descriptive when given a bad target - - rscadd: Admins can now VV by a ref string, directly via a verb - - tweak: VV now builds its HTML using lists, making it much faster to open - DaveTheHeadcrab: - - rscadd: Upgrades the newscaster's liquid paper printing apparatus. Newspapers - printed are higher quality now. - Fox McCloud: - - rscadd: Mining Drones can now toggle meson vision on or off, a light, switch attack - modes, or even drop their own ore - - tweak: Ash storms no longer impact sheltered areas and mining mobs are immune - to ash storms - - rscadd: Adds in two new end-round sounds - - bugfix: Fixes drones not being able to bump open doors - Fox McCloud and KorPhaeron: - - rscadd: Adds in mining shelters - - rscadd: Adds in a few more dice types and ensure dice are packed in bags and not - pill bottles - FreeStylaLT: - - rscadd: Added additional coating to Turbine room. - - bugfix: Fixed leftover vent in Brig Physician's office - - bugfix: Fixed missing coated rwalls in Incinerator - Krausus: - - tweak: Girders are no longer bulletproof. - - bugfix: Changelings' Swap Form ability now actually deducts its cost upon use, - and shouldn't arbitrarily fail to work properly. - - bugfix: Fixed setting status display alerts through communications consoles. - Kyep: - - bugfix: Fixes 'SSD!' warning appearing in attack logs for admins, when the target - player was dead and had ghosted out of their body - TheDZD: - - bugfix: Bookcases no longer force you to take out a book after clicking them - - bugfix: Fixes assorted things logging attacks incorrectly. - TullyBurnalot: - - bugfix: AIs can no longer interact with nuclear bombs (Syndicate-brand included). - AIs can still see the countdown - - bugfix: Mobs without appendixes can no longer contract appendicitis - - bugfix: Holosigns cannot be pulled around -2016-09-01: - Crazylemon: - - bugfix: Dying of low blood is no longer capable of causing eternal death - - bugfix: Having your body brought back to life will no longer break your health - doll - monster860: - - bugfix: Fixes hotel SNPC's getting access that they shouldn't get. -2016-09-16: - Aurorablade: - - rscadd: '*fart now has newtonian move if you have the Superfart power' - Coldflame: - - rscadd: Adds three new variants of 10mm ammunition, AP, HP, and Incendiary. Currently - admin-only. - Crazylemon64: - - tweak: Research data disks now have a description and name attached to them automatically, - to make working with them less obnoxious. - - tweak: Loading design disks now has a sound effect. - - tweak: You can no longer feed non-design disks into the autolathe and destroy - them on accident. - DaveTheHeadcrab: - - tweak: Due to budget cuts expensive fax machines have been replaced with cheaper - versions in some departments. Only essential personnel can fax Central Command. - See your local IAA for details. - FlattestGuitar: - - rscadd: Added emergency nitrogen and plasma tanks, you can find two of each in - the medical storage - FreeStylaLT: - - tweak: Updated Metastation's AI Sat, brig and escape shuttle - - tweak: Updated other Meta areas to match most recent build. (Chapel, some maint, - etc. - minor changes.) - - tweak: Updated Cyberiad's AI Sat to latest tg version, lots of changes there - - basically an entirely new Satellite. - IcyV: - - rscadd: Adds new bottle sprite - - bugfix: Fixes many bottles being locked to a single icon - - rscadd: Buckets can be worn as hats. - Improvedname: - - rscadd: Adds 4 epinephrine autoinjectors to nanomedplus vending machines - KasparoVy: - - rscadd: Adds a Science departmental beret that you can obtain via the loadout - system. - Krausus: - - bugfix: Fixed species-restricted items sometimes failing to "equip" to restricted - species' non-equipment slots. - - rscadd: Players using very old versions of Internet Explorer will now receive - explicit warnings that they're not supported. - - tweak: View Variables will now consistently view the variables of what it's intended - to. - - tweak: Admins can now use the 'msay' command to speak directly to all mentors. - - rscadd: Added a new command, "Toggle Mentor Chat", to give mentors temporary access - to 'msay'. - - bugfix: Fixed never being able to properly respond to a PM from a stealthed admin. - Kyep: - - rscadd: SST and SIT now have their own radio frequency. - LittleBigKid2000: - - bugfix: The God Emperor of Mankind disk now works properly - TheDZD: - - tweak: Xenomorph hunters' leap ability is now always blocked by shields rather - than only 50% of the time. - - tweak: Xenomorph hunters' leap ability being blocked now stuns them as if they - had hit a wall. The leap still goes on a 3 second cooldown as normal. - Ty-Omaha: - - rscadd: Adds fluff item "Tacticool EyePro" + - bugfix: Pressing the light switch in one OR will no longer turn off the lights + for both. + - tweak: The fire alarms in each OR now work independently of each-other. + - rscadd: The second operating room now has its own APC and wiring. diff --git a/html/changelogs/AutoChangeLog-pr-5691.yml b/html/changelogs/AutoChangeLog-pr-5691.yml deleted file mode 100644 index d88812f1585..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5691.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - bugfix: "Botany, viro and xenobio bottles will no longer be invisible." diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml deleted file mode 100644 index 9b853c7f031..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5697.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "Borg coolers and SMES boards can be made again" diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml deleted file mode 100644 index a206365db26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5703.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed full chat panes scrolling unpredictably when trying to view old messages." diff --git a/html/changelogs/AutoChangeLog-pr-5708.yml b/html/changelogs/AutoChangeLog-pr-5708.yml deleted file mode 100644 index db2fd949d15..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5708.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed camera monitors immobilizing you if you reconnect while using one." diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml deleted file mode 100644 index 9ece18ba44e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5713.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed selecting datum types through SDQL2 never returning any datums." diff --git a/html/changelogs/AutoChangeLog-pr-5715.yml b/html/changelogs/AutoChangeLog-pr-5715.yml deleted file mode 100644 index b2f8901db43..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5715.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FlattestGuitar -delete-after: True -changes: - - tweak: "pAIs no longer turn into debris when wiped" diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index ee3da07c3c5..87c047f397a 100644 Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index c45bd957a1a..6e94d89854d 100644 Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index ad4f2d137a6..9d8462c03c5 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3be9bc8b7ea..b3af414cde5 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 79df46605a2..bf6507c412c 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi index 9d6af67be61..92ee97b4aba 100644 Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi index 3926ca17092..e1c40712b23 100644 Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ diff --git a/icons/mob/human_races/r_def_tajaran.dmi b/icons/mob/human_races/r_def_tajaran.dmi index 1e7da69c495..e62f4228fc6 100644 Binary files a/icons/mob/human_races/r_def_tajaran.dmi and b/icons/mob/human_races/r_def_tajaran.dmi differ diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi index d270ab83934..4f603380545 100644 Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi index 0aa7295b8d3..0cbbde7fb3a 100644 Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi index 457e50b204e..d60ae4979df 100644 Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi index f1c4966dc51..586714c7da8 100644 Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi index c287ef822f3..3f45032951d 100644 Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi index 0f1b6956c10..3bcdb3539b7 100644 Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 763e2f0710c..34e2a6ce696 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index dbc8f19c038..2753f52dfee 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index b02e2563aa4..1003b7f7585 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 59531a73db9..927a56bdaa3 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi index 9e8953e4c4f..9c4ccd89c4b 100644 Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi index 66c5851122e..6610948f641 100644 Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index ea17113a2fc..9217fb7730c 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index 4ad3b228849..46b11152ba7 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index a211a035012..e0571e592db 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index ae10eaa4b5c..21ed6e38001 100644 Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index b39ee5577a6..93dacb8f058 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi index f0353c1766d..14a70e1bb4c 100644 Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 3000849be6b..74ef949dd10 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index b6bbd8ab349..a7db164c0fc 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/atmospherics/circulator.dmi b/icons/obj/atmospherics/circulator.dmi new file mode 100644 index 00000000000..45f7a626ef6 Binary files /dev/null and b/icons/obj/atmospherics/circulator.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a3d78f0a1c9..63af8386202 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 6b14e9f5265..08a739ba702 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index a555009ae6a..5a198ee1e64 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi index d05231e7718..c832bb3670a 100644 Binary files a/icons/obj/guns/toy.dmi and b/icons/obj/guns/toy.dmi differ diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 34fedaa560f..73d62edfaa8 100644 Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi index 45f79d9e66b..99e6e84d185 100644 Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index 4baa2b25ae6..baf07678ed8 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl index 886076f21d2..47a3ce113e2 100644 --- a/nano/templates/appearance_changer.tmpl +++ b/nano/templates/appearance_changer.tmpl @@ -23,7 +23,7 @@ {{/if}} -{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_marking_color}} +{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_head_marking_color || data.change_body_marking_color || data.change_tail_marking_color}}
Colors: @@ -44,11 +44,23 @@ {{if data.change_hair_color}} {{:helper.link('Change hair color', null, { 'hair_color' : 1})}} {{/if}} + {{if data.change_secondary_hair_color}} + {{:helper.link('Change secondary hair color', null, { 'secondary_hair_color' : 1})}} + {{/if}} {{if data.change_facial_hair_color}} {{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}} {{/if}} - {{if data.change_marking_color}} - {{:helper.link('Change marking color', null, { 'marking_color' : 1})}} + {{if data.change_secondary_facial_hair_color}} + {{:helper.link('Change secondary facial hair color', null, { 'secondary_facial_hair_color' : 1})}} + {{/if}} + {{if data.change_head_marking_color}} + {{:helper.link('Change head marking color', null, { 'head_marking_color' : 1})}} + {{/if}} + {{if data.change_body_marking_color}} + {{:helper.link('Change body marking color', null, { 'body_marking_color' : 1})}} + {{/if}} + {{if data.change_tail_marking_color}} + {{:helper.link('Change tail marking color', null, { 'tail_marking_color' : 1})}} {{/if}}
@@ -93,14 +105,40 @@ {{/if}} -{{if data.change_markings}} +{{if data.change_head_markings}}
- Marking styles: + Head Marking styles:
- {{for data.marking_styles}} - {{:helper.link(value.markingstyle, null, { 'marking' : value.markingstyle}, null, data.marking_style == value.markingstyle ? 'selected' : null)}} + {{for data.head_marking_styles}} + {{:helper.link(value.headmarkingstyle, null, { 'head_marking' : value.headmarkingstyle}, null, data.head_marking_style == value.headmarkingstyle ? 'selected' : null)}} + {{/for}} +
+
+{{/if}} + +{{if data.change_body_markings}} +
+
+ Body Marking styles: +
+
+ {{for data.body_marking_styles}} + {{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}} + {{/for}} +
+
+{{/if}} + +{{if data.change_tail_markings}} +
+
+ Tail Marking styles: +
+
+ {{for data.tail_marking_styles}} + {{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}} {{/for}}
@@ -118,3 +156,16 @@ {{/if}} + +{{if data.change_alt_head}} +
+
+ Alternate Heads: +
+
+ {{for data.alt_head_styles}} + {{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}} + {{/for}} +
+
+{{/if}} diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl index cec3028652e..f8988e35e43 100644 --- a/nano/templates/chem_dispenser.tmpl +++ b/nano/templates/chem_dispenser.tmpl @@ -78,24 +78,12 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
{{empty}} - - {{if data.glass}} - Glass - {{else}} - Beaker - {{/if}} - is empty + {{if data.glass}}Glass{{else}}Beaker{{/if}} is empty {{/for}} {{else}} - No - {{if data.glass}} - Glass - {{else}} - Beaker - {{/if}} - loaded + No {{if data.glass}}Glass{{else}}Beaker{{/if}} loaded {{/if}} diff --git a/nano/templates/disposal_bin.tmpl b/nano/templates/disposal_bin.tmpl index c68389a95cb..d211b3fbb17 100644 --- a/nano/templates/disposal_bin.tmpl +++ b/nano/templates/disposal_bin.tmpl @@ -31,6 +31,13 @@ Used In File(s): \code\modules\recycling\disposal.dm
{{:helper.link('On', 'gear', {'pump' : 1}, data.mode > 0 ? 'selected' : '')}} {{:helper.link('Off', 'gear', {'pump' : 0}, data.mode <= 0 ? 'selected' : '')}} +
+ +
+
+ Pump Status: +
+
{{:data.pumpstatus}}
diff --git a/nano/templates/keycard_auth.tmpl b/nano/templates/keycard_auth.tmpl index 7f8f24b80eb..af58b061a9f 100644 --- a/nano/templates/keycard_auth.tmpl +++ b/nano/templates/keycard_auth.tmpl @@ -29,7 +29,7 @@ Used In File(s): \code\modules\security_levels\keycard_authentication.dm {{/if}} -

Please swipe your card to authorize the following event

+

Please swipe your card to authorize the following event:

{{:data.event}}
{{:helper.link('Back', 'close', { 'reset' : 1 })}} {{/if}} diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl index accafa99626..3402e8982b5 100644 --- a/nano/templates/supply_console.tmpl +++ b/nano/templates/supply_console.tmpl @@ -52,8 +52,8 @@ Used In File(s): \code\game\supplyshuttle.dm Shuttle Control:
- {{:helper.link('Call Shuttle', 'circle-triangle-e', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}} - {{:helper.link('Return Shuttle', 'circle-triangle-w', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}} + {{:helper.link('Call Shuttle', 'arrow-circle-down', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}} + {{:helper.link('Return Shuttle', 'arrow-circle-up', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}
diff --git a/paradise.dme b/paradise.dme index cedd7f8278a..2f45a1e7527 100644 --- a/paradise.dme +++ b/paradise.dme @@ -358,7 +358,6 @@ #include "code\game\dna\genes\vg_powers.dm" #include "code\game\gamemodes\antag_hud.dm" #include "code\game\gamemodes\antag_spawner.dm" -#include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\factions.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\gameticker.dm" @@ -381,7 +380,6 @@ #include "code\game\gamemodes\blob\blobs\resource.dm" #include "code\game\gamemodes\blob\blobs\shield.dm" #include "code\game\gamemodes\blob\blobs\storage.dm" -#include "code\game\gamemodes\borer\borer.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_power.dm" #include "code\game\gamemodes\changeling\evolution_menu.dm" @@ -463,7 +461,6 @@ #include "code\game\gamemodes\wizard\soulstone.dm" #include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\gamemodes\xenos\xenos.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\job_controller.dm" #include "code\game\jobs\job_exp.dm" @@ -1228,6 +1225,7 @@ #include "code\modules\computer3\computers\robot.dm" #include "code\modules\computer3\computers\security.dm" #include "code\modules\computer3\computers\welcome.dm" +#include "code\modules\countdown\countdown.dm" #include "code\modules\crafting\craft.dm" #include "code\modules\crafting\guncrafting.dm" #include "code\modules\crafting\recipes.dm" @@ -1436,9 +1434,11 @@ #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.dm" +#include "code\modules\mob\status_procs.dm" #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\update_status.dm" #include "code\modules\mob\camera\camera.dm" #include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\login.dm" @@ -1457,6 +1457,9 @@ #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\stat_states.dm" +#include "code\modules\mob\living\status_procs.dm" +#include "code\modules\mob\living\update_status.dm" #include "code\modules\mob\living\carbon\_defines.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defenses.dm" @@ -1467,6 +1470,7 @@ #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\superheroes.dm" #include "code\modules\mob\living\carbon\update_icons.dm" +#include "code\modules\mob\living\carbon\update_status.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_defenses.dm" #include "code\modules\mob\living\carbon\alien\death.dm" @@ -1503,6 +1507,7 @@ #include "code\modules\mob\living\carbon\brain\MMI.dm" #include "code\modules\mob\living\carbon\brain\posibrain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\brain\update_status.dm" #include "code\modules\mob\living\carbon\human\appearance.dm" #include "code\modules\mob\living\carbon\human\body_accessories.dm" #include "code\modules\mob\living\carbon\human\death.dm" @@ -1560,6 +1565,7 @@ #include "code\modules\mob\living\silicon\ai\login.dm" #include "code\modules\mob\living\silicon\ai\logout.dm" #include "code\modules\mob\living\silicon\ai\say.dm" +#include "code\modules\mob\living\silicon\ai\update_status.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" @@ -1576,6 +1582,7 @@ #include "code\modules\mob\living\silicon\pai\say.dm" #include "code\modules\mob\living\silicon\pai\software.dm" #include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\pai\update_status.dm" #include "code\modules\mob\living\silicon\robot\component.dm" #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" @@ -1590,6 +1597,7 @@ #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\update_status.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" @@ -1597,6 +1605,7 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\update_status.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" @@ -1739,7 +1748,6 @@ #include "code\modules\power\cell.dm" #include "code\modules\power\engine.dm" #include "code\modules\power\generator.dm" -#include "code\modules\power\generator_type2.dm" #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\lighting.dm" #include "code\modules\power\port_gen.dm" @@ -1823,54 +1831,49 @@ #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\reusable.dm" #include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Holder.dm" -#include "code\modules\reagents\Chemistry-Machinery.dm" -#include "code\modules\reagents\Chemistry-Readme.dm" -#include "code\modules\reagents\pandemic.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\newchem\Blob-Reagents.dm" -#include "code\modules\reagents\newchem\chem_heater.dm" -#include "code\modules\reagents\newchem\disease.dm" -#include "code\modules\reagents\newchem\drinks.dm" -#include "code\modules\reagents\newchem\drugs.dm" -#include "code\modules\reagents\newchem\food.dm" -#include "code\modules\reagents\newchem\medicine.dm" -#include "code\modules\reagents\newchem\newchem_procs.dm" -#include "code\modules\reagents\newchem\other.dm" -#include "code\modules\reagents\newchem\paradise_pop.dm" -#include "code\modules\reagents\newchem\patch.dm" -#include "code\modules\reagents\newchem\pyro.dm" -#include "code\modules\reagents\newchem\toxins.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\_chemical_reaction_base.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_drink.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_food.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_harm.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_med.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_misc.dm" -#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_slime.dm" -#include "code\modules\reagents\oldchem\reagents\__oldchem_defines.dm" -#include "code\modules\reagents\oldchem\reagents\_reagent_base.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_admin.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_drugs.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_flammable.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_food.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_med.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_misc.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_paint.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_toxin.dm" -#include "code\modules\reagents\oldchem\reagents\reagents_water.dm" -#include "code\modules\reagents\oldchem\reagents\drink\reagents_alcohol.dm" -#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink.dm" -#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_base.dm" -#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_cold.dm" +#include "code\modules\reagents\chemistry\colors.dm" +#include "code\modules\reagents\chemistry\holder.dm" +#include "code\modules\reagents\chemistry\readme.dm" +#include "code\modules\reagents\chemistry\reagents.dm" +#include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" +#include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\pandemic.dm" +#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" +#include "code\modules\reagents\chemistry\reagents\admin.dm" +#include "code\modules\reagents\chemistry\reagents\alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\blob.dm" +#include "code\modules\reagents\chemistry\reagents\disease.dm" +#include "code\modules\reagents\chemistry\reagents\drink_base.dm" +#include "code\modules\reagents\chemistry\reagents\drink_cold.dm" +#include "code\modules\reagents\chemistry\reagents\drinks.dm" +#include "code\modules\reagents\chemistry\reagents\drugs.dm" +#include "code\modules\reagents\chemistry\reagents\food.dm" +#include "code\modules\reagents\chemistry\reagents\medicine.dm" +#include "code\modules\reagents\chemistry\reagents\misc.dm" +#include "code\modules\reagents\chemistry\reagents\paint.dm" +#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm" +#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm" +#include "code\modules\reagents\chemistry\reagents\toxins.dm" +#include "code\modules\reagents\chemistry\reagents\water.dm" +#include "code\modules\reagents\chemistry\recipes\drinks.dm" +#include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\food.dm" +#include "code\modules\reagents\chemistry\recipes\medicine.dm" +#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" +#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" +#include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass_containers.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index 26a08418d69..c27a7eb4c5b 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -20,7 +20,7 @@ //Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events. //This var should match the secret you configured for this webhook on github. -//set to NULL (no quotes) to disable validation. +//This is required as otherwise somebody could trick the script into leaking the api key. $hookSecret = '08ajh0qj93209qj90jfq932j32r'; //Api key for pushing changelogs. @@ -49,27 +49,36 @@ set_exception_handler(function($e) { die(); }); $rawPost = NULL; -if ($hookSecret !== NULL) { - if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { - throw new \Exception("HTTP header 'X-Hub-Signature' is missing."); - } elseif (!extension_loaded('hash')) { - throw new \Exception("Missing 'hash' extension to check the secret code validity."); - } - list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', ''); - if (!in_array($algo, hash_algos(), TRUE)) { - throw new \Exception("Hash algorithm '$algo' is not supported."); - } - $rawPost = file_get_contents('php://input'); - if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) { - throw new \Exception('Hook secret does not match.'); - } +if (!$hookSecret || $hookSecret == '08ajh0qj93209qj90jfq932j32r') + throw new \Exception("Hook secret is required and can not be default"); +if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { + throw new \Exception("HTTP header 'X-Hub-Signature' is missing."); +} elseif (!extension_loaded('hash')) { + throw new \Exception("Missing 'hash' extension to check the secret code validity."); } +list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', ''); +if (!in_array($algo, hash_algos(), TRUE)) { + throw new \Exception("Hash algorithm '$algo' is not supported."); +} +$rawPost = file_get_contents('php://input'); +if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) { + throw new \Exception('Hook secret does not match.'); +} + +$contenttype = null; +//apache and nginx/fastcgi/phpfpm call this two different things. if (!isset($_SERVER['HTTP_CONTENT_TYPE'])) { - throw new \Exception("Missing HTTP 'Content-Type' header."); -} elseif (!isset($_SERVER['HTTP_X_GITHUB_EVENT'])) { + if (!isset($_SERVER['CONTENT_TYPE'])) + throw new \Exception("Missing HTTP 'Content-Type' header."); + else + $contenttype = $_SERVER['CONTENT_TYPE']; +} else { + $contenttype = $_SERVER['HTTP_CONTENT_TYPE']; +} +if (!isset($_SERVER['HTTP_X_GITHUB_EVENT'])) { throw new \Exception("Missing HTTP 'X-Github-Event' header."); } -switch ($_SERVER['HTTP_CONTENT_TYPE']) { +switch ($contenttype) { case 'application/json': $json = $rawPost ?: file_get_contents('php://input'); break; @@ -77,7 +86,7 @@ switch ($_SERVER['HTTP_CONTENT_TYPE']) { $json = $_POST['payload']; break; default: - throw new \Exception("Unsupported content type: $_SERVER[HTTP_CONTENT_TYPE]"); + throw new \Exception("Unsupported content type: $contenttype"); } # Payload structure depends on triggered event # https://developer.github.com/v3/activity/events/types/ @@ -146,14 +155,14 @@ function checkchangelog($payload, $merge = false) { $foundcltag = false; foreach ($body as $line) { $line = trim($line); - if (substr($line,0,4) == ':cl:') { + if (substr($line,0,4) == ':cl:' || substr($line,0,4) == '🆑') { $incltag = true; $foundcltag = true; $pos = strpos($line, " "); if ($pos) $username = substr($line, $pos+1); continue; - } else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:') { + } else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:' || substr($line,0,5) == '/🆑' || substr($line,0,6) == '/ 🆑' ) { $incltag = false; $changelogbody = array_merge($changelogbody, $currentchangelogblock); continue; @@ -242,7 +251,7 @@ function checkchangelog($payload, $merge = false) { if (!count($changelogbody)) return; - $file = 'author: '.$username."\n"; + $file = 'author: "'.trim(str_replace(array("\\", '"'), array("\\\\", "\\\""), $username)).'"'."\n"; $file .= "delete-after: True\n"; $file .= "changes: \n"; foreach ($changelogbody as $changelogitem) { @@ -252,8 +261,9 @@ function checkchangelog($payload, $merge = false) { $file .= "\n"; } $content = array ( - 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'], - 'content' => base64_encode($file) + 'branch' => $payload['pull_request']['base']['ref'], + 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'].' [ci skip]', + 'content' => base64_encode($file) ); $scontext = array('http' => array( 'method' => 'PUT', @@ -342,4 +352,4 @@ function export($addr, $port, $str) { $error = true; return "ERROR"; } -?> +?> \ No newline at end of file