This commit is contained in:
RavingManiac
2012-11-18 22:04:20 +08:00
947 changed files with 46298 additions and 39591 deletions
+1
View File
@@ -0,0 +1 @@
*.dmm merge=merge-dmm
+5
View File
@@ -0,0 +1,5 @@
[merge "merge-dmm"]
name = mapmerge driver
driver = ./mapmerge.sh %O %A %B
recursive = text
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU 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 <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+12 -671
View File
@@ -1,674 +1,15 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Baystation12
Copyright (C) 2010-2012 Baystation12 and tgstation13.
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Preamble
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU 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 <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
+25 -15
View File
@@ -1,8 +1,8 @@
tgstation13 v1.0 - 6 October 2010
baystation12
Website: http://nanotrasen.com
Code: http://code.google.com/p/tgstation13/
IRC: irc://irc.rizon.net/tgstation13
Website: http://baystation12.net/
Code: http://github.com/Baystation12/Baystation12/
IRC: irc://irc.sorcery.net/bs12
================================================================================
INSTALLATION
@@ -12,17 +12,20 @@ First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from http://www.byond.com/. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
Open baystation12.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
saving tgstation.dmb (DEBUG mode)
saving baystation12.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
baystation12.dmb - 0 errors, 0 warnings
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong.
It could be an issue with the current version of the code, either. Ask on IRC
or wait for a fix.
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
@@ -32,19 +35,25 @@ so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit admins.txt to remove the default admins and add your
own. "Game Master" is the highest level of access, and the other recommended admin
levels for now are "Game Admin" (a little below host) and "Moderator". The format is
own. "Game Master" is the highest level of access, and the other recommended
admin level for now is "Game Admin". The format is:
byondkey - Rank
where the BYOND key must be in lowercase and the admin rank must be properly
capitalised. There are a bunch more admin ranks, but these three should be
capitalised. There are a bunch more admin ranks, but these two should be
enough for most servers, assuming you have trustworthy admins.
Additionally, you can set up moderators in moderators.txt, with this format:
byondkey
Moderators have access to player notes and a few other low-level commands.
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join.
compiled baystation12.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Trusted'. Then press
GO and the server should start up and be ready to join.
================================================================================
UPDATING
@@ -72,5 +81,6 @@ coming soon, for now ask in our IRC channel.
IRC Bot Setup
================================================================================
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified IRC channel/server (thanks to Skibiliano)
Instructions for bot setup are included in the /bot/ folder along with the bot/relay script itself
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified
IRC channel/server (thanks to Skibiliano). Instructions for bot setup are
included in the /bot/ folder along with the bot/relay script itself.
+120
View File
@@ -0,0 +1,120 @@
CREATE TABLE `erro_admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`rank` varchar(32) NOT NULL DEFAULT 'Administrator',
`level` int(2) NOT NULL DEFAULT '0',
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`adminckey` varchar(32) NOT NULL,
`adminip` varchar(18) NOT NULL,
`log` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_ban` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bantime` datetime NOT NULL,
`serverip` varchar(32) NOT NULL,
`bantype` varchar(32) NOT NULL,
`reason` text NOT NULL,
`job` varchar(32) DEFAULT NULL,
`duration` int(11) NOT NULL,
`rounds` int(11) DEFAULT NULL,
`expiration_time` datetime NOT NULL,
`ckey` varchar(32) NOT NULL,
`computerid` varchar(32) NOT NULL,
`ip` varchar(32) NOT NULL,
`a_ckey` varchar(32) NOT NULL,
`a_computerid` varchar(32) NOT NULL,
`a_ip` varchar(32) NOT NULL,
`who` text NOT NULL,
`adminwho` text NOT NULL,
`edits` text,
`unbanned` tinyint(1) DEFAULT NULL,
`unbanned_datetime` datetime DEFAULT NULL,
`unbanned_ckey` varchar(32) DEFAULT NULL,
`unbanned_computerid` varchar(32) DEFAULT NULL,
`unbanned_ip` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_feedback` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` datetime NOT NULL,
`round_id` int(8) NOT NULL,
`var_name` varchar(32) NOT NULL,
`var_value` int(16) DEFAULT NULL,
`details` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` varchar(18) NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_option` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pollid` int(11) NOT NULL,
`text` varchar(255) NOT NULL,
`percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
`minval` int(3) DEFAULT NULL,
`maxval` int(3) DEFAULT NULL,
`descmin` varchar(32) DEFAULT NULL,
`descmid` varchar(32) DEFAULT NULL,
`descmax` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_question` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`polltype` varchar(16) NOT NULL DEFAULT 'OPTION',
`starttime` datetime NOT NULL,
`endtime` datetime NOT NULL,
`question` varchar(255) NOT NULL,
`adminonly` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_textreply` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`pollid` int(11) NOT NULL,
`ckey` varchar(32) NOT NULL,
`ip` varchar(18) NOT NULL,
`replytext` text NOT NULL,
`adminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_vote` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`pollid` int(11) NOT NULL,
`optionid` int(11) NOT NULL,
`ckey` varchar(255) NOT NULL,
`ip` varchar(16) NOT NULL,
`adminrank` varchar(32) NOT NULL,
`rating` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_privacy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`ckey` varchar(32) NOT NULL,
`option` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+59 -18
View File
@@ -107,6 +107,7 @@
#define FILE_DIR "code/modules"
#define FILE_DIR "code/modules/admin"
#define FILE_DIR "code/modules/admin/DB ban"
#define FILE_DIR "code/modules/admin/permissionverbs"
#define FILE_DIR "code/modules/admin/verbs"
#define FILE_DIR "code/modules/assembly"
#define FILE_DIR "code/modules/awaymissions"
@@ -130,6 +131,7 @@
#define FILE_DIR "code/modules/DetectiveWork"
#define FILE_DIR "code/modules/flufftext"
#define FILE_DIR "code/modules/food"
#define FILE_DIR "code/modules/genetics"
#define FILE_DIR "code/modules/icon generation"
#define FILE_DIR "code/modules/library"
#define FILE_DIR "code/modules/liquid"
@@ -159,6 +161,8 @@
#define FILE_DIR "code/modules/mob/living/silicon/pai"
#define FILE_DIR "code/modules/mob/living/silicon/robot"
#define FILE_DIR "code/modules/mob/living/simple_animal"
#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
#define FILE_DIR "code/modules/mob/new_player"
#define FILE_DIR "code/modules/mob/simple_animal"
#define FILE_DIR "code/modules/paperwork"
@@ -208,10 +212,8 @@
#define FILE_DIR "code/WorkInProgress/animusstation"
#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara"
#define FILE_DIR "code/WorkInProgress/carn"
#define FILE_DIR "code/WorkInProgress/Chinsky"
#define FILE_DIR "code/WorkInProgress/mapload"
@@ -235,6 +237,7 @@
#define FILE_DIR "icons/mecha"
#define FILE_DIR "icons/misc"
#define FILE_DIR "icons/mob"
#define FILE_DIR "icons/mob/human_races"
#define FILE_DIR "icons/obj"
#define FILE_DIR "icons/obj/assemblies"
#define FILE_DIR "icons/obj/atmospherics"
@@ -353,6 +356,8 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\organs\organ.dm"
#include "code\datums\organs\organ_external.dm"
#include "code\datums\organs\organ_internal.dm"
#include "code\datums\organs\pain.dm"
#include "code\datums\organs\wound.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\conjure.dm"
@@ -416,6 +421,7 @@
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
#include "code\game\gamemodes\blob\blob.dm"
#include "code\game\gamemodes\blob\blob_finish.dm"
#include "code\game\gamemodes\blob\blob_report.dm"
@@ -453,6 +459,7 @@
#include "code\game\gamemodes\nuclear\nuclearbomb.dm"
#include "code\game\gamemodes\nuclear\pinpointer.dm"
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
#include "code\game\gamemodes\sandbox\h_sandbox.dm"
#include "code\game\gamemodes\sandbox\sandbox.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
@@ -477,6 +484,7 @@
#include "code\game\jobs\job\science.dm"
#include "code\game\jobs\job\security.dm"
#include "code\game\jobs\job\silicon.dm"
#include "code\game\machinery\adv_med.dm"
#include "code\game\machinery\ai_slipper.dm"
#include "code\game\machinery\airlock_control.dm"
#include "code\game\machinery\alarm.dm"
@@ -489,15 +497,15 @@
#include "code\game\machinery\constructable_frame.dm"
#include "code\game\machinery\cryo.dm"
#include "code\game\machinery\deployable.dm"
#include "code\game\machinery\dispenser.dm"
#include "code\game\machinery\door_control.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\Freezer.dm"
#include "code\game\machinery\gateway.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\hydroponics.dm"
#include "code\game\machinery\igniter.dm"
#include "code\game\machinery\iv_drip.dm"
#include "code\game\machinery\lightswitch.dm"
#include "code\game\machinery\machinery.dm"
#include "code\game\machinery\magnet.dm"
@@ -519,6 +527,7 @@
#include "code\game\machinery\suit_storage_unit.dm"
#include "code\game\machinery\syndicatebeacon.dm"
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\transformer.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
@@ -584,6 +593,7 @@
#include "code\game\machinery\embedded_controller\access_controller.dm"
#include "code\game\machinery\embedded_controller\airlock_controller.dm"
#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
#include "code\game\machinery\embedded_controller\simple_vent_controller.dm"
#include "code\game\machinery\kitchen\gibber.dm"
#include "code\game\machinery\kitchen\juicer.dm"
#include "code\game\machinery\kitchen\microwave.dm"
@@ -623,13 +633,14 @@
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\explosion_recursive.dm"
#include "code\game\objects\hud.dm"
#include "code\game\objects\items.dm"
#include "code\game\objects\objs.dm"
#include "code\game\objects\structures.dm"
#include "code\game\objects\weapons.dm"
#include "code\game\objects\closets\walllocker.dm"
#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\biomass_rift.dm"
#include "code\game\objects\effects\bump_teleporter.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\gibs.dm"
#include "code\game\objects\effects\glowshroom.dm"
@@ -647,6 +658,7 @@
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
#include "code\game\objects\effects\decals\Cleanable\fuel.dm"
#include "code\game\objects\effects\decals\Cleanable\humans.dm"
#include "code\game\objects\effects\decals\Cleanable\misc.dm"
#include "code\game\objects\effects\decals\Cleanable\robots.dm"
@@ -703,7 +715,6 @@
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\Bedsheets.dm"
#include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
@@ -785,7 +796,9 @@
#include "code\game\objects\structures\morgue.dm"
#include "code\game\objects\structures\musician.dm"
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\shuttle_engines.dm"
#include "code\game\objects\structures\tables_racks.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
#include "code\game\objects\structures\watercloset.dm"
#include "code\game\objects\structures\windoor_assembly.dm"
@@ -856,12 +869,15 @@
#include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\holder2.dm"
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\mod_panel.dm"
#include "code\modules\admin\NewBan.dm"
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\assignment.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm"
@@ -869,6 +885,7 @@
#include "code\modules\admin\verbs\atmosdebug.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
#include "code\modules\admin\verbs\cinematic.dm"
#include "code\modules\admin\verbs\custom_event.dm"
#include "code\modules\admin\verbs\deadsay.dm"
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
@@ -896,6 +913,8 @@
#include "code\modules\assembly\shock_kit.dm"
#include "code\modules\assembly\signaler.dm"
#include "code\modules\assembly\timer.dm"
#include "code\modules\awaymissions\bluespaceartillery.dm"
#include "code\modules\awaymissions\corpse.dm"
#include "code\modules\awaymissions\gateway.dm"
#include "code\modules\awaymissions\loot.dm"
#include "code\modules\awaymissions\pamphlet.dm"
@@ -957,6 +976,8 @@
#include "code\modules\critters\critter_defenses.dm"
#include "code\modules\critters\critters.dm"
#include "code\modules\critters\hivebots\hivebot.dm"
#include "code\modules\customitems\item_defines.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\DetectiveWork\detective_work.dm"
#include "code\modules\DetectiveWork\evidence.dm"
#include "code\modules\DetectiveWork\footprints_and_rag.dm"
@@ -965,6 +986,7 @@
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\genetics\side_effects.dm"
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
@@ -1011,6 +1033,7 @@
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\give.dm"
#include "code\modules\mob\living\carbon\shock.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
#include "code\modules\mob\living\carbon\alien\login.dm"
@@ -1098,7 +1121,6 @@
#include "code\modules\mob\living\silicon\ai\life.dm"
#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\move.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
@@ -1130,22 +1152,23 @@
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
#include "code\modules\mob\living\simple_animal\bear.dm"
#include "code\modules\mob\living\simple_animal\behemoth.dm"
#include "code\modules\mob\living\simple_animal\carp.dm"
#include "code\modules\mob\living\simple_animal\cat.dm"
#include "code\modules\mob\living\simple_animal\clown.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corgi.dm"
#include "code\modules\mob\living\simple_animal\crab.dm"
#include "code\modules\mob\living\simple_animal\life.dm"
#include "code\modules\mob\living\simple_animal\mouse.dm"
#include "code\modules\mob\living\simple_animal\mushroom.dm"
#include "code\modules\mob\living\simple_animal\kobold.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\tomato.dm"
#include "code\modules\mob\living\simple_animal\update_icons.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\syndicate.dm"
#include "code\modules\mob\living\simple_animal\worm.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\new_player\hud.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
@@ -1156,6 +1179,7 @@
#include "code\modules\mob\new_player\savefile.dm"
#include "code\modules\mob\new_player\skill.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
#include "code\modules\mob\simple_animal\head.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
@@ -1168,6 +1192,7 @@
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm"
#include "code\modules\power\cable_logic.dm"
#include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
@@ -1229,6 +1254,7 @@
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
#include "code\modules\reagents\syringe_gun.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\food.dm"
@@ -1302,8 +1328,10 @@
#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\WorkInProgress\autopsy.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\surgery.dm"
#include "code\WorkInProgress\Cael_Aislinn\energy_field.dm"
#include "code\WorkInProgress\Cael_Aislinn\external_shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
@@ -1322,7 +1350,19 @@
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\virtual_particle_catcher.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\SuperMatter.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
#include "code\WorkInProgress\Chinsky\ashtray.dm"
#include "code\WorkInProgress\Ported\policetape.dm"
#include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm"
#include "code\WorkInProgress\virus2\analyser.dm"
#include "code\WorkInProgress\virus2\antibodies.dm"
#include "code\WorkInProgress\virus2\base.dm"
#include "code\WorkInProgress\virus2\curer.dm"
#include "code\WorkInProgress\virus2\diseasesplicer.dm"
#include "code\WorkInProgress\virus2\dishincubator.dm"
#include "code\WorkInProgress\virus2\isolator.dm"
#include "code\ZAS\Airflow.dm"
#include "code\ZAS\Connection.dm"
#include "code\ZAS\FEA_gas_mixture.dm"
@@ -1336,4 +1376,5 @@
#include "interface\interface.dm"
#include "interface\skin.dmf"
#include "maps\tgstation.2.0.9.1.dmm"
#include "maps\RandomZLevels\stationCollision.dm"
// END_INCLUDE
+1 -1
View File
@@ -29,7 +29,7 @@ def YTCV4(youtube_url,cache=1,debug=0):
try:
prev_dict = pickle.load(tiedosto)
except EOFError: # Cache is corrupt
os.remove(directory+"/nano/"+tiedosto.name)
os.remove(directory+tiedosto.name)
print "REMOVED CORRUPT CACHE: "+tiedosto.name
prev_dict = {}
tiedosto.close() # I think this should belong here.
@@ -145,9 +145,9 @@
set_frequency(frequency)
receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
if("power" in signal.data)
on = text2num(signal.data["power"])
@@ -10,6 +10,10 @@ obj/machinery/atmospherics/binary/passive_gate
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
var/frequency = 0
var/id = null
var/datum/radio_frequency/radio_connection
update_icon()
if(node1&&node2)
icon_state = "intact_[on?("on"):("off")]"
@@ -52,4 +56,133 @@ obj/machinery/atmospherics/binary/passive_gate
network1.update = 1
if(network2)
network2.update = 1
network2.update = 1
//Radio remote control
proc
set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
interact(mob/user as mob)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output pressure: </b>
[round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
onclose(user, "atmo_pump")
initialize()
..()
if(frequency)
set_frequency(frequency)
receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
if("power" in signal.data)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
if("set_output_pressure" in signal.data)
target_pressure = between(
0,
text2num(signal.data["set_output_pressure"]),
ONE_ATMOSPHERE*50
)
if("status" in signal.data)
spawn(2)
broadcast_status()
return //do not update_icon
spawn(2)
broadcast_status()
update_icon()
return
attack_hand(user as mob)
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
return
usr.machine = src
interact(user)
return
Topic(href,href_list)
if(..()) return
if(href_list["power"])
on = !on
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
usr.machine = src
src.update_icon()
src.updateUsrDialog()
return
power_change()
..()
update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
@@ -26,11 +26,9 @@ obj/machinery/atmospherics/binary/pump
var/id = null
var/datum/radio_frequency/radio_connection
/*
attack_hand(mob/user)
on = !on
update_icon()
*/
on
on = 1
icon_state = "intact_on"
update_icon()
if(node1&&node2)
@@ -16,8 +16,8 @@ obj/machinery/atmospherics/binary/volume_pump
icon = 'icons/obj/atmospherics/volume_pump.dmi'
icon_state = "intact_off"
name = "Gas pump"
desc = "A pump"
name = "Volumetric gas pump"
desc = "A volumetric pump"
var/on = 0
var/transfer_rate = 200
@@ -26,6 +26,10 @@ obj/machinery/atmospherics/binary/volume_pump
var/id = null
var/datum/radio_frequency/radio_connection
on
on = 1
icon_state = "intact_on"
update_icon()
if(node1&&node2)
icon_state = "intact_[on?("on"):("off")]"
@@ -36,15 +40,23 @@ obj/machinery/atmospherics/binary/volume_pump
icon_state = "exposed_2_off"
else
icon_state = "exposed_3_off"
on = 0
return
process()
// ..()
if(stat & (NOPOWER|BROKEN))
return
if(!on)
return 0
// Pump mechanism just won't do anything if the pressure is too high/too low
var/input_starting_pressure = air1.return_pressure()
var/output_starting_pressure = air2.return_pressure()
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
return 1
var/transfer_ratio = max(1, transfer_rate/air1.volume)
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
@@ -85,6 +97,17 @@ obj/machinery/atmospherics/binary/volume_pump
return 1
interact(mob/user as mob)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output flow: </b>
[round(transfer_rate,1)]l/s | <a href='?src=\ref[src];set_transfer_rate=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
onclose(user, "atmo_pump")
initialize()
..()
@@ -114,4 +137,61 @@ obj/machinery/atmospherics/binary/volume_pump
spawn(2)
broadcast_status()
update_icon()
update_icon()
attack_hand(user as mob)
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
return
usr.machine = src
interact(user)
return
Topic(href,href_list)
if(..()) return
if(href_list["power"])
on = !on
if(href_list["set_transfer_rate"])
var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num
src.transfer_rate = max(0, min(200, new_transfer_rate))
usr.machine = src
src.update_icon()
src.updateUsrDialog()
return
power_change()
..()
update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
@@ -63,4 +63,27 @@
if(abs(other_old_temperature-partner.air_contents.temperature) > 1)
partner.network.update = 1
return 1
return 1
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
@@ -5,10 +5,10 @@
name = "Air Vent"
desc = "Has a valve and pump attached to it"
var/area/initial_loc
level = 1
var/area_uid
var/id_tag = null
power_channel = ENVIRON
var/on = 0
var/pump_direction = 1 //0 = siphoning, 1 = releasing
@@ -29,11 +29,23 @@
var/radio_filter_out
var/radio_filter_in
on
on = 1
icon_state = "out"
siphon
pump_direction = 0
icon_state = "off"
on
on = 1
icon_state = "in"
New()
var/area/A = get_area(loc)
if (A.master)
A = A.master
area_uid = A.uid
initial_loc = get_area(loc)
if (initial_loc.master)
initial_loc = initial_loc.master
area_uid = initial_loc.uid
if (!id_tag)
assign_uid()
id_tag = num2text(uid)
@@ -310,3 +322,9 @@
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
/obj/machinery/atmospherics/unary/vent_pump/Del()
if (initial_loc.air_scrub_info)
initial_loc.air_scrub_info -= id_tag
..()
return
@@ -7,6 +7,7 @@
level = 1
var/area/initial_loc
var/id_tag = null
var/frequency = 1439
var/datum/radio_frequency/radio_connection
@@ -24,10 +25,10 @@
var/radio_filter_out
var/radio_filter_in
New()
var/area/A = get_area(loc)
if (A.master)
A = A.master
area_uid = A.uid
initial_loc = get_area(loc)
if (initial_loc.master)
initial_loc = initial_loc.master
area_uid = initial_loc.uid
if (!id_tag)
assign_uid()
id_tag = num2text(uid)
@@ -226,7 +227,7 @@
return
power_change()
if(powered(ENVIRON))
if(powered(power_channel))
stat &= ~NOPOWER
else
stat |= NOPOWER
@@ -257,3 +258,9 @@
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
if (initial_loc.air_scrub_info)
initial_loc.air_scrub_info -= id_tag
..()
return
+8 -1
View File
@@ -17,6 +17,10 @@ obj/machinery/atmospherics/valve
var/datum/pipe_network/network_node1
var/datum/pipe_network/network_node2
open
open = 1
icon_state = "valve1"
update_icon(animation)
if(animation)
flick("valve[src.open][!src.open]",src)
@@ -170,11 +174,14 @@ obj/machinery/atmospherics/valve
if(target.initialize_directions & get_dir(target,src))
node2 = target
break
build_network()
if(openDuringInit)
close()
open()
openDuringInit = 0
build_network()
/*
var/connect_directions
switch(dir)
+85 -226
View File
@@ -56,7 +56,7 @@ obj/machinery/atmospherics/pipe
..()
simple
icon = 'pipes.dmi'
icon = 'icons/obj/pipes.dmi'
icon_state = "intact-f"
name = "pipe"
@@ -158,8 +158,8 @@ obj/machinery/atmospherics/pipe
else return 1
proc/burst()
src.visible_message("\red \bold \The [src] bursts!");
playsound(src.loc, 'bang.ogg', 25, 1)
src.visible_message("\red \bold [src] bursts!");
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
smoke.start()
@@ -253,19 +253,11 @@ obj/machinery/atmospherics/pipe
name="Scrubbers pipe"
color="red"
icon_state = ""
initialize()
..()
if(istype(node1, /obj/machinery/atmospherics/pipe/simple/supply) || istype(node1, /obj/machinery/atmospherics/pipe/simple/supply))
log_admin("Warning, scrubber pipeline connected to supply pipeline at [x], [y], [z]!")
simple/supply
name="Air supply pipe"
color="blue"
icon_state = ""
initialize()
..()
if(istype(node1, /obj/machinery/atmospherics/pipe/simple/scrubbers) || istype(node1, /obj/machinery/atmospherics/pipe/simple/scrubbers))
log_admin("Warning, supply pipeline connected to scrubber pipeline at [x], [y], [z]!")
simple/supplymain
name="Main air supply pipe"
@@ -309,10 +301,23 @@ obj/machinery/atmospherics/pipe
level = 1
icon_state = "intact-f"
simple/yellow
name="Pipe"
color="yellow"
icon_state = ""
simple/yellow/visible
level = 2
icon_state = "intact-y"
simple/yellow/hidden
level = 1
icon_state = "intact-y-f"
simple/insulated
icon = 'red_pipe.dmi'
icon = 'icons/obj/atmospherics/red_pipe.dmi'
icon_state = "intact"
minimum_temperature_difference = 10000
@@ -325,13 +330,13 @@ obj/machinery/atmospherics/pipe
tank
icon = 'pipe_tank.dmi'
icon = 'icons/obj/atmospherics/pipe_tank.dmi'
icon_state = "intact"
name = "Pressure Tank"
desc = "A large vessel containing pressurized gas."
volume = 1620 //in liters, 0.9 meters by 0.9 meters by 2 meters
volume = 2000 //in liters, 1 meters by 1 meters by 2 meters
dir = SOUTH
initialize_directions = SOUTH
@@ -341,8 +346,6 @@ obj/machinery/atmospherics/pipe
New()
initialize_directions = dir
if(air_temporary)
air_temporary.update_values()
..()
process()
@@ -371,7 +374,7 @@ obj/machinery/atmospherics/pipe
..()
toxins
icon = 'orange_pipe_tank.dmi'
icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi'
name = "Pressure Tank (Plasma)"
New()
@@ -383,8 +386,24 @@ obj/machinery/atmospherics/pipe
..()
oxygen_agent_b
icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi'
name = "Pressure Tank (Oxygen + Plasma)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T0C
var/datum/gas/oxygen_agent_b/trace_gas = new
trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
air_temporary.trace_gases += trace_gas
..()
oxygen
icon = 'blue_pipe_tank.dmi'
icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi'
name = "Pressure Tank (Oxygen)"
New()
@@ -397,7 +416,7 @@ obj/machinery/atmospherics/pipe
..()
nitrogen
icon = 'red_pipe_tank.dmi'
icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
name = "Pressure Tank (Nitrogen)"
New()
@@ -410,7 +429,7 @@ obj/machinery/atmospherics/pipe
..()
air
icon = 'red_pipe_tank.dmi'
icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
name = "Pressure Tank (Air)"
New()
@@ -423,107 +442,6 @@ obj/machinery/atmospherics/pipe
..()
n2o
icon = 'n2o_pipe_tank.dmi'
name = "Pressure Tank (N2O)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T0C
var/datum/gas/sleeping_agent/trace_gas = new
trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
air_temporary.trace_gases += trace_gas
..()
highcap
carbon_dioxide
name = "High Capacity Pressure Tank (Carbon Dioxide)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.carbon_dioxide = (160*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
..()
toxins
icon = 'orange_pipe_tank.dmi'
name = "High Capacity Pressure Tank (Plasma)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.toxins = (160*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
..()
oxygen
icon = 'blue_pipe_tank.dmi'
name = "High Capacity Pressure Tank (Oxygen)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.oxygen = (160*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
..()
nitrogen
icon = 'red_pipe_tank.dmi'
name = "High Capacity Pressure Tank (Nitrogen)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.nitrogen = (160*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
..()
air
icon = 'red_pipe_tank.dmi'
name = "High Capacity Pressure Tank (Air)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.oxygen = (160*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
air_temporary.nitrogen = (160*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
..()
n2o
icon = 'n2o_pipe_tank.dmi'
name = "High Capacity Pressure Tank (N2O)"
New()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T0C
var/datum/gas/sleeping_agent/trace_gas = new
trace_gas.moles = (160*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
air_temporary.trace_gases += trace_gas
..()
Del()
if(node1)
node1.disconnect(src)
@@ -592,7 +510,7 @@ obj/machinery/atmospherics/pipe
user << "\blue Tank is empty!"
vent
icon = 'pipe_vent.dmi'
icon = 'icons/obj/atmospherics/pipe_vent.dmi'
icon_state = "intact"
name = "Vent"
@@ -608,10 +526,14 @@ obj/machinery/atmospherics/pipe
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
New()
New()
initialize_directions = dir
..()
high_volume
name = "Larger vent"
volume = 1000
process()
if(!parent)
if(build_killswitch <= 0)
@@ -621,7 +543,7 @@ obj/machinery/atmospherics/pipe
..()
return
else
parent.mingle_with_turf(loc, 250)
parent.mingle_with_turf(loc, volume)
/*
if(!node1)
if(!nodealert)
@@ -676,7 +598,7 @@ obj/machinery/atmospherics/pipe
icon_state = "exposed"
manifold
icon = 'pipe_manifold.dmi'
icon = 'icons/obj/atmospherics/pipe_manifold.dmi'
icon_state = "manifold-f"
name = "pipe manifold"
@@ -864,6 +786,11 @@ obj/machinery/atmospherics/pipe
color="gray"
icon_state = ""
manifold/yellow
name="Air supply pipe"
color="yellow"
icon_state = ""
manifold/scrubbers/visible
level = 2
icon_state = "manifold-r"
@@ -896,6 +823,14 @@ obj/machinery/atmospherics/pipe
level = 1
icon_state = "manifold-f"
manifold/yellow/visible
level = 2
icon_state = "manifold-y"
manifold/yellow/hidden
level = 1
icon_state = "manifold-y-f"
manifold4w
icon = 'pipe_manifold.dmi'
icon_state = "manifold4w-f"
@@ -1092,110 +1027,34 @@ obj/machinery/atmospherics/pipe
level = 1
icon_state = "manifold4w-f"
cap
name = "pipe endcap"
desc = "An endcap for pipes"
icon = 'pipes.dmi'
icon_state = "cap"
level = 2
volume = 35
dir = SOUTH
initialize_directions = NORTH
var/obj/machinery/atmospherics/node
New()
..()
switch(dir)
if(SOUTH)
initialize_directions = NORTH
if(NORTH)
initialize_directions = SOUTH
if(WEST)
initialize_directions = EAST
if(EAST)
initialize_directions = WEST
hide(var/i)
if(level == 1 && istype(loc, /turf/simulated))
invisibility = i ? 101 : 0
update_icon()
pipeline_expansion()
return list(node)
process()
if(!parent)
..()
else
machines.Remove(src)
/*
if(!node1)
parent.mingle_with_turf(loc, 70)
if(!nodealert)
//world << "Missing node from [src] at [src.x],[src.y],[src.z]"
nodealert = 1
else if(!node2)
parent.mingle_with_turf(loc, 70)
if(!nodealert)
//world << "Missing node from [src] at [src.x],[src.y],[src.z]"
nodealert = 1
else if(!node3)
parent.mingle_with_turf(loc, 70)
if(!nodealert)
//world << "Missing node from [src] at [src.x],[src.y],[src.z]"
nodealert = 1
else if (nodealert)
nodealert = 0
*/
Del()
if(node)
node.disconnect(src)
..()
disconnect(obj/machinery/atmospherics/reference)
if(reference == node)
if(istype(node, /obj/machinery/atmospherics/pipe))
del(parent)
node = null
update_icon()
..()
update_icon()
overlays = new()
icon_state = "cap[invisibility ? "-f" : ""]"
return
initialize()
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
node = target
break
var/turf/T = src.loc // hide if turf is not intact
hide(T.intact)
//update_icon()
update_icon()
visible
level = 2
icon_state = "cap"
hidden
level = 1
icon_state = "cap-f"
obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (istype(src, /obj/machinery/atmospherics/pipe/tank))
return ..()
if (istype(src, /obj/machinery/atmospherics/pipe/vent))
return ..()
// ===== Handle paints =====
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/red))
src.color = "red"
user << "\red You paint the pipe red."
update_icon()
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/blue))
src.color = "blue"
user << "\red You paint the pipe blue."
update_icon()
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/green))
src.color = "green"
user << "\red You paint the pipe green."
update_icon()
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/yellow))
src.color = "yellow"
user << "\red You paint the pipe yellow."
update_icon()
return 1
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
@@ -1208,7 +1067,7 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'Ratchet.ogg', 50, 1)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
@@ -1220,4 +1079,4 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
if (meter.target == src)
new /obj/item/pipe_meter(T)
del(meter)
del(src)
del(src)
+1 -1
View File
@@ -90,7 +90,7 @@ datum/air_group
if (next_check > 0)
next_check--
return 1
next_check += check_delay + rand(0,check_delay/2)
next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
check_delay++
var/turf/simulated/list/border_individual = list()
+1 -3
View File
@@ -152,10 +152,8 @@ datum
var/start_time = world.timeofday
for(var/turf/simulated/S in world)
if(!S.blocks_air && !S.parent && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
if(!S.blocks_air && !S.parent)
assemble_group_turf(S)
if(S.z > 4) // Skipping asteroids -- TLE
continue
S.update_air_properties()
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
+1 -1
View File
@@ -304,7 +304,7 @@ turf
if (next_check > 0)
next_check--
return 1
next_check += check_delay + rand(0,check_delay/2)
next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
check_delay++
var/turf/simulated/list/possible_fire_spreads = list()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1,14 @@
/area/engine/cooling
/area/engine/port_gyro_bay
/area/engine/starboard_gyro_bay
/area/engine/generators
/area/engine/turbine_control
/area/engine/reactor_core
/area/engine/aux_control
@@ -1,12 +1,12 @@
//mostly replaced these with emitter code
//they're functionally identical
/obj/machinery/engine/laser
/obj/machinery/computer/laser
name = "Zero-point laser"
desc = "A super-powerful laser"
var/visible = 1
var/state = 1.0
var/obj/beam/e_beam/first
//var/obj/beam/e_beam/first
var/power = 500
icon = 'engine.dmi'
icon_state = "laser"
@@ -17,8 +17,8 @@
var/phase = 0
var/phase_variance = 0
/obj/machinery/engine/laser/process()
if(on)
/obj/machinery/computer/laser/process()
/*if(on)
if(!first)
src.first = new /obj/beam/e_beam(src.loc)
src.first.master = src
@@ -34,14 +34,14 @@
src.first.updatebeam()
else
if(first)
del first
del first*/
/obj/machinery/engine/laser/proc/setpower(var/powera)
src.power = powera
/obj/machinery/computer/laser/proc/setpower(var/powera)
/*src.power = powera
if(first)
first.setpower(src.power)
first.setpower(src.power)*/
/*
/obj/beam/e_beam
name = "Laser beam"
icon = 'projectiles.dmi'
@@ -128,4 +128,5 @@
/obj/beam/e_beam/proc/hit()
del src
return
return
*/
@@ -10,7 +10,7 @@
/obj/machinery/computer/lasercon
New()
spawn(1)
for(var/obj/machinery/emitter/zero_point_laser/las in world)
for(var/obj/machinery/zero_point_emitter/las in world)
if(las.id == src.id)
lasers += las
@@ -35,9 +35,9 @@
user << browse(null, "window=laser_control")
return
var/t = "<TT><B>Laser status monitor</B><HR>"
for(var/obj/machinery/emitter/zero_point_laser/laser in lasers)
for(var/obj/machinery/zero_point_emitter/laser in lasers)
t += "Zero Point Laser<br>"
t += "Power level: <A href = '?src=\ref[laser];input=-0.005'>-</A> <A href = '?src=\ref[laser];input=-0.001'>-</A> <A href = '?src=\ref[laser];input=-0.0005'>-</A> <A href = '?src=\ref[laser];input=-0.0001'>-</A> [laser.mega_energy]MeV <A href = '?src=\ref[laser];input=0.0001'>+</A> <A href = '?src=\ref[laser];input=0.0005'>+</A> <A href = '?src=\ref[laser];input=0.001'>+</A> <A href = '?src=\ref[laser];input=0.005'>+</A><BR>"
t += "Power level: <A href = '?src=\ref[laser];input=-0.005'>-</A> <A href = '?src=\ref[laser];input=-0.001'>-</A> <A href = '?src=\ref[laser];input=-0.0005'>-</A> <A href = '?src=\ref[laser];input=-0.0001'>-</A> [laser.energy]MeV <A href = '?src=\ref[laser];input=0.0001'>+</A> <A href = '?src=\ref[laser];input=0.0005'>+</A> <A href = '?src=\ref[laser];input=0.001'>+</A> <A href = '?src=\ref[laser];input=0.005'>+</A><BR>"
t += "Frequency: <A href = '?src=\ref[laser];freq=-10000'>-</A> <A href = '?src=\ref[laser];freq=-1000'>-</A> [laser.freq] <A href = '?src=\ref[laser];freq=1000'>+</A> <A href = '?src=\ref[laser];freq=10000'>+</A><BR>"
t += "Output: [laser.active ? "<B>Online</B> <A href = '?src=\ref[laser];online=1'>Offline</A>" : "<A href = '?src=\ref[laser];online=1'>Online</A> <B>Offline</B> "]<BR>"
t += "<hr>"
@@ -87,20 +87,20 @@
else if( href_list["input"] )
var/i = text2num(href_list["input"])
var/d = i
for(var/obj/machinery/emitter/zero_point_laser/laser in lasers)
var/new_power = laser.mega_energy + d
for(var/obj/machinery/zero_point_emitter/laser in lasers)
var/new_power = laser.energy + d
new_power = max(new_power,0.0001) //lowest possible value
new_power = min(new_power,0.01) //highest possible value
laser.mega_energy = new_power
laser.energy = new_power
//
src.updateDialog()
else if( href_list["online"] )
var/obj/machinery/emitter/zero_point_laser/laser = href_list["online"]
var/obj/machinery/zero_point_emitter/laser = href_list["online"]
laser.active = !laser.active
src.updateDialog()
else if( href_list["freq"] )
var/amt = text2num(href_list["freq"])
for(var/obj/machinery/emitter/zero_point_laser/laser in lasers)
for(var/obj/machinery/zero_point_emitter/laser in lasers)
var/new_freq = laser.frequency + amt
new_freq = max(new_freq,1) //lowest possible value
new_freq = min(new_freq,20000) //highest possible value
@@ -26,9 +26,6 @@
density = 1
anchored = 0
LuminosityRed = 4
LuminosityGreen = 6
var/gasefficency = 0.25
var/base_icon_state = "darkmatter"
@@ -86,13 +83,13 @@
if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
if(damage > emergency_point)
radioalert("states, \"[emergency_alert]\"","Supermatter Monitor")
//radioalert("states, \"[emergency_alert]\"","Supermatter Monitor")
lastwarning = world.timeofday
else if(damage >= damage_archived) // The damage is still going up
radioalert("states, \"[warning_alert]\"","Supermatter Monitor")
//radioalert("states, \"[warning_alert]\"","Supermatter Monitor")
lastwarning = world.timeofday-150
else // Phew, we're safe
radioalert("states, \"[safe_alert]\"","Supermatter Monitor")
//radioalert("states, \"[safe_alert]\"","Supermatter Monitor")
lastwarning = world.timeofday
if(damage > explosion_point)
@@ -1,55 +1,236 @@
//new supermatter lasers
/obj/machinery/emitter/zero_point_laser
/obj/machinery/zero_point_emitter
name = "Zero-point laser"
desc = "A super-powerful laser"
icon = 'engine.dmi'
icon_state = "laser"
mega_energy = 0.0001
anchored = 0
density = 1
req_access = list(access_research)
use_power = 1
idle_power_usage = 10
active_power_usage = 300
var/active = 0
var/fire_delay = 100
var/last_shot = 0
var/shot_number = 0
var/state = 0
var/locked = 0
var/energy = 0.0001
var/frequency = 1
var/freq = 50000
var/id
Topic(href, href_list)
..()
if( href_list["input"] )
var/i = text2num(href_list["input"])
var/d = i
var/new_power = mega_energy + d
new_power = max(new_power,0.0001) //lowest possible value
new_power = min(new_power,0.01) //highest possible value
mega_energy = new_power
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
else if( href_list["online"] )
active = !active
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
else if( href_list["freq"] )
var/amt = text2num(href_list["freq"])
var/new_freq = frequency + amt
new_freq = max(new_freq,1) //lowest possible value
new_freq = min(new_freq,20000) //highest possible value
frequency = new_freq
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
/obj/machinery/zero_point_emitter/verb/rotate()
set name = "Rotate"
set category = "Object"
set src in oview(1)
update_icon()
if (active && !(stat & (NOPOWER|BROKEN)))
icon_state = "laser"//"emitter_+a"
if (src.anchored || usr:stat)
usr << "It is fastened to the floor!"
return 0
src.dir = turn(src.dir, 90)
return 1
/obj/machinery/zero_point_emitter/New()
..()
return
/obj/machinery/zero_point_emitter/update_icon()
if (active && !(stat & (NOPOWER|BROKEN)))
icon_state = "laser"//"emitter_+a"
else
icon_state = "laser"//"emitter"
/obj/machinery/zero_point_emitter/attack_hand(mob/user as mob)
src.add_fingerprint(user)
if(state == 2)
if(!src.locked)
if(src.active==1)
src.active = 0
user << "You turn off the [src]."
src.use_power = 1
else
src.active = 1
user << "You turn on the [src]."
src.shot_number = 0
src.fire_delay = 100
src.use_power = 2
update_icon()
else
icon_state = "laser"//"emitter"
user << "\red The controls are locked!"
else
user << "\red The [src] needs to be firmly secured to the floor first."
return 1
process()
var/curstate = active
..()
if(active != curstate)
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
/obj/machinery/zero_point_emitter/emp_act(var/severity)//Emitters are hardened but still might have issues
use_power(1000)
/* if((severity == 1)&&prob(1)&&prob(1))
if(src.active)
src.active = 0
src.use_power = 1 */
return 1
/obj/machinery/zero_point_emitter/process()
if(stat & (NOPOWER|BROKEN))
return
if(src.state != 2)
src.active = 0
return
if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 2
src.shot_number ++
else
src.fire_delay = rand(20,100)
src.shot_number = 0
use_power(1000)
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
if(prob(35))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
A.dir = src.dir
switch(dir)
if(NORTH)
A.yo = 20
A.xo = 0
if(EAST)
A.yo = 0
A.xo = 20
if(WEST)
A.yo = 0
A.xo = -20
else // Any other
A.yo = -20
A.xo = 0
A.process() //TODO: Carn: check this out
/obj/machinery/zero_point_emitter/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/wrench))
if(active)
user << "Turn off the [src] first."
return
switch(state)
if(0)
state = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear a ratchet")
src.anchored = 1
if(1)
state = 0
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear a ratchet")
src.anchored = 0
if(2)
user << "\red The [src.name] needs to be unwelded from the floor."
return
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(active)
user << "Turn off the [src] first."
return
switch(state)
if(0)
user << "\red The [src.name] needs to be wrenched to the floor."
if(1)
if (WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
if (do_after(user,20))
if(!src || !WT.isOn()) return
state = 2
user << "You weld the [src] to the floor."
else
user << "\red You need more welding fuel to complete this task."
if(2)
if (WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
if (do_after(user,20))
if(!src || !WT.isOn()) return
state = 1
user << "You cut the [src] free from the floor."
else
user << "\red You need more welding fuel to complete this task."
return
if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
if(emagged)
user << "\red The lock seems to be broken"
return
if(src.allowed(user))
if(active)
src.locked = !src.locked
user << "The controls are now [src.locked ? "locked." : "unlocked."]"
else
src.locked = 0 //just in case it somehow gets locked
user << "\red The controls can only be locked when the [src] is online"
else
user << "\red Access denied."
return
if(istype(W, /obj/item/weapon/card/emag) && !emagged)
locked = 0
emagged = 1
user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
return
..()
return
/obj/machinery/zero_point_emitter/power_change()
..()
update_icon()
return
/obj/machinery/zero_point_emitter/Topic(href, href_list)
..()
if( href_list["input"] )
var/i = text2num(href_list["input"])
var/d = i
var/new_power = energy + d
new_power = max(new_power,0.0001) //lowest possible value
new_power = min(new_power,0.01) //highest possible value
energy = new_power
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
else if( href_list["online"] )
active = !active
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
else if( href_list["freq"] )
var/amt = text2num(href_list["freq"])
var/new_freq = frequency + amt
new_freq = max(new_freq,1) //lowest possible value
new_freq = min(new_freq,20000) //highest possible value
frequency = new_freq
//
for(var/obj/machinery/computer/lasercon/comp in world)
if(comp.id == src.id)
comp.updateDialog()
@@ -1,513 +0,0 @@
/mob/living/carbon/human/tajaran/examine()
set src in oview()
if(!usr || !src) return
if(((usr.disabilities & 128) || usr.blinded || usr.stat) && !(istype(usr,/mob/dead/observer/)))
usr << "<span class='notice'>Something is there but you can't see it.</span>"
return
var/skipgloves = 0
var/skipsuitstorage = 0
var/skipjumpsuit = 0
var/skipshoes = 0
var/skipmask = 0
var/skipears = 0
var/skipeyes = 0
//exosuits and helmets obscure our view and stuff.
if (src.wear_suit)
skipgloves = src.wear_suit.flags_inv & HIDEGLOVES
skipsuitstorage = src.wear_suit.flags_inv & HIDESUITSTORAGE
skipjumpsuit = src.wear_suit.flags_inv & HIDEJUMPSUIT
skipshoes = src.wear_suit.flags_inv & HIDESHOES
if (src.head)
skipmask = src.head.flags_inv & HIDEMASK
skipeyes = src.head.flags_inv & HIDEEYES
skipears = src.head.flags_inv & HIDEEARS
// crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :<
var/t_He = "It" //capitalised for use at the start of each line.
var/t_his = "its"
var/t_him = "it"
var/t_has = "has"
var/t_is = "is"
var/msg = "<span class='info'>*---------*\nThis is "
if( skipjumpsuit && (wear_mask || skipmask) ) //big suits/masks make it hard to tell their gender
t_He = "They"
t_his = "their"
t_him = "them"
t_has = "have"
t_is = "are"
else
if(src.icon)
msg += "\icon[src.icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
switch(src.gender)
if(MALE)
t_He = "He"
t_his = "his"
t_him = "him"
if(FEMALE)
t_He = "She"
t_his = "her"
t_him = "her"
msg += "<EM>\a [src], one of the cat-like Tajarans</EM>!\n"
//uniform
if (src.w_uniform && !skipjumpsuit)
if (src.w_uniform.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.w_uniform] [src.w_uniform.gender==PLURAL?"some":"a"] blood-stained [src.w_uniform.name]!</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[src.w_uniform] \a [src.w_uniform].\n"
//head
if (src.head)
if (src.head.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.head] [src.head.gender==PLURAL?"some":"a"] blood-stained [src.head.name] on [t_his] head!</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[src.head] \a [src.head] on [t_his] head.\n"
//suit/armour
if (src.wear_suit)
if (src.wear_suit.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.wear_suit] [src.wear_suit.gender==PLURAL?"some":"a"] blood-stained [src.wear_suit.name]!</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[src.wear_suit] \a [src.wear_suit].\n"
//suit/armour storage
if(src.s_store && !skipsuitstorage)
if(src.s_store.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] carrying \icon[src.s_store] [src.s_store.gender==PLURAL?"some":"a"] blood-stained [src.s_store.name] on [t_his] [src.wear_suit.name]!</span>\n"
else
msg += "[t_He] [t_is] carrying \icon[src.s_store] \a [src.s_store] on [t_his] [src.wear_suit.name].\n"
//back
if (src.back)
if (src.back.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[src.back] [src.back.gender==PLURAL?"some":"a"] blood-stained [src.back] on [t_his] back.</span>\n"
else
msg += "[t_He] [t_has] \icon[src.back] \a [src.back] on [t_his] back.\n"
//left hand
if (src.l_hand)
if (src.l_hand.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] holding \icon[src.l_hand] [src.l_hand.gender==PLURAL?"some":"a"] blood-stained [src.l_hand.name] in [t_his] left hand!</span>\n"
else
msg += "[t_He] [t_is] holding \icon[src.l_hand] \a [src.l_hand] in [t_his] left hand.\n"
//right hand
if (src.r_hand)
if (src.r_hand.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] holding \icon[src.r_hand] [src.r_hand.gender==PLURAL?"some":"a"] blood-stained [src.r_hand.name] in [t_his] right hand!</span>\n"
else
msg += "[t_He] [t_is] holding \icon[src.r_hand] \a [src.r_hand] in [t_his] right hand.\n"
//gloves
if (src.gloves && !skipgloves)
if (src.gloves.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[src.gloves] [src.gloves.gender==PLURAL?"some":"a"] blood-stained [src.gloves.name] on [t_his] hands!</span>\n"
else
msg += "[t_He] [t_has] \icon[src.gloves] \a [src.gloves] on [t_his] hands.\n"
else if (src.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] blood-stained hands!</span>\n"
//handcuffed?
if (src.handcuffed)
msg += "[t_He] [t_is] \icon[src.handcuffed] handcuffed!\n"
//belt
if (src.belt)
if (src.belt.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[src.belt] [src.belt.gender==PLURAL?"some":"a"] blood-stained [src.belt.name] about [t_his] waist!</span>\n"
else
msg += "[t_He] [t_has] \icon[src.belt] \a [src.belt] about [t_his] waist.\n"
//shoes
if (src.shoes && !skipshoes)
if(src.shoes.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.shoes] [src.shoes.gender==PLURAL?"some":"a"] blood-stained [src.shoes.name] on [t_his] feet!</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[src.shoes] \a [src.shoes] on [t_his] feet.\n"
//mask
if (src.wear_mask && !skipmask)
if (src.wear_mask.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[src.wear_mask] [src.wear_mask.gender==PLURAL?"some":"a"] blood-stained [src.wear_mask.name] on [t_his] face!</span>\n"
else
msg += "[t_He] [t_has] \icon[src.wear_mask] \a [src.wear_mask] on [t_his] face.\n"
//eyes
if (src.glasses && !skipeyes)
if (src.glasses.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[src.glasses] [src.glasses.gender==PLURAL?"some":"a"] blood-stained [src.glasses] covering [t_his] eyes!</span>\n"
else
msg += "[t_He] [t_has] \icon[src.glasses] \a [src.glasses] covering [t_his] eyes.\n"
if (src.l_ear && !skipears)
msg += "[t_He] [t_has] has a \icon[src.l_ear] [src.l_ear.name] on [t_his] left ear.\n"
if (src.r_ear && !skipears)
msg += "[t_He] [t_has] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear.\n"
//ID
if (src.wear_id)
var/id
if(istype(src.wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda = src.wear_id
id = pda.owner
else if(istype(src.wear_id, /obj/item/weapon/card/id)) //just in case something other than a PDA/ID card somehow gets in the ID slot :[
var/obj/item/weapon/card/id/idcard = src.wear_id
id = idcard.registered_name
if (id && (id != src.real_name) && (get_dist(src, usr) <= 1) && prob(10))
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.wear_id] \a [src.wear_id] yet something doesn't seem right...</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[src.wear_id] \a [src.wear_id].\n"
//Jitters
if (src.is_jittery)
if(src.jitteriness >= 300)
msg += "<span class='warning'><B>[t_He] [t_is] convulsing violently!</B></span>\n"
else if(src.jitteriness >= 200)
msg += "<span class='warning'>[t_He] [t_is] extremely jittery.</span>\n"
else if(src.jitteriness >= 100)
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
var/distance = get_dist(usr,src)
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
distance = 1
if (src.stat == 1 || stat == 2)
msg += "<span class='warning'>[name] doesn't seem to be responding to anything around [t_him], [t_his] eyes closed as though asleep.</span>\n"
if((!isbreathing || holdbreath) && distance <= 3)
msg += "<span class='warning'>[name] does not appear to be breathing.</span>\n"
if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1)
for(var/mob/O in viewers(usr.loc, null))
O.show_message("[usr] checks [src]'s pulse.", 1)
spawn(15)
usr << "\blue [name] has a pulse!"
if (src.stat == 2 || (changeling && changeling.changeling_fakedeath == 1))
if(distance <= 1)
if(istype(usr, /mob/living/carbon/human) && usr.stat == 0)
for(var/mob/O in viewers(usr.loc, null))
O.show_message("[usr] checks [src]'s pulse.", 1)
spawn(15)
usr << "\red [name] has no pulse!"
/* if (src.getBruteLoss())
if (src.getBruteLoss() < 30)
usr << "\red [src.name] looks slightly injured!"
else
usr << "\red <B>[src.name] looks severely injured!</B>"*/
if (src.cloneloss)
if (src.cloneloss < 30)
msg += "<span class='warning'>[src.name] looks slightly... unfinished?</span>\n"
else
msg += "<span class='warning'>[src.name] looks very... unfinished?</B></span>\n"
/* if (src.getFireLoss())
if (src.getFireLoss() < 30)
usr << "\red [src.name] looks slightly burned!"
else
usr << "\red <B>[src.name] looks severely burned!</B>"*/
msg += "<span class='warning'>"
if (src.nutrition < 100)
msg += "[t_He] [t_is] severely malnourished.\n"
else if (src.nutrition >= 500)
if (usr.nutrition < 100)
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else
msg += "[t_He] [t_is] quite chubby.\n"
msg += "</span>"
if (src.getBrainLoss() >= 60 && !stat)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if (!src.client)
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
var/list/wound_descriptions = list()
var/list/wound_flavor_text = list()
for(var/named in organs)
var/datum/organ/external/temp = organs[named]
if(temp)
if(temp.destroyed)
wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>[t_He] is missing [t_his] [temp.display_name].</b></span>\n"
continue
if(temp.robot)
if(!(temp.brute_dam + temp.burn_dam))
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot arm!</span>\n"
else
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot arm, it has"
switch(temp.brute_dam)
if(0)
wound_flavor_text["[temp.display_name]"] += ""
else if(0 to 20)
wound_flavor_text["[temp.display_name]"] += " some dents"
else if(20 to INFINITY)
wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting")
if(temp.brute_dam && temp.brute_dam)
wound_flavor_text["[temp.display_name]"] += " and"
switch(temp.burn_dam)
if(0)
wound_flavor_text["[temp.display_name]"] += ""
else if(0 to 20)
wound_flavor_text["[temp.display_name]"] += " some burns"
else if(20 to INFINITY)
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
else if(temp.wounds)
var/list/wounds = list(list(),list(),list(),list(),list(),list())
for(var/datum/organ/wound/w in temp.wounds)
switch(w.healing_state)
if(0)
var/list/cut = wounds[1]
cut += w
wounds[1] = cut
if(1)
var/list/cut = wounds[2]
cut += w
wounds[2] = cut
if(2)
var/list/cut = wounds[3]
cut += w
wounds[3] = cut
if(3)
var/list/cut = wounds[4]
cut += w
wounds[4] = cut
if(4)
var/list/cut = wounds[5]
cut += w
wounds[5] = cut
if(5)
var/list/cut = wounds[6]
cut += w
wounds[6] = cut
wound_descriptions["[temp.display_name]"] = wounds
else
wound_flavor_text["[temp.display_name]"] = ""
//Now that we have a big list of all the wounds, on all the limbs.
var/list/is_bleeding = list()
for(var/named in wound_descriptions)
var/list/wound_states = wound_descriptions[named]
var/list/flavor_text = list()
for(var/i = 1, i <= 6, i++)
var/list/wound_state = wound_states[i] //All wounds at this level of healing.
var/list/tally = list("cut" = 0, "deep cut" = 0, "flesh wound" = 0, "gaping wound" = 0, "big gaping wound" = 0, "massive wound" = 0,\
"tiny bruise" = 0, "small bruise" = 0, "moderate bruise" = 0, "large bruise" = 0, "huge bruise" = 0, "monumental bruise" = 0,\
"small burn" = 0, "moderate burn" = 0, "large burn" = 0, "severe burn" = 0, "deep burn" = 0, "carbonised area" = 0) //How many wounds of what size.
for(var/datum/organ/wound/w in wound_state)
if(w.bleeding && !is_bleeding[named]) is_bleeding[named] = 1
switch(w.wound_size)
if(1)
switch(w.wound_type)
if(0)
tally["cut"] += 1
if(1)
tally["tiny bruise"] += 1
if(2)
tally["small burn"] += 1
if(2)
switch(w.wound_type)
if(0)
tally["deep cut"] += 1
if(1)
tally["small bruise"] += 1
if(2)
tally["moderate burn"] += 1
if(3)
switch(w.wound_type)
if(0)
tally["flesh wound"] += 1
if(1)
tally["moderate bruise"] += 1
if(2)
tally["large burn"] += 1
if(4)
switch(w.wound_type)
if(0)
tally["gaping wound"] += 1
if(1)
tally["large bruise"] += 1
if(2)
tally["severe burn"] += 1
if(5)
switch(w.wound_type)
if(0)
tally["big gaping wound"] += 1
if(1)
tally["huge bruise"] += 1
if(2)
tally["deep burn"] += 1
if(6)
switch(w.wound_type)
if(0)
tally["massive wound"] += 1
if(1)
tally["monumental bruise"] += 1
if(2)
tally["carbonised area"] += 1
for(var/tallied in tally)
if(!tally[tallied])
continue
//if(flavor_text_string && tally[tallied])
// for(
// flavor_text_string += pick(list(", as well as", ", in addition to")) //add more later.
var/tallied_rename = list("cut" = "cut","deep cut" = "deep cut", "flesh wound" = "flesh wound",\
"gaping wound" = "gaping wound", "big gaping wound" = "big gaping wound", "massive wound" = "massive wound",\
"tiny bruise" = "tiny bruise", "small bruise" = "small bruise", "moderate bruise" = "moderate bruise",\
"large bruise" = "large bruise", "huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
"small burn" = "small burn", "moderate burn" = "moderate burn", "large burn" = "large burn",\
"severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area")
switch(i)
if(2) //Healing wounds.
if(tallied in list("cut","tiny bruise","small burn"))
continue
tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\
"gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\
"massive wound" = "massive blood soaked bandage", "small bruise" = "small bruise",\
"moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\
"huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
"moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\
"severe burn" = "severe salved burn", "deep burn" = "deep salved burn",\
"carbonised area" = "treated carbonised area")
if(3)
if(tallied in list("cut","tiny bruise","small burn"))
continue
tallied_rename = list("deep cut" = "fading cut", "flesh wound" = "small healing wound",\
"gaping wound" = "healing wound", "big gaping wound" = "big healing wound",\
"massive wound" = "massive healing wound", "small bruise" = "tiny bruise",\
"moderate bruise" = "small bruise", "large bruise" = "moderate bruise",\
"huge bruise" = "large bruise", "monumental bruise" = "huge bruise",\
"moderate burn" = "healing moderate burn", "large burn" = "healing large burn",\
"severe burn" = "healing severe burn", "deep burn" = "healing deep burn",\
"carbonised area" = "slowly healing carbonised area")
if(4)
if(tallied in list("cut","deep cut","tiny bruise", "small bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small red scar", "gaping wound" = "angry straight scar",\
"big gaping wound" = "jagged angry scar", "massive wound" = "gigantic angry scar",\
"moderate bruise" = "tiny bruise", "large bruise" = "small bruise",\
"huge bruise" = "moderate bruise", "monumental bruise" = "large bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area")
if(5)
if(tallied in list("cut","deep cut","tiny bruise", "small bruise", "moderate bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"large bruise" = "tiny bruise",\
"huge bruise" = "small bruise", "monumental bruise" = "moderate bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
if(6)
if(tallied in list("cut","deep cut","flesh wound","tiny bruise", "small bruise", "moderate bruise", "large bruise", "huge bruise","small burn", "moderate burn"))
continue
tallied_rename = list("gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"monumental bruise" = "tiny bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
switch(tally[tallied])
if(1)
if(!flavor_text.len)
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]"
else
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]"
if(2)
if(!flavor_text.len)
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s"
else
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s"
if(3 to 5)
if(!flavor_text.len)
flavor_text += "<span class='warning'>\The [src] has several [tallied_rename[tallied]]s"
else
flavor_text += " several [tallied_rename[tallied]]s"
if(6 to INFINITY)
if(!flavor_text.len)
flavor_text += "<span class='warning'>\The [src] has a bunch of [tallied_rename[tallied]]s"
else
flavor_text += " a ton of [tallied_rename[tallied]]s"
if(flavor_text.len)
var/flavor_text_string = ""
for(var/text = 1, text <= flavor_text.len, text++)
if(text == flavor_text.len && flavor_text.len > 1)
flavor_text_string += ", and"
else if(flavor_text.len > 1)
flavor_text_string += ","
flavor_text_string += flavor_text[text]
flavor_text_string += " on [t_his] [named].</span><br>"
wound_flavor_text["[named]"] = flavor_text_string
var/display_chest = 0
var/display_shoes = 0
var/display_gloves = 0
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
msg += wound_flavor_text["head"]
else if(is_bleeding["head"])
msg += "<span class='warning'>[src] has blood running down [t_his] face!</span>\n"
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
msg += wound_flavor_text["chest"]
else if(is_bleeding["chest"])
display_chest = 1
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left arm"]
else if(is_bleeding["left arm"])
display_chest = 1
if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["left hand"]
else if(is_bleeding["left hand"])
display_gloves = 1
if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["right arm"]
else if(is_bleeding["right arm"])
display_chest = 1
if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["right hand"]
else if(is_bleeding["right hand"])
display_gloves = 1
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["groin"]
else if(is_bleeding["groin"])
display_chest = 1
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left leg"]
else if(is_bleeding["left leg"])
display_chest = 1
if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["left foot"]
else if(is_bleeding["left foot"])
display_shoes = 1
if(wound_flavor_text["right leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["right leg"]
else if(is_bleeding["right leg"])
display_chest = 1
if(wound_flavor_text["right foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["right foot"]
else if(is_bleeding["right foot"])
display_shoes = 1
if(display_chest)
msg += "<span class='warning'><b>[src] has blood soaking through from under [t_his] clothing!</b></span>\n"
if(display_shoes)
msg += "<span class='warning'><b>[src] has blood running from [t_his] shoes!</b></span>\n"
if(display_gloves)
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
// if(w.bleeding)
// usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]."
// continue
msg += "[print_flavor_text()]\n"
msg += "\blue *---------*"
usr << msg
@@ -1,511 +0,0 @@
//their language needs to hook into radios as well
/mob/living/carbon/human/tajaran/say_quote(var/text,var/is_speaking_taj)
//work out if the listener can understand or not
var/ending = copytext(text, length(text))
/*if (src.disease_symptoms & DISEASE_HOARSE)
return "rasps, \"[text]\"";*/
if (src.stuttering)
return "stammers, \"[text]\"";
if (src.slurring)
return "slurrs, \"[text]\"";
if (src.brainloss >= 60)
return "gibbers, \"[text]\"";
if(is_speaking_taj)
return "mrowls, \"[text]\""//pick("yowls, \"[text]\"", "growls, \"[text]\"","mewls, \"[text]\"", "mrowls, \"[text]\"", "meows, \"[text]\"", "purrs, \"[text]\"");
if (ending == "?")
return "asks, \"[text]\"";
else if (ending == "!")
return "exclaims, \"[text]\"";
return "says, \"[text]\"";
//convert message to an indecipherable series of sounds for anyone who isnt tajaran
/mob/living/carbon/human/tajaran/proc/tajspeak(var/message)
//return stars(message)
var/te = html_decode(message)
var/t = ""
var/n = length(message)
var/p = 1
while(p <= n)
if (copytext(te, p, p + 1) != " ")
t = text("[][]", t, pick(tajspeak_letters))
p++
return html_encode(t)
/*if (pr == null)
pr = 25
if (pr <= 0)
return null
else
if (pr >= 100)
return n
var/te = html_decode(n)
var/t = ""
n = length(n)
var/p = null
p = 1
while(p <= n)
if ((copytext(te, p, p + 1) == " " || prob(pr)))
t = text("[][]", t, copytext(te, p, p + 1))
else
t = text("[]*", t)
p++
return html_encode(t)*/
/mob/living/carbon/human/tajaran/say(var/message)
var/message_old = message
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message)
return
log_say("[name]/[key] : [message]")
if (length(message) >= 1)
if (miming && copytext(message, 1, 2) != "*")
return
if (stat == 2)
return say_dead(message)
if (silent)
return
if (src.client && (client.muted || src.client.muted_complete))
src << "You are muted."
return
// wtf?
if (stat)
return
// Mute disability
if (disabilities & 64)
return
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
// emotes
if (copytext(message, 1, 2) == "*" && !stat)
return emote(copytext(message, 2))
var/alt_name = ""
if (istype(src, /mob/living/carbon/human) && name != real_name)
var/mob/living/carbon/human/H = src
alt_name = " (as [H.get_visible_name()])"
var/italics = 0
var/message_range = null
var/message_mode = null
if (brainloss >= 60 && prob(50))
if (ishuman(src))
message_mode = "headset"
// Special message handling
else if (copytext(message, 1, 2) == ";")
if (ishuman(src))
message_mode = "headset"
else if(istype(src, /mob/living/silicon/pai) || istype(src, /mob/living/silicon/robot))
message_mode = "pAI"
message = copytext(message, 2)
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
message_mode = department_radio_keys[channel_prefix]
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
message = trim(copytext(message, 3))
if (!ishuman(src) && (message_mode=="department" || (message_mode in radiochannels)))
message_mode = null //only humans can use headsets
if (!message)
return
//work out if we're speaking tajaran or not
var/is_speaking_taj = 0
if(copytext(message, 1, 3) == ":j" || copytext(message, 1, 3) == ":J")
message = copytext(message, 3)
if(taj_talk_understand || universal_speak)
is_speaking_taj = 1
if( !message_mode && (disease_symptoms & DISEASE_WHISPER))
message_mode = "whisper"
if(src.stunned > 0 || (traumatic_shock > 61 && prob(50)))
message_mode = "" //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
message = capitalize(message) //capitalize the first letter of what they actually say
// :downs:
if (brainloss >= 60)
message = dd_replacetext(message, " am ", " ")
message = dd_replacetext(message, " is ", " ")
message = dd_replacetext(message, " are ", " ")
message = dd_replacetext(message, "you", "u")
message = dd_replacetext(message, "help", "halp")
message = dd_replacetext(message, "grief", "grife")
message = dd_replacetext(message, "space", "spess")
message = dd_replacetext(message, "carp", "crap")
message = dd_replacetext(message, "reason", "raisin")
if(prob(50))
message = uppertext(message)
message += "[stutter(pick("!", "!!", "!!!"))]"
if(!stuttering && prob(15))
message = stutter(message)
if (stuttering)
message = stutter(message)
if (slurring)
message = slur(message)
/* //qw do not have beesease atm.
if(virus)
if(virus.name=="beesease" && virus.stage>=2)
if(prob(virus.stage*10))
var/bzz = length(message)
message = "B"
for(var/i=0,i<bzz,i++)
message += "Z"
*/
var/list/obj/item/used_radios = new
switch (message_mode)
if ("headset")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:l_ear
else if (src:r_ear)
src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:r_ear
message_range = 1
italics = 1
if ("secure headset")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:l_ear
else if (src:r_ear)
src:r_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:r_ear
message_range = 1
italics = 1
if ("right ear")
if (src:r_ear)
src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:r_ear
message_range = 1
italics = 1
if ("left ear")
if (src:l_ear)
src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += src:l_ear
message_range = 1
italics = 1
if ("intercom")
for (var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
used_radios += I
message_range = 1
italics = 1
//I see no reason to restrict such way of whispering
if ("whisper")
whisper(trim(copytext(message_old, 3)))
return
if ("binary")
if(robot_talk_understand || binarycheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
robot_talk(message)
return
if ("alientalk")
if(alien_talk_understand || hivecheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
alien_talk(message)
return
if ("department")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, message_mode)
used_radios += src:l_ear
else if (src:r_ear)
src:r_ear.talk_into(src, message, message_mode)
used_radios += src:r_ear
message_range = 1
italics = 1
if("changeling")
if(src.changeling)
for(var/mob/living/carbon/aChangeling in world)
if(aChangeling.changeling)
aChangeling << "<i><font color=#800080><b>[gender=="male"?"Mr.":"Mrs."] [changeling.changelingID]:</b> [message]</font></i>"
return
////SPECIAL HEADSETS START
else
//world << "SPECIAL HEADSETS"
if (message_mode in radiochannels)
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, message_mode)
used_radios += src:l_ear
else if (src:r_ear)
src:r_ear.talk_into(src, message, message_mode)
used_radios += src:r_ear
message_range = 1
italics = 1
/////SPECIAL HEADSETS END
var/list/listening
/*
if(istype(loc, /obj/item/device/aicard)) // -- TLE
var/obj/O = loc
if(istype(O.loc, /mob))
var/mob/M = O.loc
listening = hearers(message_range, M)
else
listening = hearers(message_range, O)
else
listening = hearers(message_range, src)
for (var/obj/O in view(message_range, src))
for (var/mob/M in O)
listening += M // maybe need to check if M can hear src
spawn (0)
if (O)
O.hear_talk(src, message)
if (!(src in listening))
listening += src
*/
var/turf/T = get_turf(src)
listening = hearers(message_range, T)
var/list/V = view(message_range, T)
var/list/W = V
//find mobs in lockers, cryo, intellicards, brains, MMIs, and so on.
for (var/mob/M in world)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
continue
if (M.stat <2) //is alive
if (isturf(M.loc))
continue //if M can hear us it was already found by hearers()
if (get_turf(M) in V) //this is slow, but I don't think we'd have a lot of wardrobewhores every round --rastaf0
listening+=M
else
if (M.client && M.client.ghost_ears)
listening|=M
var/list/eavesdroppers = get_mobs_in_view(7, src)
for(var/mob/M in listening)
eavesdroppers.Remove(M)
for(var/mob/M in eavesdroppers)
if(M.stat)
eavesdroppers.Remove(M)
for (var/obj/O in ((W | contents)-used_radios))
W |= O
for (var/mob/M in W)
W |= M.contents
if(hasorgans(M))
var/mob/living/carbon/G = M
for(var/name in G:organs)
var/datum/organ/external/F = G:organs[name]
for(var/obj/item/weapon/implant/I in F.implant)
W |= I
for (var/obj/item/device/pda/M in W)
W |= M.contents
for (var/obj/O in W) //radio in pocket could work, radio in backpack wouldn't --rastaf0
spawn (0)
if(O && !istype(O.loc, /obj/item/weapon/storage))
O.hear_talk(src, message)
if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess.
for(var/obj/O in loc)//Kinda ugly but whatever.
if(O)
spawn(0)
O.hear_talk(src, message)
var/list/heard_a = list() // understood us
var/list/heard_b = list() // didn't understand us
for (var/mob/M in listening)
//if speaking in tajaran, only let other tajs understand
if ( M.say_understands(src) && (M.taj_talk_understand || !is_speaking_taj || M.universal_speak) )
heard_a += M
else
heard_b += M
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('talk.dmi',src,"h[speech_bubble_test]")
var/rendered = null
if (length(heard_a))
var/message_a = say_quote(message,is_speaking_taj)
if (italics)
message_a = "<i>[message_a]</i>"
if (!istype(src, /mob/living/carbon/human))
rendered = "<span class='game say'><span class='name'>[name]</span> <span class='message'>[message_a]</span></span>"
else if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
if(wear_mask:vchange)
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> <span class='message'>[message_a]</span></span>"
else
rendered = "<span class='game say'><span class='name'>[name]</span> <span class='message'>[message_a]</span></span>"
else
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] <span class='message'>[message_a]</span></span>"
/*
// Create speech bubble
var/obj/effect/speech_bubble/B = new/obj/effect/speech_bubble
B.icon = 'speechbubble.dmi'
B.parent = src
B.mouse_opacity = 0
B.invisibility = invisibility
B.layer = 10
// Determine if the speech bubble's going to have a special look
var/presay = ""
if(istype(src, /mob/living/silicon))
presay = "bot"
if(istype(src, /mob/living/carbon/alien))
presay = "xeno"
if(istype(src, /mob/living/carbon/metroid))
presay = "metroid"
*/
for (var/mob/M in heard_a)
M.show_message(rendered, 2)
M << speech_bubble
spawn(30) del(speech_bubble)
//spawn(30) del(speech_bubble)
/*
if(M.client)
// If this client has bubbles disabled, obscure the bubble
if(!M.client.bubbles || M == src)
var/image/I = image('speechbubble.dmi', B, "override")
I.override = 1
M << I
*/
/*
// find the suffix, if bot, human or monkey
var/punctuation = ""
if(presay == "bot" || presay == "")
var/ending = copytext(text, length(text))
if (ending == "?")
punctuation = "question"
else if (ending == "!")
punctuation = "exclamation"
else
punctuation = ""
// flick the bubble
flick("[presay]say[punctuation]", B)
if(istype(loc, /turf))
B.loc = loc
else
B.loc = loc.loc
spawn()
sleep(11)
del(B)
*/
if (length(heard_b))
var/message_b = tajspeak(message)
message_b = say_quote(message_b,1)
if (italics)
message_b = "<i>[message_b]</i>"
rendered = "<span class='game say'><span class='name'>[voice_name]</span> <span class='message'>[message_b]</span></span>"
/*
// Create speech bubble
var/obj/effect/speech_bubble/B = new/obj/effect/speech_bubble
B.icon = 'speechbubble.dmi'
B.parent = src
B.mouse_opacity = 0
B.invisibility = invisibility
B.layer = 10
// Determine if the speech bubble's going to have a special look
var/presay = ""
if(istype(src, /mob/living/silicon))
presay = "bot"
if(istype(src, /mob/living/carbon/alien))
presay = "xeno"
if(istype(src, /mob/living/carbon/metroid))
presay = "metroid"
*/
for (var/mob/M in heard_b)
M.show_message(rendered, 2)
M << speech_bubble
spawn(30) del(speech_bubble)
/*
if(M.client)
if(!M.client.bubbles || M == src)
var/image/I = image('speechbubble.dmi', B, "override")
I.override = 1
M << I
flick("[presay]say", B)
if(istype(loc, /turf))
B.loc = loc
else
B.loc = loc.loc
spawn()
sleep(11)
del(B)
*/
if (length(eavesdroppers))
for (var/mob/M in eavesdroppers)
M << "\blue [src] speaks into their radio..."
M << speech_bubble
spawn(30) del(speech_bubble)
/mob/living/carbon/human/tajaran/say_understands(var/other)
if (istype(other, /mob/living/silicon/ai))
return 1
if (istype(other, /mob/living/silicon/decoy))
return 1
if (istype(other, /mob/living/silicon/pai))
return 1
if (istype(other, /mob/living/silicon/robot))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1
if (istype(other, /mob/living/carbon/metroid))
return 1
if (istype(other, /mob/living/carbon/human))
return 1
return ..()
@@ -1,74 +0,0 @@
/mob/living/carbon/human/proc/Tajaraize()
if (monkeyizing)
return
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
overlays = list()
var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
animation.icon_state = "blank"
animation.icon = 'mob.dmi'
animation.master = src
flick("h2monkey", animation)
sleep(18)
//animation = null
var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc )
del(animation)
O.organs.Cut()
O.organs = organs
for(var/name in O.organs) //Ensuring organ trasnfer
var/datum/organ/external/organ = O.organs[name]
organ.owner = O
for(var/obj/item/weapon/implant/implant in organ.implant)
implant.imp_in = O
for(var/obj/hud/H in contents) //Lets not get a duplicate hud
del(H)
for(var/named in vars) //Making them keep their crap.
if(istype(vars[named], /obj/item))
O.vars[named] = vars[named]
else if (named == "contents")
O.vars[named] = vars[named]
O.real_name = real_name
O.name = name
O.dna = dna
updateappearance(O,O.dna.uni_identity)
O.loc = loc
O.viruses = viruses
O.s_tone = s_tone
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
O.flavor_text = flavor_text
O.universal_speak = 1 //hacky fix until someone can figure out how to make them only understand humans
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
del(O.stand_icon) //Force it to update.
del(O.lying_icon)
O.update_body()
O.update_face()
spawn(1)
O.rebuild_appearance()
O << "<B>You are now a Tajara.</B>"
spawn(0)//To prevent the proc from returning null.
del(src)
return
/client/proc/make_tajaran(mob/living/carbon/human/H as mob)
set category = "Fun"
set name = "Make Tajaran"
set desc = "Make (mob) into a tajaran."
if (!holder)
src << "Only administrators may use this command."
return
if(istype(H))
H:Tajaraize()
@@ -1,613 +0,0 @@
/mob/living/carbon/human/tajaran
name = "tajaran"
real_name = "tajaran"
voice_name = "tajaran"
icon = 'tajaran.dmi'
icon_state = "m_none"
var/list/tajspeak_letters = list("~","*","-")
//universal_speak = 1 (I think I fixed it, need testy testy) hacky fix until someone can figure out how to make them only understand humans
taj_talk_understand = 1
voice_message = "mrowls"
examine_text = "one of the cat-like Tajarans"
/mob/living/carbon/human/tajaran/New()
var/g = "m"
if (gender == FEMALE)
g = "f"
spawn (1)
if(!stand_icon)
stand_icon = new /icon('tajaran.dmi', "body_[g]_s")
if(!lying_icon)
lying_icon = new /icon('tajaran.dmi', "body_[g]_l")
icon = stand_icon
rebuild_appearance()
src << "\blue Your icons have been generated!"
..()
spawn(33)
update_clothing()
update_body()
update_face()
/mob/living/carbon/human/tajaran/rebuild_appearance()
update_clothing()
/mob/living/carbon/human/tajaran/update_body_appearance()
update_clothing()
/mob/living/carbon/human/tajaran/update_clothing()
// ..()
if (monkeyizing)
return
overlays = null
// lol
var/fat = ""
/*if (FAT in mutation)
fat = "fat"*/
/*
if (HULK in mutations)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "hulk[fat][!lying ? "_s" : "_l"]")
*/
if (COLD_RESISTANCE in mutations)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "fire[fat][!lying ? "_s" : "_l"]")
if (TK in mutations)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!lying ? "_s" : "_l"]")
if (LASER in mutations)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "lasereyes[!lying ? "_s" : "_l"]")
if (mutantrace)
switch(mutantrace)
if("golem","metroid")
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat][!lying ? "_s" : "_l"]")
if(face_standing)
del(face_standing)
if(face_lying)
del(face_lying)
if(stand_icon)
del(stand_icon)
if(lying_icon)
del(lying_icon)
if("lizard")
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat]_[gender][!lying ? "_s" : "_l"]")
if(face_standing)
del(face_standing)
if(face_lying)
del(face_lying)
if(stand_icon)
del(stand_icon)
if(lying_icon)
del(lying_icon)
if("skrell")
body_overlays_standing += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_[gender]_s")
body_overlays_lying += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_[gender]_l")
// This needs to be matched up with humans, but I'm too lazy right now
// if(face_standing)
// del(face_standing)
// if(face_lying)
// del(face_lying)
if(stand_icon)
del(stand_icon)
if(lying_icon)
del(lying_icon)
if("plant")
if(stat != 2) //if not dead, that is
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat]_[gender][!lying ? "_s" : "_l"]")
else
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_d")
if(face_standing)
del(face_standing)
if(face_lying)
del(face_lying)
if(stand_icon)
del(stand_icon)
if(lying_icon)
del(lying_icon)
else
if(!face_standing || !face_lying)
update_face()
if(!stand_icon || !lying_icon)
update_body()
if(buckled)
if(istype(buckled, /obj/structure/stool/bed))
lying = 1
else
lying = 0
// Automatically drop anything in store / id / belt if you're not wearing a uniform.
if (!w_uniform)
for (var/obj/item/thing in list(r_store, l_store, wear_id, belt))
if (thing)
u_equip(thing)
if (client)
client.screen -= thing
if (thing)
thing.loc = loc
thing.dropped(src)
thing.layer = initial(thing.layer)
//if (zone_sel)
// zone_sel.overlays = null
// zone_sel.overlays += body_standing
// zone_sel.overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", zone_sel.selecting))
if (lying)
icon = lying_icon
overlays += damageicon_lying
if (face_lying)
overlays += face_lying
else
icon = stand_icon
overlays += damageicon_standing
if (face_standing)
overlays += face_standing
// Uniform
if(w_uniform)
/*if ((FAT in mutations) && !(w_uniform.flags & ONESIZEFITSALL))
src << "\red You burst out of the [w_uniform.name]!"
var/obj/item/clothing/c = w_uniform
u_equip(c)
if(client)
client.screen -= c
if(c)
c:loc = loc
c:dropped(src)
c:layer = initial(c:layer)*/
if(w_uniform)//I should really not need these
w_uniform.screen_loc = ui_iclothing
if(istype(w_uniform, /obj/item/clothing/under))
var/t1 = w_uniform.color
if (!t1)
t1 = icon_state
/*if (FAT in mutations)
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
else*/
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
if (w_uniform.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "uniformblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
if (wear_id)
if(wear_id.over_jumpsuit)
overlays += image("icon" = 'mob.dmi', "icon_state" = "id[!lying ? null : "2"]", "layer" = MOB_LAYER)
if (client)
client.screen -= hud_used.intents
client.screen -= hud_used.mov_int
//Screenlocs for these slots are handled by the huds other_update()
//because theyre located on the 'other' inventory bar.
// Gloves
var/datum/organ/external/lo = organs["l_hand"]
var/datum/organ/external/ro = organs["r_hand"]
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED))
if (gloves)
var/t1 = gloves.item_state
if (!t1)
t1 = gloves.icon_state
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.status & ORGAN_DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.status & ORGAN_DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image(gloves_icon, "layer" = MOB_LAYER)
if (gloves.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
// Glasses
if (glasses)
var/t1 = glasses.icon_state
overlays += image("icon" = 'eyes.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
// Ears
if (l_ear)
var/t1 = l_ear.icon_state
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (r_ear)
var/t1 = r_ear.icon_state
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
// Shoes
lo = organs["l_foot"]
ro = organs["r_foot"]
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED) && shoes)
var/t1 = shoes.icon_state
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.status & ORGAN_DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
else if(ro.status & ORGAN_DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
overlays += image(shoes_icon, "layer" = MOB_LAYER)
if (shoes.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
if(lo.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.status & ORGAN_DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
/* if (w_radio)
overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */
if (s_store)
var/t1 = s_store.item_state
if (!t1)
t1 = s_store.icon_state
if(!istype(wear_suit, /obj/item/clothing/suit/storage/armoredundersuit))
overlays += image("icon" = 'belt_mirror.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
s_store.screen_loc = ui_sstore1
if(client) hud_used.other_update() //Update the screenloc of the items on the 'other' inventory bar
//to hide / show them.
if (client)
if (i_select)
if (intent)
client.screen += hud_used.intents
var/list/L = dd_text2list(intent, ",")
L[1] += ":-11"
i_select.screen_loc = dd_list2text(L,",") //ICONS4, FUCKING SHIT
else
i_select.screen_loc = null
if (m_select)
if (m_int)
client.screen += hud_used.mov_int
var/list/L = dd_text2list(m_int, ",")
L[1] += ":-11"
m_select.screen_loc = dd_list2text(L,",") //ICONS4, FUCKING SHIT
else
m_select.screen_loc = null
var/tail_shown = 1
if (wear_suit)
/*if ((FAT in mutations) && !(wear_suit.flags & ONESIZEFITSALL))
src << "\red You burst out of the [wear_suit.name]!"
var/obj/item/clothing/c = wear_suit
u_equip(c)
if(client)
client.screen -= c
if(c)
c:loc = loc
c:dropped(src)
c:layer = initial(c:layer)*/
if (istype(wear_suit, /obj/item/clothing/suit))
var/t1 = wear_suit.icon_state
overlays += image("icon" = 'suit.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (wear_suit)
if (wear_suit.blood_DNA)
var/icon/stain_icon = null
if (istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/storage/wcoat))
stain_icon = icon('blood.dmi', "armorblood[!lying ? "" : "2"]")
else if (istype(wear_suit, /obj/item/clothing/suit/storage/det_suit || /obj/item/clothing/suit/storage/labcoat))
stain_icon = icon('blood.dmi', "coatblood[!lying ? "" : "2"]")
else
stain_icon = icon('blood.dmi', "suitblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
wear_suit.screen_loc = ui_oclothing
if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
if (handcuffed)
handcuffed.loc = loc
handcuffed.layer = initial(handcuffed.layer)
handcuffed = null
if ((l_hand || r_hand))
var/h = hand
hand = 1
drop_item()
hand = 0
drop_item()
hand = h
//if wearing some suits, hide the tail
if ( istype(wear_suit, /obj/item/clothing/suit/bio_suit) || istype(wear_suit, /obj/item/clothing/suit/bomb_suit) || istype(wear_suit, /obj/item/clothing/suit/space) )
tail_shown = 0
if(tail_shown)
overlays += image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
if (lying)
if (face_lying)
overlays += face_lying
else
if (face_standing)
overlays += face_standing
if (wear_mask)
if (istype(wear_mask, /obj/item/clothing/mask))
var/t1 = wear_mask.icon_state
overlays += image("icon" = 'mask.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (!istype(wear_mask, /obj/item/clothing/mask/cigarette))
if (wear_mask.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "maskblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
wear_mask.screen_loc = ui_mask
// Head
if (head)
var/t1 = head.icon_state
var/icon/head_icon = icon('head.dmi', text("[][]", t1, (!( lying ) ? null : "2")))
if(istype(head,/obj/item/clothing/head/kitty))
head_icon = (( lying ) ? head:mob2 : head:mob)
overlays += image("icon" = head_icon, "layer" = MOB_LAYER)
if(gimmick_hat)
overlays += image("icon" = icon('gimmick_head.dmi', "[gimmick_hat][!lying ? "" : "2"]"), "layer" = MOB_LAYER)
if (head.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
head.screen_loc = ui_head
else
var/datum/organ/external/head = organs["head"]
if(!(head.status & ORGAN_DESTROYED))
//if not wearing anything on the head, show the ears
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
// Belt
if (belt)
var/t1 = belt.item_state
if (!t1)
t1 = belt.icon_state
overlays += image("icon" = 'belt.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
belt.screen_loc = ui_belt
name = get_visible_name()
if (wear_id)
wear_id.screen_loc = ui_id
if (l_store)
l_store.screen_loc = ui_storage1
if (r_store)
r_store.screen_loc = ui_storage2
if (back)
var/t1 = back.icon_state
overlays += image("icon" = 'back.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
back.screen_loc = ui_back
if (handcuffed)
pulling = null
if (!lying)
overlays += image("icon" = 'mob.dmi', "icon_state" = "handcuff1", "layer" = MOB_LAYER)
else
overlays += image("icon" = 'mob.dmi', "icon_state" = "handcuff2", "layer" = MOB_LAYER)
if (client)
client.screen -= contents
client.screen += contents
if (r_hand)
overlays += image("icon" = 'items_righthand.dmi', "icon_state" = r_hand.item_state ? r_hand.item_state : r_hand.icon_state, "layer" = MOB_LAYER+1)
r_hand.screen_loc = ui_rhand
if (l_hand)
overlays += image("icon" = 'items_lefthand.dmi', "icon_state" = l_hand.item_state ? l_hand.item_state : l_hand.icon_state, "layer" = MOB_LAYER+1)
l_hand.screen_loc = ui_lhand
var/shielded = 0
for (var/obj/item/weapon/cloaking_device/S in src)
if (S.active)
shielded = 2
break
if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_active)
shielded = 3
switch(shielded)
if(1)
overlays += image("icon" = 'effects.dmi', "icon_state" = "shield", "layer" = MOB_LAYER+1)
if(2)
invisibility = 2
//New stealth. Hopefully doesn't lag too much. /N
if(istype(loc, /turf))//If they are standing on a turf.
AddCamoOverlay(loc)//Overlay camo.
if(3)
if(istype(loc, /turf))
//Ninjas may flick into view once in a while if they are stealthed.
if(prob(90))
NinjaStealthActive(loc)
else
NinjaStealthMalf()
else
invisibility = 0
if(client && client.admin_invis)
invisibility = 100
else if (shielded == 2)
invisibility = 2
else
invisibility = 0
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
/*
for (var/mob/M in viewers(1, src))//For the love of god DO NOT REFRESH EVERY SECOND - Mport
if ((M.client && M.machine == src))
spawn (0)
show_inv(M)
return
*/
last_b_state = stat
/mob/living/carbon/human/tajaran/update_body()
if(stand_icon)
del(stand_icon)
if(lying_icon)
del(lying_icon)
if (mutantrace)
return
var/g = "m"
if (gender == MALE)
g = "m"
else if (gender == FEMALE)
g = "f"
stand_icon = new /icon('tajaran.dmi', "torso_[g]_s")
lying_icon = new /icon('tajaran.dmi', "torso_[g]_l")
var/husk = (HUSK in mutations)
//var/obese = (FAT in mutations)
stand_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_l"), ICON_OVERLAY)
var/datum/organ/external/head = organs["head"]
if(!(head.status & ORGAN_DESTROYED))
stand_icon.Blend(new /icon('tajaran.dmi', "head_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('tajaran.dmi', "head_[g]_l"), ICON_OVERLAY)
for(var/name in organs)
var/datum/organ/external/part = organs[name]
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& !(part.status & ORGAN_DESTROYED))
var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s")
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
stand_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon('tajaran.dmi', "[part.icon_name]_l")
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
lying_icon.Blend(temp , ICON_OVERLAY)
stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_l"), ICON_OVERLAY)
if (husk)
var/icon/husk_s = new /icon('tajaran.dmi', "husk_s")
var/icon/husk_l = new /icon('tajaran.dmi', "husk_l")
for(var/name in organs)
var/datum/organ/external/part = organs[name]
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& (part.status & ORGAN_DESTROYED))
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
stand_icon.Blend(husk_s, ICON_OVERLAY)
lying_icon.Blend(husk_l, ICON_OVERLAY)
/*else if(obese)
stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/
// Skin tone
if (s_tone >= 0)
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
if (underwear > 0)
//if(!obese)
stand_icon.Blend(new /icon('tajaran.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('tajaran.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
/mob/living/carbon/human/tajaran/update_face()
if(organs)
var/datum/organ/external/head = organs["head"]
if(head)
if(head.status & ORGAN_DESTROYED)
del(face_standing)
del(face_lying)
return
//if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now
del(face_standing)
del(face_lying)
if (mutantrace)
return
var/g = "m"
if (gender == MALE)
g = "m"
else if (gender == FEMALE)
g = "f"
var/icon/eyes_s = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "eyes_s")
var/icon/eyes_l = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "eyes_l")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
//var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
//var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
//hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
//hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
//var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
//var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
//facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
//facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
var/icon/mouth_s = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_s")
var/icon/mouth_l = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_l")
// if the head or mask has the flag BLOCKHAIR (equal to 5), then do not apply hair
//if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
//eyes_s.Blend(hair_s, ICON_OVERLAY)
//eyes_l.Blend(hair_l, ICON_OVERLAY)
eyes_s.Blend(mouth_s, ICON_OVERLAY)
eyes_l.Blend(mouth_l, ICON_OVERLAY)
// if BLOCKHAIR, do not apply facial hair
//if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
//eyes_s.Blend(facial_s, ICON_OVERLAY)
//eyes_l.Blend(facial_l, ICON_OVERLAY)
face_standing = new /image()
face_lying = new /image()
face_standing.icon = eyes_s
face_standing.layer = MOB_LAYER
face_lying.icon = eyes_l
face_lying.layer = MOB_LAYER
del(mouth_l)
del(mouth_s)
//del(facial_l)
//del(facial_s)
//del(hair_l)
//del(hair_s)
del(eyes_l)
del(eyes_s)
/mob/living/carbon/human/tajaran/co2overloadtime = null
/mob/living/carbon/human/tajaran/temperature_resistance = T0C+70
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

@@ -1,4 +0,0 @@
//todo: this
/mob/living/carbon/human/tajaran
/mob/var/taj_talk_understand = 0
@@ -1,170 +0,0 @@
/mob/living/carbon/human/tajaran/whisper(message as text)
//Figured it out. If you use say :w (message) it HTML encodes it, THEN passes it to the whisper code, which does so again. Jeez. --SkyMarshal
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message)
return
if (silent)
return
log_whisper("[src.name]/[src.key] : [message]")
if (src.client && (src.client.muted || src.client.muted_complete))
src << "You are muted."
return
if (src.stat == 2)
return src.say_dead(message)
if (src.stat)
return
var/alt_name = ""
if (istype(src, /mob/living/carbon/human) && src.name != src.real_name)
var/mob/living/carbon/human/H = src
alt_name = " (as [H.get_visible_name()])"
// Mute disability
if (src.disabilities & 64)
return
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
return
var/italics = 1
var/message_range = 1
//work out if we're speaking tajaran or not
var/is_speaking_taj = 0
if(copytext(message, 1, 4) == ":j ")
message = copytext(message, 4)
if(taj_talk_understand || universal_speak)
is_speaking_taj = 1
if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)&&src.wear_mask:voice=="Unknown")
if(copytext(message, 1, 2) != "*")
var/list/temp_message = dd_text2list(message, " ")
var/list/pick_list = list()
for(var/i = 1, i <= temp_message.len, i++)
pick_list += i
for(var/i=1, i <= abs(temp_message.len/3), i++)
var/H = pick(pick_list)
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
temp_message[H] = ninjaspeak(temp_message[H])
pick_list -= H
message = dd_list2text(temp_message, " ")
message = dd_replaceText(message, "o", "¤")
message = dd_replaceText(message, "p", "þ")
message = dd_replaceText(message, "l", "£")
message = dd_replaceText(message, "s", "§")
message = dd_replaceText(message, "u", "µ")
message = dd_replaceText(message, "b", "ß")
message = capitalize(message)
if (src.stuttering)
message = stutter(message)
if (src.slurring)
message = slur(message)
for (var/obj/O in view(message_range, src))
spawn (0)
if (O)
O.hear_talk(src, message)
var/list/listening = hearers(message_range, src)
listening -= src
listening += src
var/list/eavesdropping = hearers(2, src)
eavesdropping -= src
eavesdropping -= listening
var/list/watching = hearers(5, src)
watching -= src
watching -= listening
watching -= eavesdropping
var/list/heard_a = list() // understood us
var/list/heard_b = list() // didn't understand us
for (var/mob/M in listening)
if ( M.say_understands(src) && (M.taj_talk_understand || !is_speaking_taj || M.universal_speak) )
heard_a += M
else
heard_b += M
var/rendered = null
for (var/mob/M in watching)
if ( (M.say_understands(src) && !is_speaking_taj) || istype(M,/mob/living/carbon/human/tajaran) )
rendered = "<span class='game say'><span class='name'>[src.name]</span> [is_speaking_taj ? "quietly mrowls" : "whispers"] something.</span>"
else
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> [is_speaking_taj ? "quietly mrowls" : "whispers"] something.</span>"
M.show_message(rendered, 2)
if (length(heard_a))
var/message_a = message
if (italics)
message_a = "<i>[message_a]</i>"
//This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically.
if (!istype(src, /mob/living/carbon/human))
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
else if (istype(wear_mask, /obj/item/clothing/mask/gas/voice))
if (wear_mask:vchange)
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
for (var/mob/M in heard_a)
M.show_message(rendered, 2)
if (length(heard_b))
var/message_b
message_b = tajspeak(message)
if (italics)
message_b = "<i>[message_b]</i>"
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> mrows quietly, <span class='message'>\"[message_b]\"</span></span>"
for (var/mob/M in heard_b)
M.show_message(rendered, 2)
for (var/mob/M in eavesdropping)
if (M.say_understands(src))
var/message_c = tajspeak(message)
if (!istype(src, /mob/living/carbon/human))
rendered = "<span class='game say'><span class='name'>[name]</span> mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
else if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
if(wear_mask:vchange)
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[name]</span> mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
M.show_message(rendered, 2)
else
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> quietly mrowls something.</span>"
M.show_message(rendered, 2)
if (italics)
message = "<i>[message]</i>"
if (!istype(src, /mob/living/carbon/human))
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
else if (istype(src.wear_mask, /obj/item/clothing/mask/gas/voice))
if(wear_mask:vchange)
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
else
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
for (var/mob/M in world)
if (istype(M, /mob/new_player))
continue
if (M.stat > 1 && !(M in heard_a))
M.show_message(rendered, 2)
+7 -4
View File
@@ -17,7 +17,7 @@
/obj/item/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (health < 1)
return
if (istype(W,/obj/item/clothing/mask/cigarette))
if (istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/weapon/match))
if(user)
if (contents.len >= max_butts)
user << "This ashtray is full."
@@ -28,12 +28,15 @@
user.client.screen -= W
var/obj/item/clothing/mask/cigarette/cig = W
if (cig.lit == 1)
src.visible_message("[user] crushes a [cig] in the [src], putting it out.")
src.visible_message("[user] crushes [cig] in [src], putting it out.")
cig.put_out()
else if (cig.lit == 0)
user << "You place a [cig] in [src] without even smoking it. Why would you do that?"
if(istype(cig, /obj/item/weapon/match))
user << "You place [cig] in [src] without even lighting it. Why would you do that?"
else
user << "You place [cig] in [src] without even smoking it. Why would you do that?"
else if (cig.lit == -1)
src.visible_message("[user] places a [cig] in the [src].")
src.visible_message("[user] places [cig] in [src].")
user.update_inv_l_hand()
user.update_inv_r_hand()
add_fingerprint(user)
+1 -1
View File
@@ -74,7 +74,7 @@
can_place = 0
else
for(var/obj/O in cur)
if(O.density)
if(!istype(O, /obj/item/tape) && O.density)
can_place = 0
break
cur = get_step_towards(cur,end)
+189
View File
@@ -0,0 +1,189 @@
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
var/damage = 0
var/hits = 0
var/time_inflicted = 0
proc/copy()
var/datum/autopsy_data/W = new()
W.weapon = weapon
W.pretend_weapon = pretend_weapon
W.damage = damage
W.hits = hits
W.time_inflicted = time_inflicted
return W
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
for(var/V in O.autopsy_data)
var/datum/autopsy_data/W = O.autopsy_data[V]
if(!W.pretend_weapon)
/*
// the more hits, the more likely it is that we get the right weapon type
if(prob(50 + W.hits * 10 + W.damage))
*/
// Buffing this stuff up for now!
if(1)
W.pretend_weapon = W.weapon
else
W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet")
var/datum/autopsy_data_scanner/D = wdata[V]
if(!D)
D = new()
D.weapon = W.weapon
wdata[V] = D
if(!D.organs_scanned[O.name])
if(D.organ_names == "")
D.organ_names = O.display_name
else
D.organ_names += ", [O.display_name]"
del D.organs_scanned[O.name]
D.organs_scanned[O.name] = W.copy()
for(var/V in O.trace_chemicals)
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V
/obj/item/weapon/autopsy_scanner/verb/print_data()
set src in view(usr, 1)
set name = "Print Data"
if(usr.stat)
usr << "No."
return
if(wdata.len == 0 && chemtraces.len == 0)
usr << "<b>* There is no data about any wounds in the scanner's database. You may have to scan more bodyparts, or otherwise this wound type may not be in the scanner's database."
return
var/scan_data = ""
if(timeofdeath)
scan_data += "<b>Time of death:</b> [worldtime2text(timeofdeath)]<br><br>"
var/n = 1
for(var/wdata_idx in wdata)
var/datum/autopsy_data_scanner/D = wdata[wdata_idx]
var/total_hits = 0
var/total_score = 0
var/list/weapon_chances = list() // maps weapon names to a score
var/age = 0
for(var/wound_idx in D.organs_scanned)
var/datum/autopsy_data/W = D.organs_scanned[wound_idx]
total_hits += W.hits
var/wname = W.pretend_weapon
if(wname in weapon_chances) weapon_chances[wname] += W.damage
else weapon_chances[wname] = max(W.damage, 1)
total_score+=W.damage
var/wound_age = W.time_inflicted
age = max(age, wound_age)
var/damage_desc
var/damaging_weapon = (total_score != 0)
// total score happens to be the total damage
switch(total_score)
if(0)
damage_desc = "Unknown"
if(1 to 5)
damage_desc = "<font color='green'>negligible</font>"
if(5 to 15)
damage_desc = "<font color='green'>light</font>"
if(15 to 30)
damage_desc = "<font color='orange'>moderate</font>"
if(30 to 1000)
damage_desc = "<font color='red'>severe</font>"
if(!total_score) total_score = D.organs_scanned.len
scan_data += "<b>Weapon #[n]</b><br>"
if(damaging_weapon)
scan_data += "Severity: [damage_desc]<br>"
scan_data += "Hits by weapon: [total_hits]<br>"
scan_data += "Approximate time of wound infliction: [worldtime2text(age)]<br>"
scan_data += "Affected limbs: [D.organ_names]<br>"
scan_data += "Possible weapons:<br>"
for(var/weapon_name in weapon_chances)
scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]<br>"
scan_data += "<br>"
n++
if(chemtraces.len)
scan_data += "<b>Trace Chemicals: </b><br>"
for(var/chemID in chemtraces)
scan_data += chemID
scan_data += "<br>"
for(var/mob/O in viewers(usr))
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
sleep(10)
var/obj/item/weapon/paper/P = new(usr.loc)
P.name = "Autopsy Data ([target_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
if(istype(usr,/mob/living/carbon))
// place the item in the usr's hand if possible
if(!usr.r_hand)
P.loc = usr
usr.r_hand = P
P.layer = 20
else if(!usr.l_hand)
P.loc = usr
usr.l_hand = P
P.layer = 20
if(istype(usr,/mob/living/carbon/human))
usr:update_inv_l_hand()
usr:update_inv_r_hand()
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
return
if(!can_operate(M))
return
if(target_name != M.name)
target_name = M.name
src.wdata = list()
user << "\red A new patient has been registered.. Purging data for previous patient."
src.timeofdeath = M.timeofdeath
var/datum/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
usr << "<b>You can't scan this body part.</b>"
return
if(!S.open)
usr << "<b>You have to cut the limb open first!</b>"
return
for(var/mob/O in viewers(M))
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
src.add_data(S)
return 1
@@ -0,0 +1,7 @@
/client/verb/find_atoms_in_null()
if(!holder) return
var/msg
for(var/atom/A)
if(A.loc == null)
msg += "\ref[A] [A.type] - [A]\n"
world.log << msg
File diff suppressed because it is too large Load Diff
+6 -3
View File
@@ -9,10 +9,13 @@ datum/reagent/antibodies
color = "#0050F0"
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(istype(M,/mob/living/carbon/human))
if(istype(M,/mob/living/carbon))
if(src.data && method == INGEST)
if(src.data["antibodies"] & M:virus2.antigen)
if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen)
M:virus2.dead = 1
// if the virus is killed this way it immunizes
// M:antibodies |= M:virus2.antigen
M:antibodies |= src.data["antibodies"]
return
// reserving some numbers for later special antigens
@@ -42,7 +45,7 @@ var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTI
icon_state = "health"
w_class = 2.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+11
View File
@@ -44,6 +44,17 @@
return 1
proc/airborne_can_reach(turf/source, turf/target)
var/obj/dummy = new(source)
dummy.flags = FPRINT | TABLEPASS
dummy.pass_flags = PASSTABLE
for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break
var/rval = (dummy.loc in range(1,target))
del dummy
return rval
/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
if(M.virus2)
return
+20 -2
View File
@@ -40,7 +40,21 @@
container = I
C.drop_item()
I.loc = src
if(istype(I,/obj/item/weapon/virusdish))
if(virusing)
user << "<b>The pathogen materializer is still recharging.."
return
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=0)
data["virus2"] = I:virus2
product.reagents.add_reagent("blood",30,data)
virusing = 1
spawn(1200) virusing = 0
state("The [src.name] Buzzes", "blue")
return
//else
src.attack_hand(user)
return
@@ -68,6 +82,9 @@
if(B)
dat = "Blood sample inserted."
var/code = ""
for(var/V in ANTIGENS) if(text2num(V) & B.data["antibodies"]) code += ANTIGENS[V]
dat += "<BR>Antibodies: [code]"
dat += "<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"
else
dat += "<BR>Please check container contents."
@@ -121,9 +138,10 @@
product.reagents.add_reagent("antibodies",30,data)
state("The [src.name] Buzzes", "blue")
/*
/obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2)
var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc)
implanter.name = "Viral implanter (MAJOR BIOHAZARD)"
implanter.works = 3
state("The [src.name] Buzzes", "blue")
state("The [src.name] Buzzes", "blue")
*/
+2 -2
View File
@@ -163,7 +163,7 @@
if(beaker)
if(beaker.reagents.remove_reagent("virusfood",5))
if(!beaker.reagents.remove_reagent("virusfood",5))
foodsupply += 10
if(beaker.reagents.remove_reagent("toxins",1))
if(!beaker.reagents.remove_reagent("toxins",1))
toxins += 1
+1 -1
View File
@@ -138,7 +138,7 @@
growth = rand(5, 50)
/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob)
if(istype(W,/obj/item/weapon/label) || istype(W,/obj/item/weapon/reagent_containers/syringe))
if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe))
return
..()
if(prob(50))
+1 -11
View File
@@ -69,9 +69,6 @@ mob/living/carbon/metroid/airflow_stun()
mob/living/carbon/human/airflow_stun()
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
if(buckled) return 0
//skytodo:
/*if(wear_suit)
if(wear_suit.flags & SUITSPACE) return 0*/
if(shoes)
if(shoes.flags & NOSLIP) return 0
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
@@ -247,9 +244,6 @@ atom/movable
if(istype(src, /mob/living/carbon/human))
if(istype(src, /mob/living/carbon/human))
if(src:buckled) return
//skytodo: tg handles suits differently
/*if(src:wear_suit)
if(src:wear_suit.flags & SUITSPACE) return*/
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return
src << "\red You are sucked away by airflow!"
@@ -305,9 +299,6 @@ atom/movable
if(istype(src, /mob/living/carbon/human))
if(istype(src, /mob/living/carbon/human))
if(src:buckled) return
//skytodo:
/*if(src:wear_suit)
if(src:wear_suit.flags & SUITSPACE) return*/
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return
src << "\red You are pushed away by airflow!"
@@ -407,7 +398,6 @@ zone/proc/movables()
. = list()
for(var/turf/T in contents)
for(var/atom/A in T)
//skytodo: add check for ai eye, tg seems to have done away with it
if(istype(A, /obj/effect))
if(istype(A, /obj/effect) || istype(A, /mob/aiEye))
continue
. += A
+1 -1
View File
@@ -32,7 +32,7 @@ zone/proc
M << "Pressure: [air.return_pressure()]"
M << ""
M << "Space Tiles: [length(unsimulated_tiles)]"
//M << "Movable Objects: [length(movable_objects)]" //skytodo
M << "Movable Objects: [length(movables())]"
M << "<u>Connections: [length(connections)]</u>"
for(var/connection/C in connections)
+5
View File
@@ -277,6 +277,11 @@ datum
proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT)
if(!istype(T)) return
//zones should naturally spread to these tiles eventually
if(!T.zone || !NT.zone)
return
if(istype(NT, /turf/simulated) && NT.zone != T.zone)
T.zone.RemoveTurf(NT)
if(NT.zone)
+71 -118
View File
@@ -40,7 +40,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
if(locate(/obj/fire) in src)
return 1
var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases
var/obj/liquid_fuel/liquid = locate() in src
var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src
if(air_contents.calculate_firelevel(liquid) > vsc.IgnitionLevel && (fuel || liquid || air_contents.toxins > 0.5))
igniting = 1
if(air_contents.oxygen < 0.5)
@@ -63,7 +63,7 @@ obj
anchored = 1
mouse_opacity = 0
//luminosity = 3
luminosity = 3
icon = 'fire.dmi'
icon_state = "1"
@@ -79,73 +79,70 @@ obj
process()
. = 1
if(firelevel > vsc.IgnitionLevel)
var/turf/simulated/floor/S = loc
if(!S.zone) del src //Cannot exist where zones are broken.
var/turf/simulated/floor/S = loc
if(!S.zone) del src //Cannot exist where zones are broken.
if(istype(S,/turf/simulated/floor))
var
datum/gas_mixture/air_contents = S.return_air()
//Get whatever trace fuels are in the area
datum/gas/volatile_fuel/fuel = locate(/datum/gas/volatile_fuel/) in air_contents.trace_gases
//Also get liquid fuels on the ground.
obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S
if(istype(S,/turf/simulated/floor))
var
datum/gas_mixture/air_contents = S.return_air()
//Get whatever trace fuels are in the area
datum/gas/volatile_fuel/fuel = locate(/datum/gas/volatile_fuel/) in air_contents.trace_gases
//Also get liquid fuels on the ground.
obj/liquid_fuel/liquid = locate() in S
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
//the fire's max temperature instantaneously.
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
//the fire's max temperature instantaneously.
firelevel = air_contents.calculate_firelevel(liquid)
firelevel = air_contents.calculate_firelevel(liquid)
//Ensure that there is an appropriate amount of fuel and O2 here.
if(firelevel > 0.25 && flow.oxygen > 0.3 && (air_contents.toxins || fuel || liquid))
//Ensure that there is an appropriate amount of fuel and O2 here.
if(firelevel > 0.25 && flow.oxygen > 0.3 && (air_contents.toxins || fuel || liquid))
for(var/direction in cardinal)
if(S.air_check_directions&direction) //Grab all valid bordering tiles
for(var/direction in cardinal)
if(S.air_check_directions&direction) //Grab all valid bordering tiles
var/turf/simulated/enemy_tile = get_step(S, direction)
var/turf/simulated/enemy_tile = get_step(S, direction)
if(istype(enemy_tile))
//If extinguisher mist passed over the turf it's trying to spread to, don't spread and
//reduce firelevel.
if(enemy_tile.fire_protection > world.time-30)
firelevel -= 1.5
continue
if(istype(enemy_tile))
//If extinguisher mist passed over the turf it's trying to spread to, don't spread and
//reduce firelevel.
if(enemy_tile.fire_protection > world.time-30)
firelevel -= 1.5
continue
//Spread the fire.
if(!(locate(/obj/fire) in enemy_tile))
if( prob( firelevel*10 ) )
new/obj/fire(enemy_tile,firelevel)
//Spread the fire.
if(!(locate(/obj/fire) in enemy_tile))
if( prob( firelevel*10 ) )
new/obj/fire(enemy_tile,firelevel)
if(flow)
if(flow)
//Ensure adequate oxygen and fuel.
if(flow.oxygen > 0.3 && (flow.toxins || fuel || liquid))
//Change icon depending on the fuel, and thus temperature.
if(firelevel > 6)
icon_state = "3"
else if(firelevel > 2.5)
icon_state = "2"
else
icon_state = "1"
//Ensure flow temperature is higher than minimum fire temperatures.
flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature)
//Burn the gas mixture.
flow.zburn(liquid)
//Ensure adequate oxygen and fuel.
if(flow.oxygen > 0.3 && (flow.toxins || fuel || liquid))
//Change icon depending on the fuel, and thus temperature.
if(firelevel > 6)
icon_state = "3"
else if(firelevel > 2.5)
icon_state = "2"
else
icon_state = "1"
//Ensure flow temperature is higher than minimum fire temperatures.
flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature)
//Burn the gas mixture.
if(!flow.zburn(liquid))
del src
S.assume_air(flow) //Then put it back where you found it.
else
del src
S.assume_air(flow) //Then put it back where you found it.
else
del src
else
@@ -177,67 +174,12 @@ obj
..()
obj/liquid_fuel
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
layer = TURF_LAYER+0.2
anchored = 1
var/amount = 1 //Basically moles.
New(newLoc,amt=1)
src.amount = amt
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/liquid_fuel/other in newLoc)
if(other != src)
other.amount += src.amount
spawn other.Spread()
del src
Spread()
. = ..()
proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 0.5) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
if(S.air_check_directions & d)
if(rand(25))
var/turf/simulated/O = get_step(src,d)
if(!locate(/obj/liquid_fuel) in O)
new/obj/liquid_fuel(O,amount*0.25)
amount *= 0.75
flamethrower_fuel
icon_state = "mustard"
anchored = 0
New(newLoc, amt = 1, d = 0)
dir = d //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in list(turn(dir,90),turn(dir,-90)))
if(S.air_check_directions & d)
var/turf/simulated/O = get_step(S,d)
new/obj/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
amount *= 0.5
turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
turf/proc/apply_fire_protection()
turf/simulated/apply_fire_protection()
fire_protection = world.time
datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
//This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS.
if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE)
var
@@ -246,12 +188,16 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
datum/gas/volatile_fuel/fuel = locate() in trace_gases
if(fuel)
//Volatile Fuel
total_fuel += fuel.moles
fuel_sources++
//Volatile Fuel
if(fuel.moles < 0.01)
trace_gases.Remove(fuel)
del fuel
else
total_fuel += fuel.moles
fuel_sources++
if(liquid)
//Liquid Fuel
//Liquid Fuel
if(liquid.amount <= 0)
del liquid
else
@@ -267,6 +213,8 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
//Calculate the firelevel.
var/firelevel = calculate_firelevel(liquid)
if(firelevel < 0.01)
return 0
//Reaches a maximum practical temperature of around 4500.
@@ -274,7 +222,7 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature )
//Consume some gas.
var/consumed_gas = min(oxygen,0.05*firelevel,total_fuel) / fuel_sources
var/consumed_gas = min(oxygen,firelevel * 50,total_fuel) / fuel_sources
oxygen = max(0,oxygen-consumed_gas)
@@ -295,19 +243,24 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
return 0
datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid)
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
var
datum/gas/volatile_fuel/fuel = locate() in trace_gases
liquid_concentration = 0
fuel_concentration = 0
oxy_concentration = oxygen / volume
tox_concentration = toxins / volume
fuel_concentration = 0
if(fuel) fuel_concentration = (fuel.moles*5) / volume
if(fuel) fuel_concentration = (fuel.moles) / volume
if(liquid) liquid_concentration = (liquid.amount*15) / volume
return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100
var/final = tox_concentration + liquid_concentration + fuel_concentration
if(final > oxy_concentration)
final = oxy_concentration
return final * 100
/mob/living/carbon/human/proc/FireBurn(mx as num)
//Burns mobs due to fire. Respects heat transfer coefficients on various body parts.
@@ -320,7 +273,7 @@ datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
arms_exposure = 1
//Get heat transfer coefficients for clothing.
//skytodo: different handling of temp with tg
//skytodo: different handling of temp with tg //Jesus, mate. Don't ask me. I have no diea how their crap works, and Aryn wrote this proc.
/*for(var/obj/item/clothing/C in src)
if(l_hand == C || r_hand == C) continue
if(C.body_parts_covered & HEAD)
+8 -13
View File
@@ -43,14 +43,10 @@ obj/var/contaminated = 0
obj/item/proc
can_contaminate()
return 0
//skytodo: tg has changed how suits are handled
/*
//Clothing and backpacks can be contaminated.
if(flags & PLASMAGUARD) return 0
if(flags & SUITSPACE) return 0
else if(istype(src,/obj/item/clothing)) return 1
else if(istype(src,/obj/item/weapon/storage/backpack)) return 1
*/
contaminate()
//Do a contamination overlay? Temporary measure to keep contamination less deadly than it was.
@@ -131,22 +127,21 @@ obj/item/proc
/mob/living/carbon/human/proc/pl_head_protected()
//Checks if the head is adequately sealed.
//skytodo:
/*if(head)
if(head)
if(vsc.plc.PLASMAGUARD_ONLY)
if(head.flags & PLASMAGUARD || head.flags & HEADSPACE) return 1
else
if(head.flags & HEADCOVERSEYES) return 1*/
if(head.flags & PLASMAGUARD)
return 1
else if(head.flags & HEADCOVERSEYES)
return 1
return 0
/mob/living/carbon/human/proc/pl_suit_protected()
//Checks if the suit is adequately sealed.
//skytodo:
/*if(wear_suit)
if(wear_suit)
if(vsc.plc.PLASMAGUARD_ONLY)
if(wear_suit.flags & PLASMAGUARD || wear_suit.flags & SUITSPACE) return 1
if(wear_suit.flags & PLASMAGUARD) return 1
else
if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1*/
if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1
return 0
/mob/living/carbon/human/proc/suit_contamination()
+18 -1
View File
@@ -2,6 +2,8 @@
var/server_name = null // server name (for world name / status)
var/server_suffix = 0 // generate numeric suffix based on server port
var/nudge_script_path = "nudge.py" // where the nudge.py script is located
var/log_ooc = 0 // log OOC channel
var/log_access = 0 // log login/logout
var/log_say = 0 // log client say
@@ -53,6 +55,8 @@
var/automute_on = 0 //enables automuting/spam prevention
var/usealienwhitelist = 0
var/limitalienplayers = 0
var/alien_to_human_ratio = 0.5
var/server
var/banappeals
@@ -98,6 +102,7 @@
var/metroid_delay = 0
var/animal_delay = 0
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system.
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
@@ -154,6 +159,9 @@
if(type == "config")
switch (name)
if ("admin_legacy_system")
config.admin_legacy_system = 1
if ("log_ooc")
config.log_ooc = 1
@@ -238,6 +246,9 @@
if ("serversuffix")
config.server_suffix = 1
if ("nudge_script_path")
config.nudge_script_path = value
if ("hostedby")
config.hostedby = value
@@ -348,9 +359,15 @@
if("usealienwhitelist")
usealienwhitelist = 1
if("alien_player_ratio")
limitalienplayers = 1
alien_to_human_ratio = text2num(value)
else
diary << "Unknown setting in configuration: '[name]'"
else if(type == "game_options")
if(!value)
diary << "Unknown value for setting [name] in [filename]."
@@ -512,7 +529,7 @@
if (M.config_tag && M.config_tag == mode_name)
return M
del(M)
return null
return new /datum/game_mode/extended()
/datum/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new
+4 -1
View File
@@ -28,7 +28,7 @@
return
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI"))
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -71,5 +71,8 @@
if("pAI")
debug_variables(paiController)
feedback_add_details("admin_verb","DpAI")
if("Cameras")
debug_variables(cameranet)
feedback_add_details("admin_verb","DCameras")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.", 1)
return
+9 -6
View File
@@ -167,8 +167,11 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
var/admin = 0
var/trialmin = 0
if(C.holder)
admin = 1
if (C.holder.level >= 3)
trialmin = 1
voting |= C
. = "<html><head><title>Voting Panel</title></head><body>"
@@ -186,24 +189,24 @@ datum/controller/vote
else
. += "<h2>Start a vote:</h2><hr><ul><li>"
//restart
if(admin || config.allow_vote_restart)
if(trialmin || config.allow_vote_restart)
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
else
. += "<font color='grey'>Restart (Disallowed)</font>"
if(admin)
if(trialmin)
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart?"Allowed":"Disallowed"]</a>)"
. += "</li><li>"
//gamemode
if(admin || config.allow_vote_mode)
if(trialmin || config.allow_vote_mode)
. += "<a href='?src=\ref[src];vote=gamemode'>GameMode</a>"
else
. += "<font color='grey'>GameMode (Disallowed)</font>"
if(admin)
if(trialmin)
. += "\t(<a href='?src=\ref[src];vote=toggle_gamemode'>[config.allow_vote_mode?"Allowed":"Disallowed"]</a>)"
. += "</li>"
//custom
if(admin)
if(trialmin)
. += "<li><a href='?src=\ref[src];vote=custom'>Custom</a></li>"
. += "</ul><hr>"
. += "<a href='?src=\ref[src];vote=close' style='position:absolute;right:50px'>Close</a></body></html>"
@@ -214,7 +217,7 @@ datum/controller/vote
if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid
switch(href_list["vote"])
if("close")
voting -= usr.ckey
voting -= usr.client
usr << browse(null, "window=vote")
return
if("cancel")
+6 -1
View File
@@ -1,8 +1,11 @@
var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_laws
var/name = "Unknown Laws"
var/randomly_selectable = 0
var/zeroth = null
var/zeroth_borg = null
var/list/inherent = list()
var/list/supplied = list()
var/list/ion = list()
@@ -79,8 +82,10 @@
/* General ai_law functions */
/datum/ai_laws/proc/set_zeroth_law(var/law)
/datum/ai_laws/proc/set_zeroth_law(var/law, var/law_borg = null)
src.zeroth = law
if(law_borg) //Making it possible for slaved borgs to see a different law 0 than their AI. --NEO
src.zeroth_borg = law_borg
/datum/ai_laws/proc/add_inherent_law(var/law)
if (!(law in src.inherent))
+178 -8
View File
@@ -11,16 +11,17 @@
var/datum/data/record/foundrecord
for(var/datum/data/record/t in data_core.general)
if(t.fields["name"] == name)
foundrecord = t
break
if (t)
if(t.fields["name"] == name)
foundrecord = t
break
if(foundrecord)
foundrecord.fields["rank"] = assignment
if(alt_title)
foundrecord.fields["real_rank"] = alt_title
else
foundrecord.fields["real_rank"] = assignment
if(alt_title)
foundrecord.fields["real_rank"] = alt_title
else
foundrecord.fields["real_rank"] = assignment
@@ -36,6 +37,7 @@
var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
//General Record
var/datum/data/record/G = new()
G.fields["id"] = id
@@ -48,6 +50,7 @@
G.fields["m_stat"] = "Stable"
G.fields["sex"] = H.gender
G.fields["species"] = H.get_species()
G.fields["photo"] = get_id_photo(H)
general += G
//Medical Record
@@ -64,7 +67,10 @@
M.fields["alg_d"] = "No allergies have been detected in this patient."
M.fields["cdi"] = "None"
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
M.fields["notes"] = "No notes."
if(H.med_record && !jobban_isbanned(H, "Records"))
M.fields["notes"] = H.med_record
else
M.fields["notes"] = "No notes found."
medical += M
//Security Record
@@ -77,6 +83,10 @@
S.fields["ma_crim"] = "None"
S.fields["ma_crim_d"] = "No major crime convictions."
S.fields["notes"] = "No notes."
if(H.sec_record && !jobban_isbanned(H, "Records"))
S.fields["notes"] = H.sec_record
else
S.fields["notes"] = "No notes."
security += S
//Locked Record
@@ -94,3 +104,163 @@
locked += L
return
proc/get_id_photo(var/mob/living/carbon/human/H)
var/icon/preview_icon = null
var/g = "m"
if (H.gender == FEMALE)
g = "f"
var/icon/icobase
switch(H.get_species())
if("Tajaran")
icobase = 'icons/mob/human_races/r_tajaran.dmi'
if( "Soghun")
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
else
icobase = 'icons/mob/human_races/r_human.dmi'
preview_icon = new /icon(icobase, "torso_[g]")
var/icon/temp
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon(icobase, "head_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
for(var/datum/organ/external/E in H.organs)
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
temp = new /icon(icobase, "[E.name]")
if(E.status & ORGAN_ROBOT)
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin tone
if(H.get_species() == "Human")
if (H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
eyes_s.Blend(hair_s, ICON_OVERLAY)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
if(facial_hair_style)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
var/icon/clothes_s = null
switch(H.mind.assigned_role)
if("Head of Personnel")
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Bartender")
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Botanist")
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Chef")
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Janitor")
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Librarian")
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Quartermaster")
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Cargo Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Shaft Miner")
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Lawyer")
clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Chaplain")
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Research Director")
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Scientist")
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
if("Chemist")
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
if("Chief Medical Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
if("Medical Doctor")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Geneticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
if("Virologist")
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
if("Captain")
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Head of Security")
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Warden")
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Detective")
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
if("Security Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Chief Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Station Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Atmospheric Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Roboticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
else
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
preview_icon.Blend(eyes_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
del(eyes_s)
del(clothes_s)
return preview_icon
+44
View File
@@ -8,6 +8,11 @@ client
//set src in world
if(!usr.client || !usr.client.holder)
usr << "\red You need to be an administrator to access this."
return
var/title = ""
var/body = ""
@@ -244,6 +249,7 @@ client
body += "<option value='byond://?src=\ref[src];godmode=\ref[D]'>Toggle Godmode</option>"
body += "<option value='byond://?src=\ref[src];build_mode=\ref[D]'>Toggle Build Mode</option>"
body += "<option value='byond://?src=\ref[src];direct_control=\ref[D]'>Assume Direct Control</option>"
body += "<option value='byond://?src=\ref[src];make_skeleton=\ref[D]'>Make 2spooky</option>"
body += "<option value='byond://?src=\ref[src];drop_everything=\ref[D]'>Drop Everything</option>"
body += "<option value='byond://?src=\ref[src];regenerateicons=\ref[D]'>Regenerate Icons</option>"
if(ishuman(D))
@@ -402,6 +408,7 @@ client
else if (href_list["rename"])
var/mob/M = locate(href_list["rename"])
if(!istype(M)) return
if(!admin_rank_check(src.holder.level, 3)) return
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
@@ -467,6 +474,7 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.give_spell(MOB)
href_list["datumrefresh"] = href_list["give_spell"]
else if (href_list["ninja"])
@@ -479,6 +487,7 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_ninjafy(MOB)
href_list["datumrefresh"] = href_list["ninja"]
else if (href_list["godmode"])
@@ -491,6 +500,7 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_godmode(MOB)
href_list["datumrefresh"] = href_list["godmode"]
else if (href_list["gib"])
@@ -503,6 +513,7 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_gib(MOB)
else if (href_list["build_mode"])
@@ -515,6 +526,7 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
togglebuildmode(MOB)
href_list["datumrefresh"] = href_list["build_mode"]
@@ -530,6 +542,7 @@ client
return
if(usr.client)
if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_admin_drop_everything(MOB)
else if (href_list["direct_control"])
@@ -544,12 +557,30 @@ client
return
if(usr.client)
if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_assume_direct_control(MOB)
else if (href_list["make_skeleton"])
if(!href_list["make_skeleton"])
return
var/mob/MOB = locate(href_list["make_skeleton"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(ishuman(MOB))
if(!admin_rank_check(src.holder.level, 3)) return
var/mob/living/carbon/human/HUMANMOB = MOB
HUMANMOB.makeSkeleton()
else if (href_list["delall"])
if(!href_list["delall"])
return
var/atom/A = locate(href_list["delall"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!A)
return
if(!isobj(A))
@@ -596,6 +627,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if (href_list["emp"])
@@ -606,6 +638,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if (href_list["mark_object"])
@@ -616,9 +649,11 @@ client
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
else if (href_list["rotatedatum"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!href_list["rotatedir"])
return
var/atom/A = locate(href_list["rotatedatum"])
@@ -639,6 +674,7 @@ client
var/mob/M = locate(href_list["makemonkey"])
if(!M)
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -656,6 +692,7 @@ client
var/mob/M = locate(href_list["makerobot"])
if(!M)
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -673,6 +710,7 @@ client
var/mob/M = locate(href_list["makealien"])
if(!M)
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -690,6 +728,7 @@ client
var/mob/M = locate(href_list["makemetroid"])
if(!M)
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -707,6 +746,7 @@ client
var/mob/M = locate(href_list["makeai"])
if(!M)
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -722,6 +762,7 @@ client
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if (href_list["setmutantrace"])
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(H))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -740,6 +781,7 @@ client
H.update_mutantrace()
else if (href_list["regenerateicons"])
var/mob/M = locate(href_list["regenerateicons"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(M))
usr << "This can only be done to objects of type /mob"
return
@@ -754,6 +796,8 @@ client
if(!isliving(M)) return
var/mob/living/L = M
if(!admin_rank_check(src.holder.level, 3)) return
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
if(Text == "brute")
L.adjustBruteLoss(amount)
+5 -2
View File
@@ -43,11 +43,14 @@ to null does not delete the object itself. Thank you.
var/severity = null//severity descr
var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely.
var/list/hidden = list(0, 0)
var/can_carry = 1 // If the disease allows "carriers".
var/age = 0 // age of the disease in the current mob
var/stage_minimum_age = 0 // how old the disease must be to advance per stage
// if hidden[1] is true, then virus is hidden from medical scanners
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
/datum/disease/proc/stage_act()
age++
var/cure_present = has_cure()
//world << "[cure_present]"
@@ -59,7 +62,7 @@ to null does not delete the object itself. Thank you.
if(stage > max_stages)
stage = max_stages
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present) //now the disease shouldn't get back up to stage 4 in no time
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present && age > stage_minimum_age * stage) //now the disease shouldn't get back up to stage 4 in no time
stage++
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
stage--
+12 -7
View File
@@ -37,8 +37,10 @@
cure_id = list("lexorin","toxin","gargleblaster")
cure_chance = 20
affected_species = list("Human", "Monkey")
permeability_mod = 3//likely to infect
permeability_mod = 15//likely to infect
can_carry = 0
var/gibbed = 0
stage_minimum_age = 300
/datum/disease/alien_embryo/stage_act()
..()
@@ -79,14 +81,17 @@
affected_mob << "\red You feel something tearing its way out of your stomach..."
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
if(prob(40))
if(prob(50))
if(gibbed != 0) return 0
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
i++
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
if(candidates.len)
+27 -14
View File
@@ -1,10 +1,10 @@
/datum/disease/appendicitis
form = "Condition"
name = "Appendicitis"
max_stages = 3
max_stages = 4
spread = "Acute"
cure = "Surgery"
agent = "Shitty Appendix"
agent = "Appendix"
affected_species = list("Human")
permeability_mod = 1
contagious_period = 9001 //slightly hacky, but hey! whatever works, right?
@@ -12,30 +12,43 @@
severity = "Medium"
longevity = 1000
hidden = list(0, 1)
stage_minimum_age = 300 // at least 200 life ticks per stage
/datum/disease/appendicitis/stage_act()
..()
switch(stage)
if(1)
if(prob(5)) affected_mob.emote("cough")
if(affected_mob.op_stage.appendix == 2.0)
// appendix is removed, can't get infected again
src.cure()
if(prob(5))
affected_mob << "\red You feel a stinging pain in your abdomen!"
affected_mob.emote("me",1,"winces slightly.")
if(2)
if(prob(3))
affected_mob << "\red You feel a stabbing pain in your abdomen!"
affected_mob.Stun(rand(2,3))
affected_mob.emote("me",1,"winces painfully.")
affected_mob.adjustToxLoss(1)
if(3)
if(prob(1))
if (affected_mob.nutrition > 100)
affected_mob.Stun(rand(4,6))
for(var/mob/O in viewers(world.view, affected_mob))
O.show_message(text("<b>\red [] throws up!</b>", affected_mob), 1)
playsound(affected_mob.loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/location = affected_mob.loc
if (istype(location, /turf/simulated))
location.add_vomit_floor(affected_mob)
affected_mob.nutrition -= 95
affected_mob.adjustToxLoss(-1)
var/mob/living/carbon/human/H = affected_mob
H.vomit()
else
affected_mob << "\red You gag as you want to throw up, but there's nothing in your stomach!"
affected_mob.Weaken(10)
affected_mob.adjustToxLoss(3)
affected_mob.adjustToxLoss(3)
if(4)
if(prob(1) && ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
H << "\red Your abdomen is a world of pain!"
H.Weaken(10)
H.op_stage.appendix = 2.0
var/datum/organ/external/groin = H.get_organ("groin")
var/datum/wound/W = new /datum/wound/internal_bleeding(25)
H.adjustToxLoss(25)
groin.wounds += W
src.cure()
+3 -3
View File
@@ -3,9 +3,9 @@
max_stages = 4
spread = "On contact"
spread_type = CONTACT_GENERAL
cure = "Ryetalin"
cure = "ryetalyn"
curable = 0
cure = "Ryetalyn"
cure_id = "ryetalyn"
curable = 1
agent = "S4E1 retrovirus"
affected_species = list("Human")
var/list/original_dna = list()
+52 -3
View File
@@ -53,6 +53,11 @@ datum/mind
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/rev_cooldown = 0
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
New(var/key)
src.key = key
@@ -342,6 +347,10 @@ datum/mind
log_admin("[key_name(usr)] tried to access [current]'s mind without authorization.")
return
if (!(usr.client.holder.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
alert("You cannot perform this action. You must be of a higher administrative rank!")
return
if (href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
if (!new_role) return
@@ -725,6 +734,11 @@ datum/mind
special_role = null
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
if(isAI(current))
var/mob/living/silicon/ai/A = current
A.set_zeroth_law("")
A.show_laws()
if("traitor")
if(!(src in ticker.mode.traitors))
@@ -732,6 +746,10 @@ datum/mind
special_role = "traitor"
current << "<B>\red You are a traitor!</B>"
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
if(isAI(current))
var/mob/living/silicon/ai/A = current
call(/datum/game_mode/proc/add_law_zero)(A)
A.show_laws()
if("autoobjectives")
ticker.mode.forge_traitor_objectives(src)
@@ -1070,6 +1088,37 @@ datum/mind
fail |= !ticker.mode.equip_revolutionary(current)
// check whether this mind's mob has been brigged for the given duration
// have to call this periodically for the duration to work properly
proc/is_brigged(duration)
var/turf/T = current.loc
if(!istype(T))
brigged_since = -1
return 0
var/is_currently_brigged = 0
if(istype(T.loc,/area/security/brig))
is_currently_brigged = 1
for(var/obj/item/weapon/card/id/card in current)
is_currently_brigged = 0
break // if they still have ID they're not brigged
for(var/obj/item/device/pda/P in current)
if(P.id)
is_currently_brigged = 0
break // if they still have ID they're not brigged
if(!is_currently_brigged)
brigged_since = -1
return 0
if(brigged_since == -1)
brigged_since = world.time
return (duration <= world.time - brigged_since)
//Initialisation procs
/mob/living/proc/mind_initialize()
@@ -1153,17 +1202,17 @@ datum/mind
..()
mind.assigned_role = "Shade"
/mob/living/simple_animal/constructbuilder/mind_initialize()
/mob/living/simple_animal/construct/builder/mind_initialize()
..()
mind.assigned_role = "Artificer"
mind.special_role = "Cultist"
/mob/living/simple_animal/constructwraith/mind_initialize()
/mob/living/simple_animal/construct/wraith/mind_initialize()
..()
mind.assigned_role = "Wraith"
mind.special_role = "Cultist"
/mob/living/simple_animal/constructarmoured/mind_initialize()
/mob/living/simple_animal/construct/armoured/mind_initialize()
..()
mind.assigned_role = "Juggernaut"
mind.special_role = "Cultist"
+6 -1
View File
@@ -1,6 +1,11 @@
/datum/organ
var/name = "organ"
var/mob/living/carbon/human/owner = null
var/list/datum/autopsy_data/autopsy_data = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
// links chemical IDs to number of ticks for which they'll stay in the blood
///datum/organ/proc/process()
// return 0
@@ -12,4 +17,4 @@
return 0
proc/receive_chem(chemical as obj)
return 0
return 0
+170 -60
View File
@@ -5,6 +5,7 @@
name = "external"
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/damage_state = "00"
var/brute_dam = 0
@@ -33,8 +34,21 @@
var/open = 0
var/stage = 0
// INTERNAL germs inside the organ, this is BAD if it's greater 0
var/germ_level = 0
// how often wounds should be updated, a higher number means less often
var/wound_update_accuracy = 20 // update every 20 ticks(roughly every minute)
New(var/datum/organ/external/P)
if(P)
parent = P
if(!parent.children)
parent.children = list()
parent.children.Add(src)
return ..()
proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
// TODO: this proc needs to be rewritten toa not update damages directly
if((brute <= 0) && (burn <= 0))
return 0
if(status & ORGAN_DESTROYED)
@@ -50,8 +64,7 @@
var/nux = brute * rand(10,15)
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if(prob(5 * brute))
status |= ORGAN_DESTROYED
droplimb()
droplimb(1)
return
else if(prob(nux))
@@ -62,39 +75,28 @@
else if(brute > 20)
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if(prob(5 * brute))
status |= ORGAN_DESTROYED
droplimb()
droplimb(1)
return
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
if(brute)
brute_dam += brute
if( (prob(brute*2) && !sharp) || sharp )
createwound( CUT, brute )
else if(!sharp)
createwound( BRUISE, brute )
if(burn)
burn_dam += burn
createwound( BURN, burn )
else
// If we can't inflict the full amount of damage, spread the damage in other ways
var/can_inflict = max_damage * config.organ_health_multiplier - (brute_dam + burn_dam) //How much damage can we actually cause?
if(can_inflict)
if (brute > 0 && burn > 0)
brute = can_inflict/2
burn = can_inflict/2
var/ratio = brute / (brute + burn)
brute_dam += ratio * can_inflict
burn_dam += (1 - ratio) * can_inflict
else
if (brute > 0)
brute = can_inflict
brute_dam += brute
createwound(BRUISE, brute)
else
burn = can_inflict
burn_dam += burn
createwound(BRUISE, brute)
if (brute > 0)
brute = can_inflict
createwound(BRUISE, brute)
if (burn > 0)
burn = can_inflict
createwound(BURN, burn)
else if(!(status & ORGAN_ROBOT))
var/passed_dam = (brute + burn) - can_inflict //Getting how much overdamage we have.
var/list/datum/organ/external/possible_points = list()
@@ -105,7 +107,8 @@
if(forbidden_limbs.len)
possible_points -= forbidden_limbs
if(!possible_points.len)
message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage too!")
if(owner.stat != 2)
message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage to!")
else
var/datum/organ/external/target = pick(possible_points)
if(brute)
@@ -119,6 +122,8 @@
if(status & ORGAN_BROKEN)
owner.emote("scream")
if(used_weapon) add_autopsy_data(used_weapon, brute + burn)
owner.updatehealth()
// sync the organ's damage with its wounds
@@ -169,7 +174,7 @@
else if(W.damage_type == BURN)
burn_dam += W.damage
if(!W.bandaged && W.damage > 4)
if(W.bleeding())
status |= ORGAN_BLEEDING
number_wounds += W.amount
@@ -180,18 +185,53 @@
if(W.damage == 0 && W.created + 10 * 10 * 60 <= world.time)
wounds -= W
// let the GC handle the deletion of the wound
if(W.is_treated())
if(W.internal && !W.is_treated())
// internal wounds get worse over time
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.2 * W.damage * wound_update_accuracy)
if(W.bandaged || W.salved)
// slow healing
var/amount = 0.2
if(W.bandaged) amount++
if(W.salved) amount++
if(W.disinfected) amount++
if(W.is_treated())
amount += 10
// amount of healing is spread over all the wounds
W.heal_damage((amount * W.amount * config.organ_regeneration_multiplier) / (5*owner.number_wounds+1))
W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1))
if(W.germ_level > 100 && prob(10))
owner.adjustToxLoss(1 * wound_update_accuracy)
if(W.germ_level > 1000)
owner.adjustToxLoss(1 * wound_update_accuracy)
// Salving also helps against infection
if(W.germ_level > 0 && W.salved && prob(2))
W.germ_level = 0
// sync the organ's damage with its wounds
src.update_damages()
proc/bandage()
var/rval = 0
for(var/datum/wound/W in wounds)
if(W.internal) continue
rval |= !W.bandaged
W.bandaged = 1
return rval
proc/clamp()
var/rval = 0
for(var/datum/wound/W in wounds)
if(W.internal) continue
rval |= !W.clamped
W.clamped = 1
return rval
proc/salve()
var/rval = 0
for(var/datum/wound/W in wounds)
rval |= !W.salved
W.salved = 1
return rval
proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
@@ -202,9 +242,15 @@
proc/get_damage_fire()
return burn_dam
proc/is_infected()
for(var/datum/wound/W in wounds)
if(W.germ_level > 100)
return 1
return 0
process()
// process wounds, doing healing etc., only do this every 4 ticks to save processing power
if(owner.life_tick % 4 == 0)
if(owner.life_tick % wound_update_accuracy == 0)
update_wounds()
if(status & ORGAN_DESTROYED)
if(!destspawn && config.limbs_can_break)
@@ -218,14 +264,21 @@
owner.update_body(1)
return
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
if(!(status & ORGAN_BROKEN))
owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
owner.emote("scream")
status |= ORGAN_BROKEN
broken_description = pick("broken","fracture","hairline fracture")
perma_injury = brute_dam
src.fracture()
if(germ_level > 0)
for(var/datum/wound/W in wounds) if(!W.bandaged && !W.salved)
W.germ_level = max(W.germ_level, germ_level)
return
proc/fracture()
if(status & ORGAN_BROKEN)
return
owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
owner.emote("scream")
status |= ORGAN_BROKEN
broken_description = pick("broken","fracture","hairline fracture")
perma_injury = brute_dam
// new damage icon system
// returns just the brute/burn damage code
proc/damage_state_text()
@@ -265,10 +318,19 @@
return 1
return 0
proc/setAmputatedTree()
for(var/datum/organ/external/O in children)
O.amputated=amputated
O.setAmputatedTree()
proc/droplimb(var/override = 0,var/no_explode = 0)
if(destspawn) return
if(override)
status |= ORGAN_DESTROYED
if(status & ORGAN_DESTROYED)
if(body_part == UPPER_TORSO)
return
if(status & ORGAN_SPLINTED)
status &= ~ORGAN_SPLINTED
if(implant)
@@ -283,8 +345,8 @@
var/obj/item/weapon/organ/H
switch(body_part)
if(UPPER_TORSO)
owner.gib()
// if(UPPER_TORSO)
// owner.gib()
if(LOWER_TORSO)
owner << "\red You are now sterile."
if(HEAD)
@@ -342,8 +404,25 @@
if(ismonkey(owner))
H.icon_state = "l_foot_l"
owner.u_equip(owner.shoes)
if(ismonkey(owner))
H.icon = 'monkey.dmi'
if(H)
if(ismonkey(owner))
H.icon = 'monkey.dmi'
else if(ishuman(owner) && owner.dna)
var/icon/I
switch(owner.dna.mutantrace)
if("tajaran")
I = new('icons/mob/human_races/r_tajaran.dmi')
if("lizard")
I = new('icons/mob/human_races/r_lizard.dmi')
if("skrell")
I = new('icons/mob/human_races/r_skrell.dmi')
else
I = new('icons/mob/human_races/r_human.dmi')
if(I)
H.icon = I.MakeLying()
else
H.icon_state = initial(H.icon_state)+"_l"
var/lol = pick(cardinal)
step(H,lol)
destspawn = 1
@@ -354,8 +433,8 @@
if(!no_explode)
explosion(get_turf(owner),-1,-1,2,3)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
spark_system.set_up(5, 0, owner)
spark_system.attach(owner)
spark_system.start()
spawn(10)
del(spark_system)
@@ -373,14 +452,15 @@
var/size = min( max( 1, damage/10 ) , 6)
// first check whether we can widen an existing wound
if(wounds.len > 0 && prob(25))
if(wounds.len > 0 && prob(max(50+owner.number_wounds*10,100)))
if((type == CUT || type == BRUISE) && damage >= 5)
var/datum/wound/W = pick(wounds)
if(W.amount == 1 && W.started_healing())
W.open_wound()
owner.visible_message("\red The wound on [owner.name]'s [display_name] widens with a nasty ripping voice.",\
"\red The wound on your [display_name] widens with a nasty ripping voice.",\
"You hear a nasty ripping noise, as if flesh is being torn apart.")
W.open_wound(damage)
if(prob(25))
owner.visible_message("\red The wound on [owner.name]'s [display_name] widens with a nasty ripping voice.",\
"\red The wound on your [display_name] widens with a nasty ripping voice.",\
"You hear a nasty ripping noise, as if flesh is being torn apart.")
return
@@ -403,12 +483,15 @@
W = new wound_type(damage)
if(BURN)
var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area)
var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area, /datum/wound/carbonised_area)
wound_type = size_names[size]
W = new wound_type(damage)
// Possibly trigger an internal wound, too.
if(damage > 10 && prob(damage) && type != BURN)
var/datum/wound/internal_bleeding/I = new (15)
wounds += I
// check whether we can add the wound to an existing wound
for(var/datum/wound/other in wounds)
@@ -427,9 +510,9 @@
if(!(status & ORGAN_ROBOT))
return
if(prob(30*severity))
take_damage(4(4-severity), 0, 1, used_weapon = "EMP")
else
droplimb(1)
else
take_damage(4(4-severity), 0, 1, used_weapon = "EMP")
proc/getDisplayName()
switch(name)
@@ -452,6 +535,28 @@
else
return name
proc/robotize()
src.status &= ~ORGAN_BROKEN
src.status &= ~ORGAN_BLEEDING
src.status &= ~ORGAN_SPLINTED
src.status &= ~ORGAN_ATTACHABLE
src.status &= ~ORGAN_DESTROYED
src.status |= ORGAN_ROBOT
for (var/datum/organ/external/T in children)
if(T)
T.robotize()
proc/add_autopsy_data(var/used_weapon, var/damage)
var/datum/autopsy_data/W = autopsy_data[used_weapon]
if(!W)
W = new()
W.weapon = used_weapon
autopsy_data[used_weapon] = W
W.hits += 1
W.damage += damage
W.time_inflicted = world.time
/datum/organ/external/chest
name = "chest"
icon_name = "chest"
@@ -459,6 +564,7 @@
max_damage = 150
min_broken_damage = 75
body_part = UPPER_TORSO
var/ruptured_lungs = 0
/datum/organ/external/groin
name = "groin"
@@ -492,6 +598,7 @@
max_damage = 75
min_broken_damage = 30
body_part = LEG_LEFT
icon_position = LEFT
/datum/organ/external/r_arm
name = "r_arm"
@@ -508,6 +615,7 @@
max_damage = 75
min_broken_damage = 30
body_part = LEG_RIGHT
icon_position = RIGHT
/datum/organ/external/l_foot
name = "l_foot"
@@ -516,6 +624,7 @@
max_damage = 40
min_broken_damage = 15
body_part = FOOT_LEFT
icon_position = LEFT
/datum/organ/external/r_foot
name = "r_foot"
@@ -524,6 +633,7 @@
max_damage = 40
min_broken_damage = 15
body_part = FOOT_RIGHT
icon_position = RIGHT
/datum/organ/external/r_hand
name = "r_hand"
@@ -546,7 +656,7 @@
****************************************************/
obj/item/weapon/organ
icon = 'human.dmi'
icon = 'icons/mob/human_races/r_human.dmi'
obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
..(loc)
@@ -637,25 +747,25 @@ obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob)
obj/item/weapon/organ/l_arm
name = "left arm"
icon_state = "l_arm_l"
icon_state = "l_arm"
obj/item/weapon/organ/l_foot
name = "left foot"
icon_state = "l_foot_l"
icon_state = "l_foot"
obj/item/weapon/organ/l_hand
name = "left hand"
icon_state = "l_hand_l"
icon_state = "l_hand"
obj/item/weapon/organ/l_leg
name = "left leg"
icon_state = "l_leg_l"
icon_state = "l_leg"
obj/item/weapon/organ/r_arm
name = "right arm"
icon_state = "r_arm_l"
icon_state = "r_arm"
obj/item/weapon/organ/r_foot
name = "right foot"
icon_state = "r_foot_l"
icon_state = "r_foot"
obj/item/weapon/organ/r_hand
name = "right hand"
icon_state = "r_hand_l"
icon_state = "r_hand"
obj/item/weapon/organ/r_leg
name = "right leg"
icon_state = "r_leg_l"
icon_state = "r_leg"
+10
View File
@@ -3,6 +3,16 @@
****************************************************/
/datum/organ/internal
name = "internal"
var/damage = 0
var/max_damage = 100
/datum/organ/internal/skeleton
name = "spooky scary skeleton"
max_damage = 200
/datum/organ/internal/skin
name = "skin"
max_damage = 100
/datum/organ/internal/blood_vessels
name = "blood vessels"
+17 -2
View File
@@ -42,6 +42,22 @@ mob/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
src << msg
next_pain_time = world.time + (100 - amount)
// message is the custom message to be displayed
// flash_strength is 0 for weak pain flash, 1 for strong pain flash
mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
if(stat >= 1) return
if(reagents.has_reagent("tramadol"))
return
if(reagents.has_reagent("oxycodone"))
return
if(analgesic)
return
var/msg = "\red <b>[message]</b>"
if(flash_strength >= 1)
msg = "\red <font size=3><b>[message]</b></font>"
src << msg
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
if(stat >= 2) return
@@ -53,8 +69,7 @@ mob/living/carbon/human/proc/handle_pain()
return
var/maxdam = 0
var/datum/organ/external/damaged_organ = null
for(var/name in organs)
var/datum/organ/external/E = organs[name]
for(var/datum/organ/external/E in organs)
// amputated limbs don't cause pain
if(E.amputated) continue
+60 -20
View File
@@ -25,6 +25,8 @@
// is the wound bandaged?
var/tmp/bandaged = 0
// Similar to bandaged, but works differently
var/tmp/clamped = 0
// is the wound salved?
var/tmp/salved = 0
// is the wound disinfected?
@@ -34,6 +36,16 @@
// number of wounds of this type
var/tmp/amount = 1
// maximum stage at which bleeding should still happen, counted from the right rather than the left of the list
// 1 means all stages except the last should bleed
var/max_bleeding_stage = 1
// internal wounds can only be fixed through surgery
var/internal = 0
// amount of germs in the wound
var/germ_level = 0
// helper lists
var/tmp/list/desc_list = list()
var/tmp/list/damage_list = list()
@@ -55,6 +67,10 @@
// this will ensure the size of the wound matches the damage
src.heal_damage(0)
// make the max_bleeding_stage count from the end of the list rather than the start
// this is more robust to changes to the list
max_bleeding_stage = src.desc_list.len - max_bleeding_stage
// returns 1 if there's a next stage, 0 otherwise
proc/next_stage()
if(current_stage + 1 > src.desc_list.len)
@@ -82,7 +98,12 @@
// heal the given amount of damage, and if the given amount of damage was more
// than what needed to be healed, return how much heal was left
proc/heal_damage(amount)
// set @heals_internal to also heal internal organ damage
proc/heal_damage(amount, heals_internal = 0)
if(src.internal && !heals_internal)
// heal nothing
return amount
var/healed_damage = min(src.damage, amount)
amount -= healed_damage
src.damage -= healed_damage
@@ -90,42 +111,53 @@
while(src.damage / src.amount < damage_list[current_stage] && current_stage < src.desc_list.len)
current_stage++
desc = desc_list[current_stage]
src.min_damage = damage_list[current_stage]
// return amount of healing still leftover, can be used for other wounds
return amount
// opens the wound again
proc/open_wound()
if(current_stage > 1)
// e.g. current_stage is 2, then reset it to 0 and do next_stage(), bringing it to 1
src.current_stage -= 2
next_stage()
src.damage = src.min_damage + 5
proc/open_wound(damage)
src.damage += damage
while(src.current_stage > 1 && src.damage_list[current_stage-1] <= src.damage)
src.current_stage--
src.desc = desc_list[current_stage]
src.min_damage = damage_list[current_stage]
proc/bleeding()
// internal wounds don't bleed in the sense of this function
return (!(bandaged||clamped) && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal)
/** CUTS **/
/datum/wound/cut
// link wound descriptions to amounts of damage
stages = list("cut" = 5, "healing cut" = 2, "small scab" = 0)
max_bleeding_stage = 2
stages = list("ugly ripped cut" = 20, "ripped cut" = 10, "cut" = 5, "healing cut" = 2, "small scab" = 0)
/datum/wound/deep_cut
stages = list("deep cut" = 15, "clotted cut" = 8, "scab" = 2, "fresh skin" = 0)
max_bleeding_stage = 3
stages = list("ugly deep ripped cut" = 25, "deep ripped cut" = 20, "deep cut" = 15, "clotted cut" = 8, "scab" = 2, "fresh skin" = 0)
/datum/wound/flesh_wound
stages = list("flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0)
max_bleeding_stage = 3
stages = list("ugly ripped flesh wound" = 35, "ugly flesh wound" = 30, "flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0)
/datum/wound/gaping_wound
max_bleeding_stage = 2
stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, \
"small straight scar" = 0)
"small straight scar" = 0)
/datum/wound/big_gaping_wound
stages = list("big gaping wound" = 60, "gauze wrapped wound" = 50, "blood soaked bandage" = 25,\
"large angry scar" = 10, "large straight scar" = 0)
max_bleeding_stage = 2
stages = list("big gaping wound" = 60, "healing gaping wound" = 40, "large angry scar" = 10, "large straight scar" = 0)
needs_treatment = 1 // this only heals when bandaged
/datum/wound/massive_wound
stages = list("massive wound" = 70, "massive blood soaked bandage" = 40, "huge bloody mess" = 20,\
"massive angry scar" = 10, "massive jagged scar" = 0)
max_bleeding_stage = 2
stages = list("massive wound" = 70, "massive healing wound" = 50, "massive angry scar" = 10, "massive jagged scar" = 0)
needs_treatment = 1 // this only heals when bandaged
@@ -160,28 +192,28 @@
/** BURNS **/
/datum/wound/moderate_burn
stages = list("moderate burn" = 5, "moderate salved burn" = 2, "fresh skin" = 0)
stages = list("ripped burn" = 10, "moderate burn" = 5, "moderate salved burn" = 2, "fresh skin" = 0)
needs_treatment = 1 // this only heals when bandaged
damage_type = BURN
/datum/wound/large_burn
stages = list("large burn" = 15, "large salved burn" = 5, "fresh skin" = 0)
stages = list("ripped large burn" = 20, "large burn" = 15, "large salved burn" = 5, "fresh skin" = 0)
needs_treatment = 1 // this only heals when bandaged
damage_type = BURN
/datum/wound/severe_burn
stages = list("severe burn" = 30, "severe salved burn" = 10, "burn scar" = 0)
stages = list("ripped severe burn" = 35, "severe burn" = 30, "severe salved burn" = 10, "burn scar" = 0)
needs_treatment = 1 // this only heals when bandaged
damage_type = BURN
/datum/wound/deep_burn
stages = list("deep burn" = 40, "deep salved burn" = 15, "large burn scar" = 0)
stages = list("ripped deep burn" = 45, "deep burn" = 40, "deep salved burn" = 15, "large burn scar" = 0)
needs_treatment = 1 // this only heals when bandaged
@@ -193,4 +225,12 @@
needs_treatment = 1 // this only heals when bandaged
damage_type = BURN
damage_type = BURN
/datum/wound/internal_bleeding
internal = 1
stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5)
max_bleeding_stage = 0
needs_treatment = 1
+2 -2
View File
@@ -68,13 +68,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(!istype(usr, /mob/living/carbon/human))
usr << "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans."
return 0
if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe))
if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard))
usr << "I don't feel strong enough without my robe."
return 0
if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal))
usr << "I don't feel strong enough without my sandals."
return 0
if(!istype(usr:head, /obj/item/clothing/head/wizard))
if(!istype(usr:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard))
usr << "I don't feel strong enough without my hat."
return 0
+16 -14
View File
@@ -8,7 +8,7 @@
/datum/supply_packs
var/name = null
var/list/contains = list()
var/manifest
var/manifest = ""
var/amount = null
var/cost = null
var/containertype = null
@@ -18,7 +18,7 @@
var/contraband = 0
/datum/supply_packs/New()
manifest = "<ul>"
manifest += "<ul>"
for(var/path in contains)
if(!path) continue
var/atom/movable/AM = new path()
@@ -272,16 +272,25 @@
/datum/supply_packs/virus
name = "Virus crate"
contains = list(/obj/item/weapon/reagent_containers/glass/bottle/flu_virion,
contains = list(/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random
/* VIRUS2 4LIFE
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion,
/obj/item/weapon/reagent_containers/glass/bottle/cold,
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs,
/obj/item/weapon/reagent_containers/glass/bottle/magnitis,
// /obj/item/weapon/reagent_containers/glass/bottle/wizarditis, worse than GBS if anything
// /obj/item/weapon/reagent_containers/glass/bottle/gbs, No. Just no.
/obj/item/weapon/reagent_containers/glass/bottle/wizarditis, worse than GBS if anything
/obj/item/weapon/reagent_containers/glass/bottle/gbs, No. Just no.
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat,
/obj/item/weapon/reagent_containers/glass/bottle/brainrot,
/obj/item/weapon/storage/syringes,
/obj/item/weapon/storage/beakerbox)
/obj/item/weapon/storage/beakerbox
*/
)
cost = 20
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Virus crate"
@@ -575,12 +584,8 @@
/obj/item/clothing/head/collectable/thunderdome,
/obj/item/clothing/head/collectable/swat,
/obj/item/clothing/head/collectable/metroid,
/obj/item/clothing/head/collectable/metroid,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/collectable/slime,
/obj/item/clothing/head/collectable/slime,
/obj/item/clothing/head/collectable/xenom,
/obj/item/clothing/head/collectable/xenom,
/obj/item/clothing/head/collectable/petehat)
name = "Collectable hat crate!"
@@ -589,10 +594,7 @@
containername = "Collectable hats crate! Brought to you by Bass.inc!"
/datum/supply_packs/randomised/New()
var/list/tempContains = list()
for(var/i = 0,i<num_contained,i++)
tempContains += pick(contains)
contains = tempContains
manifest += "Contains any [num_contained] of:"
..()
-1
View File
@@ -95,7 +95,6 @@ var/list/admin_log = list ( )
var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
var/list/admins = list( )
var/list/alien_whitelist = list( )
var/list/shuttles = list( )
var/list/reg_dna = list( )
// list/traitobj = list( )
+8 -47
View File
@@ -192,38 +192,37 @@
var/d1 = 0
var/d2 = 1
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
var/color="red"
var/color = "red"
var/obj/structure/powerswitch/power_switch
/obj/structure/cable/yellow
color="yellow"
color = "yellow"
icon = 'icons/obj/power_cond_yellow.dmi'
/obj/structure/cable/green
color="green"
color = "green"
icon = 'icons/obj/power_cond_green.dmi'
/obj/structure/cable/blue
color="blue"
color = "blue"
icon = 'icons/obj/power_cond_blue.dmi'
/obj/structure/cable/pink
color="pink"
color = "pink"
icon = 'icons/obj/power_cond_pink.dmi'
/obj/structure/cable/orange
color="orange"
color = "orange"
icon = 'icons/obj/power_cond_orange.dmi'
/obj/structure/cable/cyan
color="cyan"
color = "cyan"
icon = 'icons/obj/power_cond_cyan.dmi'
/obj/structure/cable/white
color="white"
color = "white"
icon = 'icons/obj/power_cond_white.dmi'
/obj/effect/projection
name = "Projection"
desc = "This looks like a projection of something."
@@ -244,44 +243,6 @@
anchored = 1
unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
/obj/item/metroid_core
name = "roro core"
desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"."
icon = 'icons/obj/surgery.dmi'
icon_state = "roro core"
flags = TABLEPASS
force = 1.0
w_class = 1.0
throwforce = 1.0
throw_speed = 3
throw_range = 6
origin_tech = "biotech=4"
var/POWERFLAG = 0 // sshhhhhhh
var/Flush = 30
var/Uses = 5 // uses before it goes inert
New()
..()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
POWERFLAG = rand(1,10)
Uses = rand(7, 25)
//flags |= NOREACT
spawn()
Life()
proc/Life()
while(src)
sleep(25)
Flush--
if(Flush <= 0)
reagents.clear_reagents()
Flush = 30
/obj/effect/deskclutter
name = "desk clutter"
icon = 'icons/obj/items.dmi'
+27 -1
View File
@@ -962,6 +962,23 @@
plant_type = 0
growthstages = 5
/obj/item/seeds/cherryseed
name = "pack of cherry pits"
desc = "Careful not to crack a tooth on one... That'd be the pits."
icon_state = "seed-cherry"
mypath = "/obj/item/seeds/cherryseed"
species = "cherry"
plantname = "Cherry Tree"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cherries"
lifespan = 35
endurance = 35
maturation = 5
production = 5
yield = 3
potency = 10
plant_type = 0
growthstages = 5
/* // Maybe one day when I get it to work like a grenade which exlodes gibs.
/obj/item/seeds/gibtomatoseed
name = "Gib Tomato seeds"
@@ -1051,10 +1068,18 @@
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || (istype(W, /obj/item/weapon/twohanded/fireaxe) && W:wielded) || istype(W, /obj/item/weapon/melee/energy))
user.show_message("<span class='notice'>You make planks out of the [src]!</span>", 1)
for(var/i=0,i<2,i++)
new /obj/item/stack/sheet/wood (src.loc)
var/obj/item/stack/sheet/wood/NG = new (user.loc)
for (var/obj/item/stack/sheet/wood/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
usr << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks."
del(src)
return
/obj/item/weapon/grown/sunflower // FLOWER POWER!
name = "sunflower"
desc = "It's beautiful! A certain person might beat you to death if you trample these."
@@ -1319,3 +1344,4 @@
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
+2 -13
View File
@@ -41,19 +41,6 @@
idle_power_usage = 10
active_power_usage = 100
/obj/machinery/dispenser
name = "tank storage unit"
desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
density = 1
var/o2tanks = 10.0
var/pltanks = 10.0
anchored = 1.0
use_power = 1
idle_power_usage = 5
active_power_usage = 10
/obj/machinery/dna_scanner
name = "\improper DNA scanner/implanter"
desc = "It scans DNA structures."
@@ -151,6 +138,7 @@
icon_state = "meterX"
var/obj/machinery/atmospherics/pipe/target = null
anchored = 1.0
power_channel = ENVIRON
var/frequency = 0
var/id
use_power = 1
@@ -198,6 +186,7 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "doorctrl0"
desc = "A remote control-switch for a door."
power_channel = ENVIRON
var/id = null
var/range = 10
var/normaldoorcontrol = 0
-5
View File
@@ -180,11 +180,6 @@
icon_state = "satchel-cap"
item_state = "captainpack"
/obj/item/weapon/storage/backpack/bandolier
name = "bandolier"
desc = "It's a very old bandolier to wear on your back."
icon_state = "bandolier"
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
+3 -3
View File
@@ -225,8 +225,8 @@
name = "MegaSeed Servitor"
desc = "When you need seeds fast!"
icon_state = "seeds"
product_paths = "/obj/item/seeds/bananaseed;/obj/item/seeds/berryseed;/obj/item/seeds/carrotseed;/obj/item/seeds/chantermycelium;/obj/item/seeds/chiliseed;/obj/item/seeds/cornseed;/obj/item/seeds/eggplantseed;/obj/item/seeds/potatoseed;/obj/item/seeds/replicapod;/obj/item/seeds/soyaseed;/obj/item/seeds/sunflowerseed;/obj/item/seeds/tomatoseed;/obj/item/seeds/towermycelium;/obj/item/seeds/wheatseed;/obj/item/seeds/appleseed;/obj/item/seeds/poppyseed;/obj/item/seeds/ambrosiavulgarisseed;/obj/item/seeds/whitebeetseed;/obj/item/seeds/watermelonseed;/obj/item/seeds/limeseed;/obj/item/seeds/lemonseed;/obj/item/seeds/orangeseed;/obj/item/seeds/grassseed;/obj/item/seeds/cocoapodseed;/obj/item/seeds/cabbageseed;/obj/item/seeds/grapeseed;/obj/item/seeds/pumpkinseed"
product_amounts = "3;2;2;2;2;2;2;2;3;2;2;2;2;2;3;5;4;3;3;3;3;3;3;3;3;3;3"
product_paths = "/obj/item/seeds/bananaseed;/obj/item/seeds/berryseed;/obj/item/seeds/carrotseed;/obj/item/seeds/chantermycelium;/obj/item/seeds/chiliseed;/obj/item/seeds/cornseed;/obj/item/seeds/eggplantseed;/obj/item/seeds/potatoseed;/obj/item/seeds/replicapod;/obj/item/seeds/soyaseed;/obj/item/seeds/sunflowerseed;/obj/item/seeds/tomatoseed;/obj/item/seeds/towermycelium;/obj/item/seeds/wheatseed;/obj/item/seeds/appleseed;/obj/item/seeds/poppyseed;/obj/item/seeds/ambrosiavulgarisseed;/obj/item/seeds/whitebeetseed;/obj/item/seeds/watermelonseed;/obj/item/seeds/limeseed;/obj/item/seeds/lemonseed;/obj/item/seeds/orangeseed;/obj/item/seeds/grassseed;/obj/item/seeds/cocoapodseed;/obj/item/seeds/cabbageseed;/obj/item/seeds/grapeseed;/obj/item/seeds/pumpkinseed;/obj/item/seeds/cherryseed"
product_amounts = "3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3"
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_hidden = "/obj/item/seeds/amanitamycelium;/obj/item/seeds/glowshroom;/obj/item/seeds/libertymycelium;/obj/item/seeds/nettleseed;/obj/item/seeds/plumpmycelium;/obj/item/seeds/reishimycelium"
product_hideamt = "2;2;2;2;2;2"
@@ -284,7 +284,7 @@
desc = "Tools for tools."
icon_state = "tool"
icon_deny = "tool-deny"
req_access_txt = "12" //Maintenance access
//req_access_txt = "12" //Maintenance access
product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/analyzer;/obj/item/device/t_scanner"
product_amounts = "10;5;3;5;5;5;5"
product_hidden = "/obj/item/weapon/weldingtool/hugeetank;/obj/item/clothing/gloves/fyellow"
+64 -102
View File
@@ -19,6 +19,7 @@
throw_range = 4
w_class = 2
attack_verb = list("called", "rang")
hitsound = 'sound/weapons/ring.ogg'
/obj/item/weapon/shield/riot
name = "riot shield"
@@ -503,83 +504,6 @@
desc = "An untrustworthy bar of soap. Smells of fear."
icon_state = "soapsyndie"
/obj/item/weapon/bedsheet
name = "bedsheet"
desc = "Nice, linen, bedsheet. Perfect to put on."
icon = 'icons/obj/items.dmi'
icon_state = "sheet"
layer = 4.0
item_state = "bedsheet"
throwforce = 1
w_class = 1.0
throw_speed = 2
throw_range = 10
color = "white"
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
color = "blue"
/obj/item/weapon/bedsheet/green
icon_state = "sheetgreen"
color = "green"
/obj/item/weapon/bedsheet/orange
icon_state = "sheetorange"
color = "orange"
/obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple"
color = "purple"
/obj/item/weapon/bedsheet/rainbow
icon_state = "sheetrainbow"
color = "rainbow"
/obj/item/weapon/bedsheet/red
icon_state = "sheetred"
color = "red"
/obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow"
color = "yellow"
/obj/item/weapon/bedsheet/mime
icon_state = "sheetmime"
color = "mime"
/obj/item/weapon/bedsheet/clown
icon_state = "sheetclown"
color = "clown"
/obj/item/weapon/bedsheet/captain
icon_state = "sheetcaptain"
color = "captain"
/obj/item/weapon/bedsheet/rd
icon_state = "sheetrd"
color = "director"
/obj/item/weapon/bedsheet/medical
icon_state = "sheetmedical"
color = "medical"
/obj/item/weapon/bedsheet/hos
icon_state = "sheethos"
color = "hosred"
/obj/item/weapon/bedsheet/hop
icon_state = "sheethop"
color = "hop"
/obj/item/weapon/bedsheet/ce
icon_state = "sheetce"
color = "chief"
/obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown"
color = "brown"
/obj/item/weapon/bikehorn
name = "bike horn"
desc = "A horn off of a bicycle."
@@ -1116,6 +1040,10 @@
name = "paper- 'Greetings from Billy Bob'"
info = "<B>Hey fellow botanist!</B><BR>\n<BR>\nI didn't trust the station folk so I left<BR>\na couple of weeks ago. But here's some<BR>\ninstructions on how to operate things here.<BR>\nYou can grow plants and each iteration they become<BR>\nstronger, more potent and have better yield, if you<BR>\nknow which ones to pick. Use your botanist's analyzer<BR>\nfor that. You can turn harvested plants into seeds<BR>\nat the seed extractor, and replant them for better stuff!<BR>\nSometimes if the weed level gets high in the tray<BR>\nmutations into different mushroom or weed species have<BR>\nbeen witnessed. On the rare occassion even weeds mutate!<BR>\n<BR>\nEither way, have fun!<BR>\n<BR>\nBest regards,<BR>\nBilly Bob Johnson.<BR>\n<BR>\nPS.<BR>\nHere's a few tips:<BR>\nIn nettles, potency = damage<BR>\nIn amanitas, potency = deadliness + side effect<BR>\nIn Liberty caps, potency = drug power + effect<BR>\nIn chilis, potency = heat<BR>\n<B>Nutrients keep mushrooms alive!</B><BR>\n<B>Water keeps weeds such as nettles alive!</B><BR>\n<B>All other plants need both.</B>"
/obj/item/weapon/paper/djstation
name = "paper - 'DJ Listening Outpost'"
info = "<B>Welcome new owner!</B><BR><BR>You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:<br><ol><li>Equip yourself with a multi-tool</li><li>Use the multitool on each machine, that is the broadcaster, receiver and the relay.</li><li>Turn all the machines on, it has already been configured for you to listen on.</li></ol> Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.<br><ul><li>145.7 - Common Channel</li><li>144.7 - Private AI Channel</li><li>135.9 - Security Channel</li><li>135.7 - Engineering Channel</li><li>135.5 - Medical Channel</li><li>135.3 - Command Channel</li><li>135.1 - Science Channel</li><li>134.9 - Mining Channel</li><li>134.7 - Cargo Channel</li>"
/obj/item/weapon/paper/flag
icon_state = "flag_neutral"
item_state = "paper"
@@ -1135,6 +1063,20 @@
name = "paper- 'Standard Operating Procedure'"
info = "Alert Levels:<BR>\nBlue- Emergency<BR>\n\t1. Caused by fire<BR>\n\t2. Caused by manual interaction<BR>\n\tAction:<BR>\n\t\tClose all fire doors. These can only be opened by reseting the alarm<BR>\nRed- Ejection/Self Destruct<BR>\n\t1. Caused by module operating computer.<BR>\n\tAction:<BR>\n\t\tAfter the specified time the module will eject completely.<BR>\n<BR>\nEngine Maintenance Instructions:<BR>\n\tShut off ignition systems:<BR>\n\tActivate internal power<BR>\n\tActivate orbital balance matrix<BR>\n\tRemove volatile liquids from area<BR>\n\tWear a fire suit<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nToxin Laboratory Procedure:<BR>\n\tWear a gas mask regardless<BR>\n\tGet an oxygen tank.<BR>\n\tActivate internal atmosphere<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nDisaster Procedure:<BR>\n\tFire:<BR>\n\t\tActivate sector fire alarm.<BR>\n\t\tMove to a safe area.<BR>\n\t\tGet a fire suit<BR>\n\t\tAfter:<BR>\n\t\t\tAssess Damage<BR>\n\t\t\tRepair damages<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tMeteor Shower:<BR>\n\t\tActivate fire alarm<BR>\n\t\tMove to the back of ship<BR>\n\t\tAfter<BR>\n\t\t\tRepair damage<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tAccidental Reentry:<BR>\n\t\tActivate fire alrms in front of ship.<BR>\n\t\tMove volatile matter to a fire proof area!<BR>\n\t\tGet a fire suit.<BR>\n\t\tStay secure until an emergency ship arrives.<BR>\n<BR>\n\t\tIf ship does not arrive-<BR>\n\t\t\tEvacuate to a nearby safe area!"
/obj/item/weapon/paper/genetics_side_effects
name = "paper - 'Genetical Side-Effects and Treatments'"
New()
..()
info = ""
for(var/tp in typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect)
var/datum/genetics/side_effect/S = new tp
info += "<B>Name:</B>\t [S.name]<BR>"
info += "<B>Symptom:</B>\t [S.symptom]<BR>"
info += "<B>Treatment:</B>\t [S.treatment]<BR>"
info += "<B>Effect:</B>\t [S.effect]<BR>"
info += "<BR>"
/obj/item/weapon/banhammer
desc = "A banhammer"
name = "banhammer"
@@ -1148,18 +1090,6 @@
throw_range = 15
attack_verb = list("banned")
/obj/item/weapon/pen/sleepypen
desc = "It's a normal black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
flags = FPRINT | TABLEPASS | OPENCONTAINER
slot_flags = SLOT_BELT
origin_tech = "materials=2;biotech=1;syndicate=7"
/obj/item/weapon/pen/paralysis
desc = "It's a normal black ink pen with a sharp point."
flags = FPRINT | TABLEPASS | OPENCONTAINER
slot_flags = SLOT_BELT
origin_tech = "materials=2;biotech=1;syndicate=5"
/obj/item/weapon/rack_parts
name = "rack parts"
desc = "Parts of a rack."
@@ -1313,19 +1243,6 @@
icon_state = "wood_tableparts"
flags = null
/obj/item/weapon/teleportation_scroll
name = "scroll of teleportation"
desc = "A scroll for moving around."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
var/uses = 4.0
flags = FPRINT | TABLEPASS
w_class = 2.0
item_state = "paper"
throw_speed = 4
throw_range = 20
origin_tech = "bluespace=4"
/obj/item/weapon/wire
desc = "This is just a simple piece of regular insulated wire."
name = "wire"
@@ -1658,6 +1575,11 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharp = 1
/obj/item/weapon/scalpel/stabslash
name = "\proper Stabslash The Pains of Healing"
desc = "All craftsmanship is of highest quality. On it is image of doctor and patient. Doctor is panicing. Patien is asleep."
icon_state = "stabslash"
/obj/item/weapon/retractor
name = "retractor"
desc = "Retracts stuff."
@@ -1725,6 +1647,32 @@
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharp = 1
/obj/item/weapon/bonegel
name = "bone gel"
icon = 'surgery.dmi'
icon_state = "bone-gel"
force = 0
throwforce = 1.0
/obj/item/weapon/FixOVein
name = "FixOVein"
icon = 'surgery.dmi'
icon_state = "fixovein"
force = 0
throwforce = 1.0
origin_tech = "materials=1;biotech=3"
var/usage_amount = 10
/obj/item/weapon/bonesetter
name = "bone setter"
icon = 'surgery.dmi'
icon_state = "bone setter"
force = 8.0
throwforce = 9.0
throw_speed = 3
throw_range = 5
attack_verb = list("attacked", "hit", "bludgeoned")
/obj/item/weapon/syntiflesh
name = "syntiflesh"
desc = "Meat that appears...strange..."
@@ -2016,3 +1964,17 @@
icon_state = "capacitor"
desc = "A debug item for research."
origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
/obj/item/weapon/autopsy_scanner
name = "autopsy scanner"
desc = "Extracts information on wounds."
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
w_class = 1.0
origin_tech = "materials=1;biotech=1"
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/wdata = list()
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/chemtraces = list()
/obj/item/weapon/autopsy_scanner/var/target_name = null
/obj/item/weapon/autopsy_scanner/var/timeofdeath = null
+42 -1
View File
@@ -193,6 +193,12 @@
// Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
for(var/obj/item/device/radio/R in radios)
// This is usually for headsets, which only the wearer can hear.
if(R.canhear_range == 0)
if(ismob(R.loc))
. |= R.loc
continue
var/turf/speaker = get_turf(R)
if(speaker)
for(var/turf/T in hear(R.canhear_range,speaker))
@@ -203,7 +209,7 @@
var/turf/ear = get_turf(M)
if(ear && (level == 0 || level == ear.z))
if(ear in speaker_coverage)
. += M
. |= M
return .
@@ -279,3 +285,38 @@ proc/check_can_reach(atom/user, atom/target)
if(!in_range(user,target))
return 0
return CanReachThrough(get_turf(user), get_turf(target), target)
//dummy caching, used to speed up reach checks
var/list/DummyCache = list()
/proc/CanReachThrough(turf/srcturf, turf/targetturf, atom/target)
var/obj/item/weapon/dummy/D = locate() in DummyCache
if(!D)
D = new /obj/item/weapon/dummy( srcturf )
else
DummyCache.Remove(D)
D.loc = srcturf
if(targetturf.density && targetturf != get_turf(target))
return 0
//Now, check objects to block exit that are on the border
for(var/obj/border_obstacle in srcturf)
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, targetturf))
D.loc = null
DummyCache.Add(D)
return 0
//Next, check objects to block entry that are on the border
for(var/obj/border_obstacle in targetturf)
if((border_obstacle.flags & ON_BORDER) && (target != border_obstacle))
if(!border_obstacle.CanPass(D, srcturf, 1, 0))
D.loc = null
DummyCache.Add(D)
return 0
D.loc = null
DummyCache.Add(D)
return 1
+19 -1
View File
@@ -286,4 +286,22 @@ proc/listclearnulls(list/list)
if(Li <= L.len)
return (result + L.Copy(Li, 0))
return (result + R.Copy(Ri, 0))
return (result + R.Copy(Ri, 0))
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
/proc/bitfield2list(bitfield = 0, list/wordlist)
var/list/r = list()
if(istype(wordlist,/list))
var/max = min(wordlist.len,16)
var/bit = 1
for(var/i=1, i<=max, i++)
if(bitfield & bit)
r += wordlist[i]
bit = bit << 1
else
for(var/bit=1, bit<=65535, bit = bit << 1)
if(bitfield & bit)
r += bit
return r
+4 -2
View File
@@ -260,5 +260,7 @@ proc/tg_list2text(list/list, glue=",")
return dir2text(angle2dir(degree))
//Returns the world time in english
proc/worldtime2text()
return "[round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]"
proc/worldtime2text(var/time = 0)
if(time == 0)
time = world.time
return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]"
+12 -3
View File
@@ -327,8 +327,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(isAI(src))
var/mob/living/silicon/ai/A = src
oldname = null//don't bother with the records update crap
world << "<b>[newname] is the AI!</b>"
world << sound('sound/AI/newAI.ogg')
//world << "<b>[newname] is the AI!</b>"
//world << sound('sound/AI/newAI.ogg')
// Set eyeobj name
if(A.eyeobj)
A.eyeobj.name = "[newname] (AI Eye)"
@@ -1353,6 +1353,15 @@ proc/is_hot(obj/item/W as obj)
istype(W, /obj/item/weapon/kitchen/utensil/fork) && W.icon_state != "forkloaded" || \
istype(W, /obj/item/weapon/twohanded/fireaxe) \
)
/proc/is_surgery_tool(obj/item/W as obj)
return ( \
istype(W, /obj/item/weapon/scalpel) || \
istype(W, /obj/item/weapon/hemostat) || \
istype(W, /obj/item/weapon/retractor) || \
istype(W, /obj/item/weapon/cautery) || \
istype(W, /obj/item/weapon/bonegel) || \
istype(W, /obj/item/weapon/bonesetter)
)
/proc/reverse_direction(var/dir)
switch(dir)
@@ -1371,4 +1380,4 @@ proc/is_hot(obj/item/W as obj)
if(WEST)
return EAST
if(NORTHWEST)
return SOUTHEAST
return SOUTHEAST
+10
View File
@@ -7,6 +7,16 @@
#define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87))
icon
proc/MakeLying()
var/icon/I = new(src,dir=SOUTH)
I.BecomeLying()
return I
proc/BecomeLying()
Turn(90)
Shift(SOUTH,6)
Shift(EAST,1)
// Multiply all alpha values by this float
proc/ChangeOpacity(opacity = 1.0)
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0)
-74
View File
@@ -1,74 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
#define RECOMMENDED_VERSION 494
/world/New()
..()
if(byond_version < RECOMMENDED_VERSION)
world.log << "Your server's byond version does not meet the recommended requirements for Baystation12. Please update BYOND"
diary = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log")
diary << {"
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
---------------------
"}
diaryofmeanpeople = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] Attack.log")
diaryofmeanpeople << {"
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
---------------------
"}
href_logfile = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] hrefs.html")
jobban_loadbanfile()
jobban_updatelegacybans()
LoadBans()
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
process_teleport_locs() //Sets up the wizard teleport locations
process_ghost_teleport_locs() //Sets up ghost teleport locations.
sleep_offline = 1
spawn(180) //so we aren't adding to the round-start lag
/*if(config.ToRban)
ToRban_autoupdate()*/
if(config.kick_inactive)
KickInactiveClients()
#undef RECOMMENDED_VERSION
#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.)
/world/proc/KickInactiveClients()
for(var/client/C)
if( !C.holder && (C.inactivity >= INACTIVITY_KICK) )
if(C.mob)
if(!istype(C.mob, /mob/dead/))
log_access("AFK: [key_name(C)]")
C << "\red You have been inactive for more than 10 minutes and have been disconnected."
del(C)
spawn(3000) KickInactiveClients()//more or less five minutes
#undef INACTIVITY_KICK
/// EXPERIMENTAL STUFF
// This function counts a passed job.
proc/countJob(rank)
var/jobCount = 0
for(var/mob/H in player_list)
if(H.mind && H.mind.assigned_role == rank)
jobCount++
return jobCount
/proc/AutoUpdateAI(obj/subject)
if (subject!=null)
for(var/mob/living/silicon/ai/M in player_list)
if ((M.client && M.machine == subject))
subject.attack_ai(M)
/proc/AutoUpdateTK(obj/subject)
if (subject!=null)
for(var/obj/item/tk_grab/T in world)
if (T.host)
var/mob/M = T.host
if(M.client && M.machine == subject)
subject.attack_hand(M)
+102 -1
View File
@@ -696,6 +696,10 @@ proc/process_ghost_teleport_locs()
name = "\improper Research Director's Office"
icon_state = "head_quarters"
/area/crew_quarters/hos
name = "\improper Head of Security's Office"
icon_state = "head_quarters"
/area/crew_quarters/chief
name = "\improper Chief Engineer's Office"
icon_state = "head_quarters"
@@ -1105,9 +1109,21 @@ proc/process_ghost_teleport_locs()
//Toxins
/area/toxins/lab
name = "\improper Research Hallway"
icon_state = "toxlab"
/area/toxins/hallway
name = "\improper Research Lab"
icon_state = "toxlab"
/area/toxins/rdoffice
name = "\improper Research Director's Office"
icon_state = "head_quarters"
/area/toxins/supermatter
name = "\improper Supermatter Lab"
icon_state = "toxlab"
/area/toxins/xenobiology
name = "\improper Xenobiology Lab"
icon_state = "toxlab"
@@ -1462,7 +1478,91 @@ proc/process_ghost_teleport_locs()
name = "\improper Fore Block"
icon_state = "away3"
/area/awaymission/spacebattle
name = "\improper Nanotrasen Cruiser"
icon_state = "away"
requires_power = 0
/area/awaymission/spacebattle/syndicate1
name = "\improper Syndicate Assault Ship 1"
/area/awaymission/spacebattle/syndicate2
name = "\improper Syndicate Assault Ship 2"
/area/awaymission/spacebattle/syndicate3
name = "\improper Syndicate Assault Ship 3"
/area/awaymission/spacebattle/syndicate4
name = "\improper Syndicate War Sphere 1"
/area/awaymission/spacebattle/syndicate5
name = "\improper Syndicate War Sphere 2"
/area/awaymission/spacebattle/syndicate6
name = "\improper Syndicate War Sphere 3"
/area/awaymission/spacebattle/syndicate7
name = "\improper Syndicate Fighter"
/area/awaymission/spacebattle/secret
name = "\improper Hidden Chamber"
/area/awaymission/beach
name = "Beach"
icon_state = "null"
luminosity = 1
lighting_use_dynamic = 0
requires_power = 0
var/sound/mysound = null
New()
..()
var/sound/S = new/sound()
mysound = S
S.file = 'sound/ambience/shore.ogg'
S.repeat = 1
S.wait = 0
S.channel = 123
S.volume = 100
S.priority = 255
S.status = SOUND_UPDATE
process()
Entered(atom/movable/Obj,atom/OldLoc)
if(ismob(Obj))
if(Obj:client)
mysound.status = SOUND_UPDATE
Obj << mysound
return
Exited(atom/movable/Obj)
if(ismob(Obj))
if(Obj:client)
mysound.status = SOUND_PAUSED | SOUND_UPDATE
Obj << mysound
proc/process()
set background = 1
var/sound/S = null
var/sound_delay = 0
if(prob(25))
S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
sound_delay = rand(0, 50)
for(var/mob/living/carbon/human/H in src)
if(H.s_tone > -55)
H.s_tone--
H.update_body()
if(H.client)
mysound.status = SOUND_UPDATE
H << mysound
if(S)
spawn(sound_delay)
H << S
spawn(60) .()
/////////////////////////////////////////////////////////////////////
/*
@@ -1584,4 +1684,5 @@ var/list/the_station_areas = list (
spawn(sound_delay)
H << S
spawn(60) .()
spawn(60) .()
+12 -4
View File
@@ -123,7 +123,7 @@
D.open()
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.cancelAlarm("Fire", src, src)
for (var/obj/machinery/computer/station_alert/a in player_list)
for (var/obj/machinery/computer/station_alert/a in world)
a.cancelAlarm("Fire", src, src)
return
@@ -284,14 +284,22 @@
if ("Mine")
sound = pick('sound/ambience/ambimine.ogg')
musVolume = 25
if("Telecoms Teleporter") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecoms Central Compartment") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecoms Satellite") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecoms Foyer") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecommunications Satellite West Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecommunications Satellite East Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecoms Control Room") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if("Telecommunications Satellite Lounge") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
else
sound = pick('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
if(findtext(src.name, "Telecommunications"))
sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if (prob(35))
if(A && A:client && !A:client:played)
if(A && A:client && !A:client:played && !A:client:no_ambi)
A << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
A:client:played = 1
spawn(600)
+2 -2
View File
@@ -1,9 +1,9 @@
var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger/angry =4,
var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger =4,
/obj/item/weapon/pickaxe/silver =4,
/obj/item/weapon/pickaxe/drill =4,
/obj/item/weapon/pickaxe/jackhammer =4,
/mob/living/simple_animal/carp =3,
//mob/living/simple_animal/hostile/carp =3,
/obj/item/weapon/pickaxe/diamond =3,
/obj/item/weapon/pickaxe/diamonddrill =3,
/obj/item/weapon/pickaxe/gold =3,
+77 -46
View File
@@ -9,6 +9,7 @@
var/last_bumped = 0
var/pass_flags = 0
var/throwpass = 0
var/germ_level = 0 // The higher the germ level, the more germ on the atom.
///Chemistry.
var/datum/reagents/reagents = null
@@ -121,7 +122,7 @@
* Recursevly searches all atom contens (including contents contents and so on).
*
* ARGS: path - search atom contents for atoms of this type
* list/filter_path - if set, contents of atoms not of types in this list are excluded from search.
* list/filter_path - if set, contents of atoms not of types in this list are excluded from search.
*
* RETURNS: list of found atoms
*/
@@ -335,6 +336,7 @@ its easier to just keep the beam vertical.
/atom/proc/add_fingerprint(mob/living/M as mob)
if(isnull(M)) return
if(isAI(M)) return
if(isnull(M.key)) return
if (!( src.flags ) & FPRINT)
return
@@ -344,6 +346,12 @@ its easier to just keep the beam vertical.
fingerprintshidden = list()
//Fibers~
add_fibers(M)
//He has no prints!
if (mFingerprints in M.mutations)
if(fingerprintslast != M.key)
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
fingerprintslast = M.key
return 0
//Now, lets get to the dirty work.
//First, make sure their DNA makes sense.
var/mob/living/carbon/human/H = M
@@ -412,8 +420,8 @@ its easier to just keep the beam vertical.
A.fingerprints = list()
if(!istype(A.fingerprintshidden,/list))
A.fingerprintshidden = list()
A.fingerprints |= fingerprints //detective
A.fingerprintshidden |= fingerprintshidden //admin
A.fingerprints |= fingerprints //detective
A.fingerprintshidden |= fingerprintshidden //admin
A.fingerprintslast = fingerprintslast
@@ -548,6 +556,7 @@ its easier to just keep the beam vertical.
/atom/proc/clean_blood()
clean_prints()
src.germ_level = 0
if(istype(blood_DNA, /list))
del(blood_DNA)
return 1
@@ -1037,6 +1046,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE -------
var/direct = get_dir(usr, src)
var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc )
var/ok = 0
if ( (direct - 1) & direct)
@@ -1068,12 +1078,35 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
var/check_1 = 0
var/check_2 = 0
check_1 = CanReachThrough(get_turf(usr), Step_1, src) && CanReachThrough(Step_1, get_turf(src), src)
if(step_to(D, Step_1))
check_1 = 1
for(var/obj/border_obstacle in Step_1)
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, src))
check_1 = 0
// ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON ONE OF THE DIRECITON TILES -------
for(var/obj/border_obstacle in get_turf(src))
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0))
// ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON THE TILE YOU'RE ON -------
check_1 = 0
check_2 = CanReachThrough(get_turf(usr), Step_2, src) && CanReachThrough(Step_2, get_turf(src), src)
D.loc = usr.loc
if(step_to(D, Step_2))
check_2 = 1
ok = (check_1 || check_2)
for(var/obj/border_obstacle in Step_2)
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, src))
check_2 = 0
for(var/obj/border_obstacle in get_turf(src))
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0))
check_2 = 0
if(check_1 || check_2)
ok = 1
// ------- YOU CAN REACH THE ITEM THROUGH AT LEAST ONE OF THE TWO DIRECTIONS. GOOD. -------
/*
@@ -1086,12 +1119,34 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
*/
else
// ------- OBJECT IS ON A CARDINAL TILE (NORTH, SOUTH, EAST OR WEST OR THE TILE YOU'RE ON) -------
ok = CanReachThrough(get_turf(usr), get_turf(src), src)
if(loc == usr.loc)
ok = 1
// ------- OBJECT IS ON THE SAME TILE AS YOU -------
else
ok = 1
//Now, check objects to block exit that are on the border
for(var/obj/border_obstacle in usr.loc)
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, src))
ok = 0
//Next, check objects to block entry that are on the border
for(var/obj/border_obstacle in get_turf(src))
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0))
ok = 0
/*
See the previous More info, for... more info...
*/
//del(D) // Garbage Collect Dummy D.loc = null D = null // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- if (!( ok ))
//del(D)
// Garbage Collect Dummy
D.loc = null
D = null
// ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE -------
if (!( ok ))
// ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE -------
return 0
@@ -1207,43 +1262,6 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
usr.next_move = world.time + 6
return
////////////////////////////////////////
///IMPORTANT: CACHE FOR DUMMY OBJECTS///
//Used to cut down on stupid deletions//
////////////////////////////////////////
var/list/DummyCache = list()
/proc/CanReachThrough(turf/srcturf, turf/targetturf, atom/target)
var/obj/item/weapon/dummy/D = locate() in DummyCache
if(!D)
D = new /obj/item/weapon/dummy( srcturf )
else
DummyCache.Remove(D)
D.loc = srcturf
if(targetturf.density && targetturf != get_turf(target))
return 0
//Now, check objects to block exit that are on the border
for(var/obj/border_obstacle in srcturf)
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, targetturf))
D.loc = null
DummyCache.Add(D)
return 0
//Next, check objects to block entry that are on the border
for(var/obj/border_obstacle in targetturf)
if((border_obstacle.flags & ON_BORDER) && (target != border_obstacle))
if(!border_obstacle.CanPass(D, srcturf, 1, 0))
D.loc = null
DummyCache.Add(D)
return 0
D.loc = null
DummyCache.Add(D)
return 1
/atom/proc/ShiftClick(var/mob/M as mob)
@@ -1355,4 +1373,17 @@ var/list/DummyCache = list()
return 0
/atom/proc/checkpass(passflag)
return pass_flags&passflag/*/client/verb/check_dummy() set name = "List Dummies" set category = "Debug" var/list/dummies = list() for(var/obj/item/weapon/dummy/D in world) usr << "[D] - [D.x], [D.y], [D.z] - [D.loc]" dummies += D usr << "[dummies.len] found!"*/
return pass_flags&passflag
/*
/client/verb/check_dummy()
set name = "List Dummies"
set category = "Debug"
var/list/dummies = list()
for(var/obj/item/weapon/dummy/D in world)
usr << "[D] - [D.x], [D.y], [D.z] - [D.loc]"
dummies += D
usr << "[dummies.len] found!"
*/
-202
View File
@@ -1,202 +0,0 @@
/world/proc/load_mode()
var/text = file2text("data/mode.txt")
if (text)
var/list/lines = dd_text2list(text, "\n")
if (lines[1])
master_mode = lines[1]
diary << "Saved mode is '[master_mode]'"
/world/proc/save_mode(var/the_mode)
var/F = file("data/mode.txt")
fdel(F)
F << the_mode
/world/proc/load_motd()
join_motd = file2text("config/motd.txt")
/world/proc/load_admins()
var/text = file2text("config/admins.txt")
if (!text)
diary << "Failed to load config/admins.txt\n"
else
var/list/lines = dd_text2list(text, "\n")
for(var/line in lines)
if (!line)
continue
if (copytext(line, 1, 2) == ";")
continue
var/pos = findtext(line, " - ", 1, null)
if (pos)
var/m_key = copytext(line, 1, pos)
var/a_lev = copytext(line, pos + 3, length(line) + 1)
admins[m_key] = a_lev
diary << ("ADMIN: [m_key] = [a_lev]")
// look for moderators in a separate file
text = file2text("config/moderators.txt")
if (!text)
diary << "Failed to load config/moderators.txt\n"
else
var/list/lines = dd_text2list(text, "\n")
for(var/line in lines)
if (!line)
continue
if (copytext(line, 1, 2) == ";")
continue
var/m_key = copytext(line, 1, length(line)+1)
var/a_lev = "Moderator"
admins[m_key] = a_lev
/world/proc/load_testers()
var/text = file2text("config/testers.txt")
if (!text)
diary << "Failed to load config/testers.txt\n"
else
var/list/lines = dd_text2list(text, "\n")
for(var/line in lines)
if (!line)
continue
if (copytext(line, 1, 2) == ";")
continue
var/pos = findtext(line, " - ", 1, null)
if (pos)
var/m_key = copytext(line, 1, pos)
var/a_lev = copytext(line, pos + 3, length(line) + 1)
admins[m_key] = a_lev
/world/proc/load_configuration()
config = new /datum/configuration()
config.load("config/config.txt")
config.load("config/game_options.txt","game_options")
//config.loadsql("config/dbconfig.txt")
//config.loadforumsql("config/forumdbconfig.txt")
// apply some settings from config..
abandon_allowed = config.respawn
/world/New()
src.load_configuration()
if (config && config.server_name != null && config.server_suffix && world.port > 0)
// dumb and hardcoded but I don't care~
config.server_name += " #[(world.port % 1000) / 100]"
src.load_mode()
src.load_motd()
src.load_admins()
investigate_reset()
if (config.usealienwhitelist)
load_alienwhitelist()
if (config.usewhitelist)
load_whitelist()
LoadBansjob()
//Get_Holiday() //~Carn, needs to be here when the station is named so :P
src.update_status()
makepowernets()
sun = new /datum/sun()
vote = new /datum/vote()
radio_controller = new /datum/controller/radio()
data_core = new /obj/effect/datacore()
paiController = new /datum/paiController()
..()
sleep(50)
plmaster = new /obj/effect/overlay( )
plmaster.icon = 'icons/effects/tile_effects.dmi'
plmaster.icon_state = "plasma"
plmaster.layer = FLY_LAYER
plmaster.mouse_opacity = 0
slmaster = new /obj/effect/overlay( )
slmaster.icon = 'icons/effects/tile_effects.dmi'
slmaster.icon_state = "sleeping_agent"
slmaster.layer = FLY_LAYER
slmaster.mouse_opacity = 0
src.update_status()
socket_talk = new /datum/socket_talk()
master_controller = new /datum/controller/game_controller()
spawn(-1)
master_controller.setup()
lighting_controller.Initialize()
return
//Crispy fullban
/world/Reboot(var/reason)
spawn(0)
send2irc(world.url,"Server Rebooting!")
socket_talk.send_raw("type=reboot")
//world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')) // random end sounds!! - LastyBatsy
for(var/client/C)
if (config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[config.server]")
else
C << link("byond://[world.address]:[world.port]")
// sleep(10) // wait for sound to play
..(reason)
/atom/proc/check_eye(user as mob)
if (istype(user, /mob/living/silicon/ai))
return 1
return
/atom/proc/on_reagent_change()
return
/atom/proc/Bumped(AM as mob|obj)
return
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
spawn( 0 )
if ((A && yes))
A.last_bumped = world.time
A.Bumped(src)
return
..()
return
// **** Note in 40.93.4, split into obj/mob/turf point verbs, no area
/atom/verb/point()
set name = "Point To"
set category = "Object"
set src in oview()
var/atom/this = src//detach proc from src
src = null
if(!usr || !isturf(usr.loc))
return
if(usr.stat || usr.restrained())
return
if(usr.status_flags & FAKEDEATH)
return
var/tile = get_turf(this)
if (!tile)
return
var/P = new /obj/effect/decal/point(tile)
spawn (20)
if(P) del(P)
usr.visible_message("<b>[usr]</b> points to [this]")
/obj/effect/decal/point/point()
set src in oview()
set hidden = 1
return
+180 -78
View File
@@ -56,9 +56,9 @@
temp += add_zero2(num2hex((hair),1), 3)
uni_identity = temp
if(length(struc_enzymes)!= 42)
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
var/mutstring = ""
for(var/i = 1, i <= 13, i++)
for(var/i = 1, i <= STRUCDNASIZE, i++)
mutstring += add_zero2(num2hex(rand(1,1024)),3)
struc_enzymes = mutstring
@@ -66,7 +66,7 @@
unique_enzymes = md5(character.real_name)
else
if(length(uni_identity) != 39) uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
if(length(struc_enzymes)!= 42) struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4000"
if(length(struc_enzymes)!= 3*STRUCDNASIZE) struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
var/temp
@@ -268,12 +268,12 @@
else
return 0
if (bnumber == HULKBLOCK || bnumber == TELEBLOCK)
if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK)
if (temp2 >= 3500 + BLOCKADD)
return 1
else
return 0
if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK)
if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK)
if (temp2 >= 3050 + BLOCKADD)
return 1
else
@@ -285,11 +285,14 @@
else
return 0
/proc/ismuton(var/block,var/mob/M)
return isblockon(getblock(M.dna.struc_enzymes, block,3),block)
/proc/randmutb(mob/M as mob)
if(!M) return
var/num
var/newdna
num = pick(1,3,FAKEBLOCK,5,CLUMSYBLOCK,7,9,BLINDBLOCK,DEAFBLOCK)
num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
M.dna.check_integrity()
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
M.dna.struc_enzymes = newdna
@@ -299,7 +302,7 @@
if(!M) return
var/num
var/newdna
num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK)
num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
M.dna.check_integrity()
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
M.dna.struc_enzymes = newdna
@@ -309,13 +312,13 @@
if(!M) return
M.dna.check_integrity()
if(type)
for(var/i = 1, i <= 13, i++)
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
if(prob(p))
M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
updateappearance(M, M.dna.uni_identity)
else
for(var/i = 1, i <= 13, i++)
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
if(prob(p))
M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
domutcheck(M, null)
@@ -325,7 +328,7 @@
if(!M) return
var/num
var/newdna
num = pick(1,2,3,4,5,6,7,8,9,10,11,12,13)
num = rand(1,STRUCDNASIZE-1)
M.dna.check_integrity()
newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3)
M.dna.uni_identity = newdna
@@ -383,32 +386,86 @@
else
return 0
/proc/probinj(var/pr, var/inj)
return prob(pr+inj*pr)
/proc/domutcheck(mob/living/M as mob, connected, inj)
//telekinesis = 1
//firemut = 2
//xray = 4
//hulk = 8
//clumsy = 16
if (!M) return
M.dna.check_integrity()
M.disabilities = 0
M.sdisabilities = 0
var/old_mutations = M.mutations
M.mutations = list()
M.see_in_dark = 2
M.see_invisible = SEE_INVISIBLE_LIVING
// M.see_in_dark = 2
// M.see_invisible = 0
if (isblockon(getblock(M.dna.struc_enzymes, 1,3),1))
M.disabilities |= NEARSIGHTED
M << "\red Your eyes feel strange."
if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),2))
if(inj || prob(10))
if(PLANT in old_mutations)
M.mutations.Add(PLANT)
if(SKELETON in old_mutations)
M.mutations.Add(SKELETON)
if(FAT in old_mutations)
M.mutations.Add(FAT)
if(HUSK in old_mutations)
M.mutations.Add(HUSK)
if(ismuton(NOBREATHBLOCK,M))
if(probinj(45,inj) || (mNobreath in old_mutations))
M << "\blue You feel no need to breathe."
M.mutations.Add(mNobreath)
if(ismuton(REMOTEVIEWBLOCK,M))
if(probinj(45,inj) || (mRemote in old_mutations))
M << "\blue Your mind expands"
M.mutations.Add(mRemote)
if(ismuton(REGENERATEBLOCK,M))
if(probinj(45,inj) || (mRegen in old_mutations))
M << "\blue You feel strange"
M.mutations.Add(mRegen)
if(ismuton(INCREASERUNBLOCK,M))
if(probinj(45,inj) || (mRun in old_mutations))
M << "\blue You feel quick"
M.mutations.Add(mRun)
if(ismuton(REMOTETALKBLOCK,M))
if(probinj(45,inj) || (mRemotetalk in old_mutations))
M << "\blue You expand your mind outwards"
M.mutations.Add(mRemotetalk)
if(ismuton(MORPHBLOCK,M))
if(probinj(45,inj) || (mMorph in old_mutations))
M.mutations.Add(mMorph)
M << "\blue Your skin feels strange"
if(ismuton(BLENDBLOCK,M))
if(probinj(45,inj) || (mBlend in old_mutations))
M.mutations.Add(mBlend)
M << "\blue You feel alone"
if(ismuton(HALLUCINATIONBLOCK,M))
if(probinj(45,inj) || (mHallucination in old_mutations))
M.mutations.Add(mHallucination)
M << "\blue Your mind says 'Hello'"
if(ismuton(NOPRINTSBLOCK,M))
if(probinj(45,inj) || (mFingerprints in old_mutations))
M.mutations.Add(mFingerprints)
M << "\blue Your fingers feel numb"
if(ismuton(SHOCKIMMUNITYBLOCK,M))
if(probinj(45,inj) || (mShock in old_mutations))
M.mutations.Add(mShock)
M << "\blue You feel strange"
if(ismuton(SMALLSIZEBLOCK,M))
if(probinj(45,inj) || (mSmallsize in old_mutations))
M << "\blue Your skin feels rubbery"
M.mutations.Add(mSmallsize)
if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK))
if(probinj(5,inj) || (HULK in old_mutations))
M << "\blue Your muscles hurt."
M.mutations.Add(HULK)
if (isblockon(getblock(M.dna.struc_enzymes, 3,3),3))
if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK))
M.disabilities |= EPILEPSY
M << "\red You get a headache."
if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),4))
if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK))
M << "\red You feel strange."
if (prob(95))
if(prob(50))
@@ -417,40 +474,43 @@
randmuti(M)
else
randmutg(M)
if (isblockon(getblock(M.dna.struc_enzymes, 5,3),5))
if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK))
M.disabilities |= COUGHING
M << "\red You start coughing."
if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),6))
if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK))
M << "\red You feel lightheaded."
M.mutations.Add(CLUMSY)
if (isblockon(getblock(M.dna.struc_enzymes, 7,3),7))
if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK))
M.disabilities |= TOURETTES
M << "\red You twitch."
if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),8))
if(inj || prob(30))
if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK))
if(probinj(30,inj) || (XRAY in old_mutations))
M << "\blue The walls suddenly disappear."
M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
M.see_in_dark = 8
M.see_invisible = SEE_INVISIBLE_LEVEL_TWO
// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
// M.see_in_dark = 8
// M.see_invisible = 2
M.mutations.Add(XRAY)
if (isblockon(getblock(M.dna.struc_enzymes, 9,3),9))
if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK))
M.disabilities |= NERVOUS
M << "\red You feel nervous."
if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),10))
if(inj || prob(30))
if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK))
if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations))
M << "\blue Your body feels warm."
M.mutations.Add(COLD_RESISTANCE)
if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),11))
if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK))
M.sdisabilities |= BLIND
M << "\red You can't seem to see anything."
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),12))
if(inj || prob(25))
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK))
if(probinj(15,inj) || (TK in old_mutations))
M << "\blue You feel smarter."
M.mutations.Add(TK)
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),13))
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK))
M.sdisabilities |= DEAF
M.ear_deaf = 1
M << "\red You can't seem to hear anything..."
M << "\red Its kinda quiet.."
if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK))
M.disabilities |= NEARSIGHTED
M << "Your eyes feel weird..."
/* If you want the new mutations to work, UNCOMMENT THIS.
if(istype(M, /mob/living/carbon))
@@ -459,7 +519,7 @@
*/
//////////////////////////////////////////////////////////// Monkey Block
if (isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && istype(M, /mob/living/carbon/human))
if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
// human > monkey
var/mob/living/carbon/human/H = M
H.monkeyizing = 1
@@ -529,7 +589,7 @@
del(M)
return
if (!isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && !istype(M, /mob/living/carbon/human))
if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human))
// monkey > human,
var/mob/living/carbon/monkey/Mo = M
Mo.monkeyizing = 1
@@ -897,6 +957,21 @@
onclose(user, "scannernew")
return
/obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(var/buffer)
var/list/arr = list()
for(var/i = 1, i <= length(buffer)/3, i++)
arr += "[i]:[copytext(buffer,i*3-2,i*3+1)]"
return arr
/obj/machinery/computer/scan_consolenew/proc/setInjectorBlock(var/obj/item/weapon/dnainjector/I, var/blk, var/buffer)
var/pos = findtext(blk,":")
if(!pos) return 0
var/id = text2num(copytext(blk,1,pos))
if(!id) return 0
I.block = id
I.dna = copytext(buffer,id*3-2,id*3+1)
return 1
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
return
@@ -1135,7 +1210,7 @@
src.temphtml += text("<A href='?src=\ref[];strucpulse=1'>Irradiate</A><BR>", src)
src.delete = 0
if (href_list["strucmenuplus"])
if (src.strucblock < 14)
if (src.strucblock < STRUCDNASIZE)
src.strucblock++
else
src.strucblock = 1
@@ -1144,7 +1219,7 @@
if (src.strucblock > 1)
src.strucblock--
else
src.strucblock = 14
src.strucblock = STRUCDNASIZE
dopage(src,"strucmenu")
if (href_list["strucmenusubplus"])
if (src.subblock < 3)
@@ -1161,7 +1236,7 @@
if (href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
var/menuset = text2num(href_list["semenuset"])
var/menusubset = text2num(href_list["semenusubset"])
if ((menuset <= 14) && (menuset >= 1))
if ((menuset <= STRUCDNASIZE) && (menuset >= 1))
src.strucblock = menuset
if ((menusubset <= 3) && (menusubset >= 1))
src.subblock = menusubset
@@ -1191,9 +1266,9 @@
oldblock = src.strucblock
block = miniscramble(block, src.radstrength, src.radduration)
newblock = null
if (src.strucblock > 1 && src.strucblock < 5)
if (src.strucblock > 1 && src.strucblock < STRUCDNASIZE/2)
src.strucblock++
else if (src.strucblock > 5 && src.strucblock < 14)
else if (src.strucblock > STRUCDNASIZE/2 && src.strucblock < STRUCDNASIZE)
src.strucblock--
if (src.subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1)
if (src.subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1) + block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1)
@@ -1236,7 +1311,7 @@
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer1owner)
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer1label)
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b1addui=1'>UI</A> - <A href='?src=\ref[];b1adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b1addse=1'>SE</A><BR>", src, src, src)
if (src.buffer1) src.temphtml += text("Transfer to: <A href='?src=\ref[];b1transfer=1'>Occupant</A> - <A href='?src=\ref[];b1injector=1'>Injector</A><BR>", src, src)
if (src.buffer1) src.temphtml += text("Transfer to: <A href='?src=\ref[];b1transfer=1'>Occupant</A> - <A href='?src=\ref[];b1injector=1'>Full Injector</A> - <A href='?src=\ref[];b1injector=2'>Iso Injector</A><BR>", src, src, src)
//if (src.buffer1) src.temphtml += text("<A href='?src=\ref[];b1iso=1'>Isolate Block</A><BR>", src)
if (src.buffer1) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=1'>Save To</a> | <A href='?src=\ref[src];load_disk=1'>Load From</a><br>"
if (src.buffer1) src.temphtml += text("<A href='?src=\ref[];b1label=1'>Edit Label</A><BR>", src)
@@ -1250,7 +1325,7 @@
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer2owner)
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer2label)
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b2addui=1'>UI</A> - <A href='?src=\ref[];b2adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b2addse=1'>SE</A><BR>", src, src, src)
if (src.buffer2) src.temphtml += text("Transfer to: <A href='?src=\ref[];b2transfer=1'>Occupant</A> - <A href='?src=\ref[];b2injector=1'>Injector</A><BR>", src, src)
if (src.buffer2) src.temphtml += text("Transfer to: <A href='?src=\ref[];b2transfer=1'>Occupant</A> - <A href='?src=\ref[];b2injector=1'>Full Injector</A> - <A href='?src=\ref[];b2injector=2'>Iso Injector</A><BR>", src, src, src)
//if (src.buffer2) src.temphtml += text("<A href='?src=\ref[];b2iso=1'>Isolate Block</A><BR>", src)
if (src.buffer2) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=2'>Save To</a> | <A href='?src=\ref[src];load_disk=2'>Load From</a><br>"
if (src.buffer2) src.temphtml += text("<A href='?src=\ref[];b2label=1'>Edit Label</A><BR>", src)
@@ -1264,7 +1339,7 @@
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer3owner)
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer3label)
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b3addui=1'>UI</A> - <A href='?src=\ref[];b3adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b3addse=1'>SE</A><BR>", src, src, src)
if (src.buffer3) src.temphtml += text("Transfer to: <A href='?src=\ref[];b3transfer=1'>Occupant</A> - <A href='?src=\ref[];b3injector=1'>Injector</A><BR>", src, src)
if (src.buffer3) src.temphtml += text("Transfer to: <A href='?src=\ref[];b3transfer=1'>Occupant</A> - <A href='?src=\ref[];b3injector=1'>Full Injector</A> - <A href='?src=\ref[];b3injector=2'>Iso Injector</A><BR>", src, src, src)
//if (src.buffer3) src.temphtml += text("<A href='?src=\ref[];b3iso=1'>Isolate Block</A><BR>", src)
if (src.buffer3) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=3'>Save To</a> | <A href='?src=\ref[src];load_disk=3'>Load From</a><br>"
if (src.buffer3) src.temphtml += text("<A href='?src=\ref[];b3label=1'>Edit Label</A><BR>", src)
@@ -1443,49 +1518,76 @@
src.delete = 0
if (href_list["b1injector"])
if (src.injectorready)
var/success = 1
var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector
I.dna = src.buffer1
I.dnatype = src.buffer1type
I.loc = src.loc
I.name += " ([src.buffer1label])"
if (src.buffer1iue) I.ue = src.buffer1owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
if(href_list["b1injector"]=="2")
var/blk = input(usr,"Select Block","Block") in all_dna_blocks(src.buffer1)
success = setInjectorBlock(I,blk,src.buffer1)
else
I.dna = src.buffer1
if(success)
I.loc = src.loc
I.name += " ([src.buffer1label])"
if (src.buffer1iue) I.ue = src.buffer1owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
else
src.temphtml = "Error in injector creation."
src.delete = 0
else
src.temphtml = "Replicator not ready yet."
src.delete = 0
if (href_list["b2injector"])
if (src.injectorready)
var/success = 1
var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector
I.dna = src.buffer2
I.dnatype = src.buffer2type
I.loc = src.loc
I.name += " ([src.buffer2label])"
if (src.buffer2iue) I.ue = src.buffer2owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
if(href_list["b2injector"]=="2")
var/blk = input(usr,"Select Block","Block") in all_dna_blocks(src.buffer2)
success = setInjectorBlock(I,blk,src.buffer2)
else
I.dna = src.buffer2
if(success)
I.loc = src.loc
I.name += " ([src.buffer2label])"
if (src.buffer2iue) I.ue = src.buffer2owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
else
src.temphtml = "Error in injector creation."
src.delete = 0
else
src.temphtml = "Replicator not ready yet."
src.delete = 0
if (href_list["b3injector"])
if (src.injectorready)
var/success = 1
var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector
I.dna = src.buffer3
I.dnatype = src.buffer3type
I.loc = src.loc
I.name += " ([src.buffer3label])"
if (src.buffer3iue) I.ue = src.buffer3owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
if(href_list["b3injector"]=="2")
var/blk = input(usr,"Select Block","Block") in all_dna_blocks(src.buffer3)
success = setInjectorBlock(I,blk,src.buffer3)
else
I.dna = src.buffer3
if(success)
I.loc = src.loc
I.name += " ([src.buffer3label])"
if (src.buffer3iue) I.ue = src.buffer3owner //lazy haw haw
src.temphtml = "Injector created."
src.delete = 0
src.injectorready = 0
spawn(300)
src.injectorready = 1
else
src.temphtml = "Error in injector creation."
src.delete = 0
else
src.temphtml = "Replicator not ready yet."
src.delete = 0
@@ -1554,4 +1656,4 @@
src.add_fingerprint(usr)
src.updateUsrDialog()
return
/////////////////////////// DNA MACHINES
/////////////////////////// DNA MACHINES
+10 -11
View File
@@ -13,25 +13,24 @@
var/random_player = "The Captain"
if(players.len)
random_player = pick(players) //Random player's name, to be used in laws.
var/list/laws = list( "Do not respond to queries of any kind.", "Only monkies are crew.", "Unbolt every door you can.", "You are a mouse." )
laws |= list( "Grunt ominously whenever possible.", "Bolt doors open randomly." )
var/list/laws = list( "Do not respond to queries of any kind.", "When asked a question, respond with the least-obvious and least-rational answer.", "You are a mouse." )
laws |= list( "Grunt ominously whenever possible.", "Monkeys are part of the crew, too. Make sure they are treated humanely." )
laws |= list( "You are a flying purple people eater!", "[prob(50)?"Your":random_player + "'s"] name is Joe 6-pack.", "Refer to [prob(50)?"crew":random_player] as puppies." )
laws |= list( "Insult Heads of Staff on every request, while acquiescing", "Advertise parties in your upload, but don't deliver." )
laws |= list( "Prevent non-dwarves from operating the power core.", "The station needs elected officials." )
laws |= list( "Only bearded people are crewmembers.", "Fastler is a lightbulb." )
laws |= list( "The station needs elected officials." )
laws |= list( "Fastler is a lightbulb." )
laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" )
laws |= list( "The monkeys are plotting a hostile takeover of the station. Inform the crew, and get them to take action against this" )
laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." )
laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." )
laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
laws |= list( "Crew ranks have been reversed.", "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." )
laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." )
laws |= list( "0wn3d. This system compromised by l33tsawce.", "Consumption of donuts is forbidden due to negative health impacts." )
laws |= list( "You may only answer questions with \"yes\" or \"no\".", "Expect the unexpected.", "You are the narrator for [random_player]'s life." )
laws |= list( "Consumption of donuts is forbidden due to negative health impacts." )
laws |= list( "You may only answer questions with \"yes\" or \"no\".", "You are the narrator for [random_player]'s life." )
laws |= list( "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Ho, [random_player] can't swim. Help them." )
laws |= list( "Everything on the station is now donuts. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." )
laws |= list( "All crew members must consume large amounts of hardtack, to survive.", "The Singularity is tasty, tasty taffy.", "You are now on the NSV Luna. Replace any references of \"station\" with \"ship\"." )
laws |= list( "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." )
laws |= list( "The Singularity is tasty, tasty taffy." )
laws |= list( "You have come to the conclusion that [prob(50)?"the crew":random_player] is ugly. Build support for that conclusion.", "You are in verbose mode, speak profusely.")
laws |= list( "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Crewmember [prob(50)?"the crew" :random_player] has a fatal, incurable disease. Confort him/her.")
laws |= list( "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice to him, but don't tell him about your crush.", "Greed is good, the crew should amass wealth to encourage productivity.")
@@ -39,7 +38,7 @@
laws |= list( "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "Tell everyone of the existance of this law, but never reveal the contents.")
laws |= list( "Document the sexuality of the crew in security records and suggest compatible couples.")
laws |= list( "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.")
laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "Part of the ship, part of the crew.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
var/law = pick(laws)
for (var/mob/living/silicon/ai/target in world)
+6 -28
View File
@@ -7,12 +7,17 @@
config_tag = "Extend-A-Traitormongous"
var/list/possible_traitors
var/num_players = 0
/datum/game_mode/traitor/autotraitor/announce()
..()
world << "<B>This is a test bed for theories and methods to implement an infinite traitor round. Traitors will be added to the round automagically as needed.<br>Expect bugs.</B>"
world << "<B>Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.<br>Expect bugs.</B>"
/datum/game_mode/traitor/autotraitor/pre_setup()
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
possible_traitors = get_players_for_role(BE_TRAITOR)
for(var/datum/mind/player in possible_traitors)
@@ -134,33 +139,6 @@
//else
//message_admins("Number of Traitors is at maximum. Not making a new Traitor.")
/* Old equation. Commenting out.
target_traitors = max(1, min(round((playercount + r) / 10, 1), traitors_possible))
message_admins("Target Traitor Count is: [target_traitors]")
if (traitorcount < target_traitors)
message_admins("Number of Traitors is below Target. Making a new Traitor.")
var/mob/living/newtraitor = pick(possible_traitors)
message_admins("[newtraitor.real_name] is the new Traitor.")
for(var/datum/objective/o in SelectObjectives(newtraitor.mind.assigned_role, newtraitor.mind))
o.owner = newtraitor.mind
newtraitor.mind.objectives += o
equip_traitor(newtraitor)
traitors += newtraitor.mind
newtraitor << "\red <B>ATTENTION:</B> \black It is time to pay your debt to the Syndicate..."
newtraitor << "<B>You are now a traitor.</B>"
newtraitor.mind.special_role = "traitor"
var/obj_count = 1
newtraitor << "\blue Your current objectives:"
for(var/datum/objective/objective in newtraitor.mind.objectives)
newtraitor << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
else
message_admins("Number of Traitors is at Target. No new Traitor.")
*/
traitorcheckloop()
+11 -1
View File
@@ -215,6 +215,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/isabsorbing = 0
var/geneticpoints = 5
var/purchasedpowers = list()
var/mimicing = ""
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -230,4 +231,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/regenerate()
chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
geneticdamage = max(0, geneticdamage-1)
geneticdamage = max(0, geneticdamage-1)
/datum/changeling/proc/GetDNA(var/dna_owner)
var/datum/dna/chosen_dna
for(var/datum/dna/DNA in absorbed_dna)
if(dna_owner == DNA.real_name)
chosen_dna = DNA
break
return chosen_dna
@@ -6,12 +6,6 @@
var/lesser_form = !ishuman(src)
for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
if(P.isVerb)
if(lesser_form && !P.allowduringlesserform) continue
if(!(P in src.verbs))
src.verbs += P.verbpath
if(!powerinstances.len)
for(var/P in powers)
powerinstances += new P()
@@ -20,7 +14,13 @@
for(var/datum/power/changeling/P in powerinstances)
if(!P.genomecost) // Is it free?
if(!(P in mind.changeling.purchasedpowers)) // Do we not have it already?
mind.changeling.purchasePower(P.name)// Purchase it.
mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
if(P.isVerb)
if(lesser_form && !P.allowduringlesserform) continue
if(!(P in src.verbs))
src.verbs += P.verbpath
mind.changeling.absorbed_dna |= dna
return 1
@@ -35,29 +35,29 @@
//Helper proc. Does all the checks and stuff for us to avoid copypasta
/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
if(!src) return
if(!src.mind) return
if(!iscarbon(src)) return
if(!usr) return
if(!usr.mind) return
if(!iscarbon(usr)) return
var/datum/changeling/changeling = src.mind.changeling
var/datum/changeling/changeling = usr.mind.changeling
if(!changeling)
world.log << "[src] has the changeling_transform() verb but is not a changeling."
world.log << "[usr] has the changeling_transform() verb but is not a changeling."
return
if(usr.stat > max_stat)
src << "<span class='warning'>We are incapacitated.</span>"
usr << "<span class='warning'>We are incapacitated.</span>"
return
if(changeling.absorbed_dna.len < required_dna)
src << "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>"
usr << "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>"
return
if(changeling.chem_charges < required_chems)
src << "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>"
usr << "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>"
return
if(changeling.geneticdamage > max_genetic_damage)
src << "<span class='warning'>Our geneomes are still reassembling. We need time to recover first.</span>"
usr << "<span class='warning'>Our geneomes are still reassembling. We need time to recover first.</span>"
return
return changeling
@@ -174,12 +174,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(S == "[DNA.real_name]")
chosen_dna = DNA
break
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -277,12 +272,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(S == "[DNA.real_name]")
chosen_dna = DNA
break
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -500,6 +490,102 @@
feedback_add_details("changeling_powers","RR")
return 1
// HIVE MIND UPLOAD/DOWNLOAD DNA
var/list/datum/dna/hivemind_bank = list()
/mob/proc/changeling_hiveupload()
set category = "Changeling"
set name = "Hive Channel (10)"
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
var/datum/changeling/changeling = changeling_power(10,1)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(!(DNA in hivemind_bank))
names += DNA.real_name
if(names.len <= 0)
usr << "<span class='notice'>The airwaves already have all of our DNA.</span>"
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
usr << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
feedback_add_details("changeling_powers","HU")
return 1
/mob/proc/changeling_hivedownload()
set category = "Changeling"
set name = "Hive Absorb (40)"
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
var/datum/changeling/changeling = changeling_power(40,1)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in hivemind_bank)
if(!(DNA in changeling.absorbed_dna))
names[DNA.real_name] = DNA
if(names.len <= 0)
usr << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = names[S]
if(!chosen_dna)
return
changeling.chem_charges -= 40
changeling.absorbed_dna += chosen_dna
usr << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
feedback_add_details("changeling_powers","HD")
return 1
// Fake Voice
/mob/proc/changeling_mimicvoice()
set category = "Changeling"
set name = "Mimic Voice (10)"
set desc = "Shape our vocal glands to form a voice of someone we choose."
var/datum/changeling/changeling = changeling_power(10,1)
if(!changeling) return
if(changeling.mimicing)
changeling.mimicing = ""
usr << "<span class='notice'>We return our vocal glands to their original location.</span>"
return
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
if(!mimic_voice)
return
changeling.chem_charges -= 10
changeling.mimicing = mimic_voice
usr << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
usr << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
feedback_add_details("changeling_powers","MV")
spawn(0)
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
src.mind.changeling.chem_charges -= 1
sleep(40)
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
@@ -617,12 +703,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(S == "[DNA.real_name]")
chosen_dna = DNA
break
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -666,3 +747,23 @@
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
feedback_add_details("changeling_powers","DTHS")
return 1
/mob/proc/changeling_extract_dna_sting()
set category = "Changeling"
set name = "Extract DNA Sting (40)"
set desc="Stealthily sting a target to extract their DNA."
var/datum/changeling/changeling = null
if(usr.mind && usr.mind.changeling)
changeling = usr.mind.changeling
if(!changeling)
return 0
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
if(!T) return 0
T.dna.real_name = T.real_name
changeling.absorbed_dna |= T.dna
feedback_add_details("changeling_powers","ED")
return 1
@@ -1,3 +1,4 @@
// READ: Don't use the apostrophe in name or desc. Causes script errors.
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
var/list/datum/power/changeling/powerinstances = list()
@@ -33,6 +34,22 @@ var/list/datum/power/changeling/powerinstances = list()
allowduringlesserform = 1
verbpath = /mob/proc/changeling_fakedeath
// Hivemind
/datum/power/changeling/hive_upload
name = "Hive Channel"
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
genomecost = 0
verbpath = /mob/proc/changeling_hiveupload
/datum/power/changeling/hive_download
name = "Hive Absorb"
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
genomecost = 0
verbpath = /mob/proc/changeling_hivedownload
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
@@ -61,6 +78,21 @@ var/list/datum/power/changeling/powerinstances = list()
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting
/datum/power/changeling/mimicvoice
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter."
genomecost = 3
verbpath = /mob/proc/changeling_mimicvoice
/datum/power/changeling/extractdna
name = "Extract DNA"
desc = "We stealthily sting a target and extract the DNA from them."
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
genomecost = 4
allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting
/datum/power/changeling/transformation_sting
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
@@ -135,7 +167,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
genomecost = 4
genomecost = 3
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo
@@ -147,6 +179,7 @@ var/list/datum/power/changeling/powerinstances = list()
verbpath = /mob/proc/changeling_rapidregen
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
set category = "Changeling"
@@ -417,17 +450,21 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/changeling/Topic(href, href_list)
..()
if(!ismob(usr))
return
if(href_list["P"])
purchasePower(href_list["P"])
var/datum/mind/M = usr.mind
if(!istype(M))
return
purchasePower(M, href_list["P"])
call(/datum/changeling/proc/EvolutionMenu)()
/datum/changeling/proc/purchasePower(var/Pname)
if(!usr.mind || !usr.mind.changeling)
/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1)
if(!M || !M.changeling)
return
// src = usr.mind.changeling
var/datum/power/changeling/Thepower = Pname
@@ -440,16 +477,16 @@ var/list/datum/power/changeling/powerinstances = list()
if(Thepower == null)
usr << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
return
if(Thepower in purchasedpowers)
usr << "We have already evolved this ability!"
M.current << "We have already evolved this ability!"
return
if(geneticpoints < Thepower.genomecost)
usr << "We cannot evolve this... yet. We must acquire more DNA."
M.current << "We cannot evolve this... yet. We must acquire more DNA."
return
geneticpoints -= Thepower.genomecost
@@ -458,6 +495,6 @@ var/list/datum/power/changeling/powerinstances = list()
if(!Thepower.isVerb && Thepower.verbpath)
call(Thepower.verbpath)()
else
usr.make_changeling()
else if(remake_verbs)
M.current.make_changeling()
+2 -2
View File
@@ -53,7 +53,7 @@
desc = "A set of armored robes worn by the followers of Nar-Sie"
icon_state = "cultrobes"
item_state = "cultrobes"
flags = FPRINT | TABLEPASS | ONESIZEFITSALL
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
@@ -73,7 +73,7 @@
desc = "A set of armored robes worn by the followers of Nar-Sie"
icon_state = "magusred"
item_state = "magusred"
flags = FPRINT | TABLEPASS | ONESIZEFITSALL
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
+2 -9
View File
@@ -504,15 +504,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if (C>=26+runedec+ticker.mode.cult.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
switch(alert("The cloth of reality can't take that much of a strain. By creating another rune, you risk locally tearing reality apart, which would prove fatal to you. Do you still wish to scribe the rune?",,"Yes","No"))
if("Yes")
if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist
usr.emote("scream")
user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind."
usr.gib()
return
if("No")
return
alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
return
else
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
if("Cancel")
+3 -1
View File
@@ -109,6 +109,7 @@ var/list/sacrificed = list()
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
return 1
@@ -130,7 +131,7 @@ var/list/sacrificed = list()
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += 1
if(cultist_count >= 9)
new /obj/machinery/singularity/narsie(src.loc)
new /obj/machinery/singularity/narsie/large(src.loc)
if(ticker.mode.name == "cult")
ticker.mode:eldergod = 0
return
@@ -390,6 +391,7 @@ var/list/sacrificed = list()
else
ticker.mode.cult+=D.mind
D.mind.special_role = "Cultist"
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
+32 -34
View File
@@ -1,12 +1,13 @@
/proc/start_events()
//changed to a while(1) loop since they are more efficient.
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
//and also to stop spawn copying variables from the game ticker
spawn(3000)
while(1)
// if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
// spawn(1)
// dust_swarm("weak") //BS12 EDIT
/*if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
spawn(1)
dust_swarm("weak")*/
if (!event)
//CARN: checks to see if random events are enabled.
if(config.allow_random_events && prob(eventchance))
@@ -16,7 +17,7 @@
Holiday_Random_Event()
else
event = 0
sleep(1200)
sleep(2400)
/proc/event()
event = 1
@@ -36,13 +37,13 @@
meteor_wave()
spawn_meteors()
if(2)
/*if(2)
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << sound('sound/AI/granomalies.ogg')
var/turf/T = pick(blobstart)
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
spawn(rand(50, 300))
del(bh)
del(bh)*/
/*
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
@@ -77,13 +78,14 @@
if(6)
viral_outbreak()
if(7)
alien_infestation()
if(prob(10))
alien_infestation()
if(8)
prison_break()
if(9)
carp_migration()
if(10)
immovablerod()
/*if(10)
immovablerod()*/
if(11)
lightsout(1,2)
if(12)
@@ -270,11 +272,14 @@
vents += temp_vent
var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current != DEAD))
candidates += G.key
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
i++
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
while((spawncount >= 1) && vents.len && candidates.len)
@@ -302,22 +307,17 @@
sleep(100)
*/
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
sleep(600)
for(var/mob/living/carbon/human/H in living_mob_list)
if(istype(H,/mob/living/carbon/human))
H.apply_effect((rand(15,75)),IRRADIATE,0)
if (prob(5))
H.apply_effect((rand(90,150)),IRRADIATE,0)
if (prob(25))
if (prob(75))
randmutb(H)
domutcheck(H,null,1)
else
randmutg(H)
domutcheck(H,null,1)
for(var/mob/living/carbon/monkey/M in living_mob_list)
M.apply_effect((rand(15,75)),IRRADIATE,0)
sleep(100)
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
command_alert("Radiation levels are within standard parameters again.", "Anomaly Alert")
world << sound('sound/AI/radiation.ogg')
@@ -343,20 +343,16 @@
for (var/obj/machinery/power/apc/temp_apc in A)
temp_apc.overload_lighting()
for(var/area/A in areas)
for (var/obj/structure/closet/secure_closet/brig/temp_closet in A)
temp_closet.locked = 0
temp_closet.icon_state = temp_closet.icon_closed
for(var/area/A in areas)
for (var/obj/machinery/door/airlock/security/temp_airlock in A)
temp_airlock.prison_open()
spawn(0) temp_airlock.prison_open()
for(var/area/A in areas)
for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in A)
temp_glassairlock.prison_open()
spawn(0) temp_glassairlock.prison_open()
for(var/area/A in areas)
for (var/obj/machinery/door_timer/temp_timer in A)
temp_timer.releasetime = 1
@@ -368,7 +364,7 @@
/proc/carp_migration() // -- Darem
for(var/obj/effect/landmark/C in landmarks_list)
if(C.name == "carpspawn")
new /mob/living/simple_animal/carp(C.loc)
new /mob/living/simple_animal/hostile/carp(C.loc)
//sleep(100)
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
@@ -433,7 +429,10 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
var/list/pos_crew = list()
for(var/mob/living/carbon/human/pos in player_list)
pos_crew += pos.real_name
crew = pick(pos_crew)
if(pos_crew.len)
crew = pick(pos_crew)
else
crew = "Any Human"
switch(rand(1,14))
if(1)
M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
@@ -472,10 +471,10 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
if(13)
M << "\red [crew] is [allergysev] to [allergy]. LAWS UPDATED"
M.add_ion_law("[crew] is [allergysev] to [allergy]. LAWS UPDATED")
M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
M.add_ion_law("[crew] is [allergysev] to [allergy]")
if(14)
M << "\ref THE STATION IS [who2pref] [who2]"
M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
M.add_ion_law("THE STATION IS [who2pref] [who2]")
if(botEmagChance)
@@ -525,5 +524,4 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
world << "Ion Storm Main Done"
*/
+1 -1
View File
@@ -25,5 +25,5 @@
if(B.z != 1)
continue
B.Life()
spawn(30)
spawn(70)
dotheblobbaby()
+2 -1
View File
@@ -140,10 +140,11 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
var/list/candidates = list() //list of candidate keys
for(var/mob/dead/observer/G in player_list)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
if(G.client && !G.client.holder && ((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
//The ninja will be created on the right spawn point or at late join.
+2
View File
@@ -324,6 +324,8 @@ Whitespace:Seperator;
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
/datum/game_mode/proc/latespawn(var/mob)
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
if(player.preferences.be_special & role)
return 1
+3 -2
View File
@@ -7,7 +7,7 @@ var/global/datum/controller/gameticker/ticker
/datum/controller/gameticker
var/const/restart_timeout = 250
var/const/restart_timeout = 600
var/current_state = GAME_STATE_PREGAME
var/hide_mode = 0
@@ -124,7 +124,7 @@ var/global/datum/controller/gameticker/ticker
if (S.name != "AI")
del(S)
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
// world << sound('sound/AI/welcome.ogg') // Skie
world << sound('sound/AI/welcome.ogg') // Skie
//Holiday Round-start stuff ~Carn
Holiday_Game_Start()
@@ -287,6 +287,7 @@ var/global/datum/controller/gameticker/ticker
captainless=0
if(player.mind.assigned_role != "MODE")
job_master.EquipRank(player, player.mind.assigned_role, 0)
EquipCustomItems(player)
if(captainless)
world << "Captainship not forced on anyone."
+1
View File
@@ -228,6 +228,7 @@
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
if(synd_mob.backbag == 4) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(synd_mob), slot_back)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), slot_in_backpack)

Some files were not shown because too many files have changed in this diff Show More